Обсуждаем контроллеры компании Atmel.
Ответить

Re: ATMEGA 8 и ATMEGA168 совместимость?

Ср янв 29, 2025 14:17:26

shonty писал(а):Хотя если самому определить, то типа brbs (1<<bit_T) совсем неплохо выглядит
совсем плохо выглядит.
в этих командах (br..) указывается номер бита, а не число.
BOB51, SHOW - нет такой команды.

Re: ATMEGA 8 и ATMEGA168 совместимость?

Ср янв 29, 2025 14:30:28

Подправил уже - с мобилки с "ИИ подсказчиком" еще не то выскочить может.
Оно ж правильно ГАД ЖЕтами называется.
:twisted:

Re: ATMEGA 8 и ATMEGA168 совместимость?

Ср янв 29, 2025 14:54:48

shonty писал(а):Хотя если самому определить, то типа brbs (1<<bit_T) совсем неплохо выглядит
совсем плохо выглядит.
в этих командах (br..) указывается номер бита, а не число.

Код:
.equ bit_T =6
.equ bit_Z =0
в таком случае чем отличается
Код:
brbs (1<<bit_T), ...
brbs (1<<bit_Z), ...
от
Код:
brbs 6, ...
brbs 0, ...
?

Re: ATMEGA 8 и ATMEGA168 совместимость?

Ср янв 29, 2025 15:05:36

LDD Rd, Z+q ?

Да, что-то вроде этого. Вроде, с этой командой были какие-то проблемы. То ли не поддерживалась на каких-то камнях. Но, может, уже что-то путаю.
BOB51 писал(а):Чего ещё не хватает то?

Адресации относительно SP, например. Или неудачное решение в avr-gcc использовать в качестве zero то ли r0, то ли r1, в которые mul результат складывает. Но ладно, это уже придирки.

Re: ATMEGA 8 и ATMEGA168 совместимость?

Ср янв 29, 2025 15:08:19

COKPOWEHEU писал(а):Ну вот когда в чужом коде встречается 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...

И какую мнемонику поставит дизассемблер вместо машинного кода - ведомо только авторам дизассемблера.... Скорее всего, расширенную, именно, что б было легче читать.

Re: ATMEGA 8 и ATMEGA168 совместимость?

Ср янв 29, 2025 15:16:22

COKPOWEHEU
Фокусы со стеком у АВРок требуют весьма большого внимания.
Как и система прямого указания адреса (бит0) в отношении данных или команд (местоположения однобайтовых данных или адресов точек входа в программу).
Тут и карандашик с листочком бумаги не помешает и распечатки по системе команд/документации на МК (список разрешенных команд для АВРок обычно в даташите обязательно указывается)
8)
Just_Fluffy
Для пользователя ассемблера в принципе все равно, чем С=1 проверять для перехода -
BRBS C,k
BRCS k
BRLO k
но вот компилятор Си обрабатывает сначала текстовую строку - а там разница в мнемониках команд в зависимости от типа проверки условий может иметь значение - возможно в том и кроется "множественность"...
:roll:
Последний раз редактировалось BOB51 Ср янв 29, 2025 15:35:28, всего редактировалось 1 раз.

Re: ATMEGA 8 и ATMEGA168 совместимость?

Ср янв 29, 2025 15:17:34

Да, что-то вроде этого. Вроде, с этой командой были какие-то проблемы.

Такой инструкции нет у AVR с Reduced Core, там где только 16 регистров, но у них многих инструкций нет(MOVW/ADIW/MUL/LPM...).

Re: ATMEGA 8 и ATMEGA168 совместимость?

Ср янв 29, 2025 15:29:41

При том что обе компилятся в одну и ту же команду

Так я ж не от балды именно эти команды назвал :)
Just_Fluffy писал(а):А так команд там меньше сотни.

Все же 106, если скрипт не ошибся.
BOB51 писал(а):Как и система прямого указания адреса

О чем речь? Об адресации по байтам/словам во флеши что ли?

Re: ATMEGA 8 и ATMEGA168 совместимость?

Ср янв 29, 2025 15:38:19

Об их самых...
Таблица смещений к вектору к примеру 8 битовая или прямой 16 битовый указатель адреса.

Re: ATMEGA 8 и ATMEGA168 совместимость?

Ср янв 29, 2025 15:46:20

shonty писал(а):в таком случае чем отличается
тем, что в случае
brbs (1<<bit_T)
число равно 64, а не 6.

Re: ATMEGA 8 и ATMEGA168 совместимость?

Ср янв 29, 2025 15:54:43

COKPOWEHEU писал(а):Все же 106, если скрипт не ошибся.
131 команда
из них brbs, brbc, bset, bclr имеют по 8 синонимов каждая.
Итого 131 - 32 = 99.
Там еще есть повторяющиеся команды, CLR Reg совпадает с EOR Reg, Reg, SER Reg - это тот же LDI Reg, 0xFF
Т.е. уже 131-32-2 = 97...

Вроде еще что то было....

Re: ATMEGA 8 и ATMEGA168 совместимость?

Ср янв 29, 2025 16:15:42

Это вы про какой МК? А то у них же разные наборы команд. Скажем, elpm редко встречается, о существовании las, lat я узнал только из тестового дизасма.

Re: ATMEGA 8 и ATMEGA168 совместимость?

Ср янв 29, 2025 16:16:44

Starichok51 писал(а):тем, что в случае
brbs (1<<bit_T)
число равно 64, а не 6
да, это я погорячился :dont_know:

brbs bit_T, ...

Re: ATMEGA 8 и ATMEGA168 совместимость?

Ср янв 29, 2025 18:36:05

Just_Fluffy писал(а):131 команда
я у себя в справочнике вместе со синонимами насчитал 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:
хотя строго говоря, вторая пара не является синонимами, так как комплимент берется "внутри" процессора.

Re: ATMEGA 8 и ATMEGA168 совместимость?

Ср янв 29, 2025 20:18:07

Чуть улучшил свой скрипт, чтобы он сам же и файл создавал. Выглядит, конечно, все равно уродливо.
Код:
echo "" | awk '{for(i=0; i<256*256; i++)printf(".byte %i, %i\n", (i/256%256), (i%256))}' > a.S && avr-as a.S && avr-objdump a.out -D -m avr | tail -n +8 | sed 's/[^\t]*\t[^\t]*\t\([0-9a-z.]*\).*/\1/' | sort -u | tee cmds.txt | wc -l && rm a.out a.S
107

Заодно проверил ваши пары. sbr, cbr нет. ld, ldd единственный раз (ожидаемо). Интересно, что нет и brbc/brbs, вместо них "именованные" brne, brlo, ...
CBR и ANDI с комплиментом числа для CBR.
хотя строго говоря, вторая пара не является синонимами, так как комплимент берется "внутри" процессора.

Все же не внутри процессора, а внутри ассемблера. В процессоре хранится уже как andi с инвертированной маской.

Добавлено after 4 minutes 11 seconds:
Собственно, вот прямое доказательство andi / cbr:
Код:
$ echo -e "andi r16, ~(1<<2)\n cbr r16, (1<<2)" > a.S && avr-as a.S && avr-objdump a.out -S | tail -n 2 && rm a.S a.out
   0:   0b 7f           andi    r16, 0xFB       ; 251
   2:   0b 7f           andi    r16, 0xFB       ; 251

Re: ATMEGA 8 и ATMEGA168 совместимость?

Ср янв 29, 2025 20:29:50

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 бит отличается от аналогичного для пары Х.

1001 000d dddd 1100 LD R,X ddddd - reg 0..31
1001 000d dddd 1101 LD R,X+ ddddd - reg 0..31
1001 000d dddd 1110 LD R,-X ddddd - reg 0..31

1000 000d dddd 1000 LD R,Y ddddd - reg 0..31
1001 000d dddd 1001 LD R,Y+ ddddd - reg 0..31
1001 000d dddd 1010 LD R,-Y ddddd - reg 0..31

1000 000d dddd 0000 LD R,Z ddddd - reg 0..31
1001 000d dddd 0001 LD R,Z+ ddddd - reg 0..31
1001 000d dddd 0010 LD R,-Z ddddd - reg 0..31

Теоретически, эти команды могли бы сгруппироваться в одну машинную команду с 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 раз(а).

Re: ATMEGA 8 и ATMEGA168 совместимость?

Ср янв 29, 2025 20:57:26

мнемоники две - LD и LDD - со смещением.
поэтому твоя запись
10q0 qq0d dddd 1qqq LD R,(Y+q) ddddd - reg 0..31, qqqqqq - shift 0..63
неправильная. должно быть
10q0 qq0d dddd 1qqq LDD R,(Y+q) ddddd - reg 0..31, qqqqqq - shift 0..63

Re: ATMEGA 8 и ATMEGA168 совместимость?

Ср янв 29, 2025 21:58:44

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

Re: ATMEGA 8 и ATMEGA168 совместимость?

Чт янв 30, 2025 08:43:53

хорошо, согласен, что это получается одна команда.
то есть, если биты "пустые", то можно сказать, что прибавляется ноль.
а разница, видимо, только в работе компилятора.
для LD R0, Y он сразу загоняет нулевые биты на свои места. а процессор "тупо" прибавляет ноль.
а для LDD R0, Y+q загоняет число.

Re: ATMEGA 8 и ATMEGA168 совместимость?

Чт янв 30, 2025 09:52:53

Starichok51, я думаю, что все гораздо прозаичней - LDD заставляет компилятор воспринимать второй аргумент как два - регистровую пару плюс константу.
А может это просто дань удобству программиста, как и размноженные в 8 раз другие команды, базирующиеся на битах регистра SREG.
Ответить