Конвертировать программу сборки avr в hex - PullRequest
0 голосов
/ 11 апреля 2020

Мне нужно вручную преобразовать программу сборки avr в hex. Я знаю, что должен использовать код операции инструкции, но я не знаю, как его использовать. Например, синтаксис инструкции LDI:

LDI Rd,K

И код операции: 1110 kkkk dddd kkkk

Так что для этих kkkk я должен добавить их вместе? Если так, то результат будет больше 4 бит, так как я могу это сделать?

Это код:

LDI R16,HIGH

OUT SPH,R16

LDI R16,LOw

OUT SPL,R16

LDI r24,$2b

STS $0069,r2

Ответы [ 2 ]

2 голосов
/ 11 апреля 2020

Хорошо, давайте посмотрим, как это делается.

Сначала получите таблицу инструкций. Я нашел это первое попадание в простом веб-поиске по "таблице инструкций avr":

Руководство по набору инструкций AVR @ Microchip

LDI Rd, K с d в качестве номера регистра и K в качестве непосредственного значения, которое должно быть загружено в этот регистр, описано в главе 73 в кодировке 1110 KKKK dddd KKKK.

Нам необходимо найти значение букв. Ну, в документах об этом ничего не говорится. О-о, плохо документировано, нам нужен другой источник.

Один из других хитов выглядит многообещающим:

Набор инструкций AVR - все коды операций @ Lyons42

Всего один или два щелчка, и мы обнаруживаем, что старший полубайт (4-битная половина) K входит в первый байт кода операции. И нижний клев переходит во второй байт.

Например, LDI R23, 150 будет иметь d = 23 - 16 = 7 (минус 16, потому что поддерживаются только R16-R31, и поэтому 16 является смещением), и K = 150 = 0x96 , Код операции становится 1110 1001 0111 0110 или 0xE976.

Все последующие инструкции могут быть переведены таким же образом.

Примечание: гораздо более простым решением является использование ассемблера и посмотрите в его список. Но это может быть обманом. ; -)

1 голос
/ 11 апреля 2020

И код операции: 1110 кккк д ddd кккк

Значит, эти кккк я должен добавить их вместе?

Поскольку в документации не сказано, тогда правильный подход - использовать наиболее очевидное кодирование, то есть поместить младшие 4 бита 8-битного K в более поздний kkkk и старшие 4 бита в более раннем kkkk.

Однако вы можете (и должны) проверить это сами, используя ассемблер с этой инструкцией и константой (скажем, 0x5A), где вы можете сказать, что и где происходит, - либо посмотрите на вывод списка ассемблера с ассемблера, либо разберите его с помощью инструмента objdump или посмотрите на инструкцию машинного кода в отладчике.

В более широком смысле вам следует подумать о разработке экспериментов для поиска ответов на этот вопрос.


Похоже, что это может go другой порядок, младшие 4 бита в первом kkkk и старший порядок в последнем kkkk.

...