Преобразование BIN -->BCD

Дедам диванным.
Андроид решил, что “не” - лишнее. Постоянно лезет править.

Хм, а так даже смешнее :rofl:

… и гнет не пальцы!

он еще и ассемблер знает неплохо

Отлить в нержавеющем граните! За пределами этого комьюнити было бы сложно понять глубокий смысл данного выражения. Тут прям раскрылось и заиграло бликами на тонких гранях))

Мужики, а кто-нить пробовал

вот такой соус

Стоит брать на пробу?

Лучше сразу этот - https://ozon.ru/t/K6jy9Xo

Работает два раза - на входе и на выходе …

Брал я его, как по мне ни о чем. Тот случай, когда подходит фраза:
«Ни в голове, ни в ж#пе» :smiley:

Освежу тему.
Дизасм строчки кода:

if(++lcd_ram>48) lcd_ram=0;
000001F2  LDS R24,0x0149		Load direct from data space 
000001F4  SUBI R24,0xFF		Subtract immediate 
000001F5  STS 0x0149,R24		Store direct to data space 
000001F7  CPI R24,0x31		Compare with immediate 
--- c:\Users\te238s\Documents\Atmel Studio\7.0\XC8Application1\XC8Application1\Debug/.././lcd1602.c 
000001F8  BRCS PC+0x03		Branch if carry set 
--- No source file -------------------------------------------------------------
000001F9  STS 0x0149,R1		Store direct to data space 
000001FB  RET 		Subroutine return 

Во-первых, лишняя операция записи в память ещё не проверенной переменной. Сначала инкреминируем и записываем,а потом обнуляем и опять записываем.
Во-вторых, почему он увеличивает на единицу путём вычитания из переменной 255 ? Это так модно у компиляторов?))) Ведь есть команда INC Rd.

В AVR нет команд сложения и инкремента, их мнемоники являются псевдонимами команд вычитания, которые в системе команд есть. :slight_smile:

Upd. Хотя нет, инкремент есть. Сложения с непосредственной 8-битной константой нету. :slight_smile:

В книге по тинькам и мегам глянул. Инкремент есть и сложение тоже. Очевидно это детский косяк gcc или чего там. Так и не понял что такое XC8.

Если вы посмотрите таблицу команд в приложении 2, то можете обратить внимание, что из восьмибитовых арифметических операций с константой доступно только вычитание (subi, sbci), напрашивающейся операции сложения с константой нет.
Это не упущение автора при формировании выборочной таблицы, а действительная
особенность системы команд AVR. Ограничение легко обходится вычитанием отрицательного числа (например, команда subi temp,-10 прибавит 10 к temp)

(с) Ревич Ю.В. Практическое программирование микроконтроллеров Atmel AVR на языке ассемблера

Невежда, гуглить не пробовал?

Как написано - так и сделано.
Префиксный инкремент (++var) обязывает сначала сделать прибавление единицы, а уж потом применять оператор сравнения. С постфиксным инкрементом все ещё сложнее

Постфикс делает то же самое. Компилятору в данном случае пофиг, проверял и так тоже.
@Green неа, не пробовал)
Как и предполагал ранее, это микрочиповский компилятор. Возможно все эти лишние манипуляции из-за настроек по дебагу, кстати.

Нет. Он обязан сначала сохранить старое значение, потом сделать инкремент, а потом вернуть сохраненное как результат. Тут несколько больше манипуляций, с префиксом меньше.

Да я и сам, иной раз, ленюсь.

1 лайк

В общем, баловства ради сравню xc8 и gcc при разных оптимизациях. Интересно жутко.

Все ярые защитники Си напоминают коммунистов, которые втихаря крестятся в окопе перед атакой. Куда ж без знания ассемблера?

Два передергивания в одной фразе - несомненный признак опытного срачевода.

топим за разумную достаточность однако, обратного пока не доказано…