Да, что-то вроде этого. Вроде, с этой командой были какие-то проблемы. То ли не поддерживалась на каких-то камнях. Но, может, уже что-то путаю.
BOB51 писал(а):
Чего ещё не хватает то?
Адресации относительно SP, например. Или неудачное решение в avr-gcc использовать в качестве zero то ли r0, то ли r1, в которые mul результат складывает. Но ладно, это уже придирки.
Ну вот когда в чужом коде встречается brlo или brsh, это же понятнее, чем brbs 0 и brbc 0.
При том что обе компилятся в одну и ту же команду BRLO : 1111 00kk kkkk k000
BRBS : 1111 00kk kkkk ksss
тут kkkkkkk - смещение перехода -64...+63 sss номер бита SREG
Поэтому ж и говорю, что утверждение атмелов про 131 Powerful Instructions – Most Single-clock Cycle Execution - чисто фикция для удобства программистов, потому ж и весело. А так команд там меньше сотни.
Та же фигня с BSET и SEx, BCLR и CLx...
И какую мнемонику поставит дизассемблер вместо машинного кода - ведомо только авторам дизассемблера.... Скорее всего, расширенную, именно, что б было легче читать.
COKPOWEHEU Фокусы со стеком у АВРок требуют весьма большого внимания. Как и система прямого указания адреса (бит0) в отношении данных или команд (местоположения однобайтовых данных или адресов точек входа в программу). Тут и карандашик с листочком бумаги не помешает и распечатки по системе команд/документации на МК (список разрешенных команд для АВРок обычно в даташите обязательно указывается) Just_Fluffy Для пользователя ассемблера в принципе все равно, чем С=1 проверять для перехода - BRBS C,k BRCS k BRLO k но вот компилятор Си обрабатывает сначала текстовую строку - а там разница в мнемониках команд в зависимости от типа проверки условий может иметь значение - возможно в том и кроется "множественность"...
Последний раз редактировалось BOB51 Ср янв 29, 2025 15:35:28, всего редактировалось 1 раз.
131 команда из них brbs, brbc, bset, bclr имеют по 8 синонимов каждая. Итого 131 - 32 = 99. Там еще есть повторяющиеся команды, CLR Reg совпадает с EOR Reg, Reg, SER Reg - это тот же LDI Reg, 0xFF Т.е. уже 131-32-2 = 97...
я у себя в справочнике вместе со синонимами насчитал 116 строк. но там для команд LD (LDD) и ST (STD) 6 строк и фактически имеется по несколько команд: во-первых, для разных регистровых пар, во-вторых, с постинкрементом и с предекрементом и с прибавлением смещения. итого для X 6 команд и для Y и Z по 8 команд. но у меня почему-то в сумме получается 132 (110 + 6 + 8 + 8 = 132), а не 131.
Добавлено after 19 minutes 27 seconds: Just_Fluffy, я еще нашел синонимы: SBR и ORI, CBR и ANDI с комплиментом числа для CBR.
Добавлено after 3 minutes 27 seconds: хотя строго говоря, вторая пара не является синонимами, так как комплимент берется "внутри" процессора.
_________________ Мудрость приходит вместе с импотенцией... Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
COKPOWEHEU, Starichok51, команды я смотрю в описаниях МК в даташитах Тня2313 - 120 Powerful Instructions Тня85 - 120 Powerful Instructions мега8 - 130 Powerful Instructions мега32 - 131 Powerful Instructions мега328 - 131 Powerful Instructions мега128 - 133 Powerful Instructions
Starichok51, LD вообще интересные...
Вроде как 2 бита определяют регистровую пару, а другие 2 бита - определяют инкремент и декремент.... Но для регистровых пар Y и Z без инкремента/декремента еще 1 бит отличается от аналогичного для пары Х.
Теоретически, эти команды могли бы сгруппироваться в одну машинную команду с 2+2 битами параметров, но этот нолик все портит )))) Но, если посмотреть на команды чтения с константным смещением - то все становится на свои места. Когда этот бит равен нулю - это указание, что нужно из команды взять константу смещения... 10q0 qq0d dddd 1qqq LDD R,(Y+q) ddddd - reg 0..31, qqqqqq - shift 0..63 10q0 qq0d dddd 0qqq LDD R,(Z+q) ddddd - reg 0..31, qqqqqq - shift 0..63 1000 000d dddd 1000 LD R,Y ddddd - reg 0..31 1000 000d dddd 0000 LD R,Z ddddd - reg 0..31
Т.е. LD(LDD) группируется в две команды - чтение без смещения + 2 параметра: регистровая пара и флаги инкремента/декремента - чтение со смещением + 1 параметр: регистровая пара
А как их считать - как 1 коману, как 2 команды или как 6 или 8 - тут уже второй вопрос... Ведь тут обратная ситуация - мнемоника одна - LD(LDD), а машинная команда выходит развесистая.... Даже по сути две команды, ибо 2 младших бита трактуются по разному в зависимости от двенадцатого бита.
_________________ Белая и Пушистая
Последний раз редактировалось Just_Fluffy Чт янв 30, 2025 09:58:39, всего редактировалось 3 раз(а).
Starichok51, Да, ошиблась при копипасте. Но это только мнемоники. Оно даже в даташите описано как одна команда - и LDD указана в скобках: LD (LDD) – Load Indirect from Data Space to Register
Ну и LD R0, Y и LDD R0, Y+0 имеют один и тот же машинный код: 1000 0000 0000 1000 Т.е. это одна команда
Добавлено after 4 minutes 12 seconds: поправила LD на LDD
хорошо, согласен, что это получается одна команда. то есть, если биты "пустые", то можно сказать, что прибавляется ноль. а разница, видимо, только в работе компилятора. для LD R0, Y он сразу загоняет нулевые биты на свои места. а процессор "тупо" прибавляет ноль. а для LDD R0, Y+q загоняет число.
_________________ Мудрость приходит вместе с импотенцией... Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
Starichok51, я думаю, что все гораздо прозаичней - LDD заставляет компилятор воспринимать второй аргумент как два - регистровую пару плюс константу. А может это просто дань удобству программиста, как и размноженные в 8 раз другие команды, базирующиеся на битах регистра SREG.
Сейчас этот форум просматривают: Thinnnfor и гости: 160
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения