Дедам диванным.
Андроид решил, что “не” - лишнее. Постоянно лезет править.
Хм, а так даже смешнее
… и гнет не пальцы!
он еще и ассемблер знает неплохо
Отлить в нержавеющем граните! За пределами этого комьюнити было бы сложно понять глубокий смысл данного выражения. Тут прям раскрылось и заиграло бликами на тонких гранях))
Лучше сразу этот - https://ozon.ru/t/K6jy9Xo
Работает два раза - на входе и на выходе …
Брал я его, как по мне ни о чем. Тот случай, когда подходит фраза:
«Ни в голове, ни в ж#пе»
Освежу тему.
Дизасм строчки кода:
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 нет команд сложения и инкремента, их мнемоники являются псевдонимами команд вычитания, которые в системе команд есть.
Upd. Хотя нет, инкремент есть. Сложения с непосредственной 8-битной константой нету.
В книге по тинькам и мегам глянул. Инкремент есть и сложение тоже. Очевидно это детский косяк gcc или чего там. Так и не понял что такое XC8.
Если вы посмотрите таблицу команд в приложении 2, то можете обратить внимание, что из восьмибитовых арифметических операций с константой доступно только вычитание (subi, sbci), напрашивающейся операции сложения с константой нет.
Это не упущение автора при формировании выборочной таблицы, а действительная
особенность системы команд AVR. Ограничение легко обходится вычитанием отрицательного числа (например, команда subi temp,-10 прибавит 10 к temp)
(с) Ревич Ю.В. Практическое программирование микроконтроллеров Atmel AVR на языке ассемблера
Невежда, гуглить не пробовал?
Как написано - так и сделано.
Префиксный инкремент (++var) обязывает сначала сделать прибавление единицы, а уж потом применять оператор сравнения. С постфиксным инкрементом все ещё сложнее
Постфикс делает то же самое. Компилятору в данном случае пофиг, проверял и так тоже.
@Green неа, не пробовал)
Как и предполагал ранее, это микрочиповский компилятор. Возможно все эти лишние манипуляции из-за настроек по дебагу, кстати.
Нет. Он обязан сначала сохранить старое значение, потом сделать инкремент, а потом вернуть сохраненное как результат. Тут несколько больше манипуляций, с префиксом меньше.
Да я и сам, иной раз, ленюсь.
В общем, баловства ради сравню xc8 и gcc при разных оптимизациях. Интересно жутко.
Все ярые защитники Си напоминают коммунистов, которые втихаря крестятся в окопе перед атакой. Куда ж без знания ассемблера?
Два передергивания в одной фразе - несомненный признак опытного срачевода.
топим за разумную достаточность однако, обратного пока не доказано…