Набор команд Atmel AVR - Atmel AVR instruction set
Эта статья поднимает множество проблем. Пожалуйста помоги Улучши это или обсудите эти вопросы на страница обсуждения. (Узнайте, как и когда удалить эти сообщения-шаблоны) (Узнайте, как и когда удалить этот шаблон сообщения)
|
В Набор команд Atmel AVR это машинный язык для Atmel AVR, а модифицированная архитектура Гарварда 8 бит RISC одиночный чип микроконтроллер который был разработан Атмель в 1996 году. AVR был одним из первых семейств микроконтроллеров, в которых использовались встроенные микросхемы. флэш-память для хранения программ.
Регистры процессора
Имеется 32 8-битных регистра общего назначения, R0 – R31. Все арифметические и логические операции работают с этими регистрами; только инструкции загрузки и хранения обращаются к ОЗУ.
Ограниченное количество инструкций работает с 16-битными парами регистров. Регистр с меньшим номером пары содержит младшие значащие биты и должен быть четным. Последние три пары регистров используются как регистры-указатели для адресации памяти. Они известны как X (R27: R26), Y (R29: R28) и Z (R31: R30). Режимы адресации постинкремент и прединкремент поддерживаются всеми тремя. Y и Z также поддерживают шестибитное положительное смещение.
Команды, которые разрешают немедленное значение, ограничены регистрами R16 – R31 (8-битные операции) или парами регистров R25: R24 – R31: R30 (16-битные операции ADIW и SBIW). Некоторые варианты операции MUL ограничены восемью регистрами, с R16 по R23.
Регистры специального назначения
В дополнение к этим 32 регистрам общего назначения, ЦП имеет несколько регистров специального назначения:
- ПК: 16- или 22-битный счетчик программ
- SP: 8- или 16-битный указатель стека
- SREG: 8-битный регистр состояния
- RAMPX, RAMPY, RAMPZ, RAMPD и EIND: 8-битные сегментные регистры, которые добавляются к 16-битным адресам для формирования 24-битных адресов; доступен только в частях с большими адресными пространствами.
Биты состояния
Биты регистра состояния:
- C Перенести флаг. Это флаг заимствования при вычитании. В
INC
иDEC
инструкции делать нет изменить флаг переноса, чтобы их можно было использовать для циклических многобайтовых арифметических операций.[1] - Z Нулевой флаг. Устанавливается в 1, когда арифметический результат равен нулю.
- N Отрицательный флаг. Устанавливается в копию самого старшего бита арифметического результата.
- V Флаг переполнения. Устанавливается в случае переполнения до двух.
- S Знак флага. Уникальный для AVR, это всегда N⊕V и показывает верный признак сравнения.
- ЧАС Флаг полуперти. Это внутренний перенос из дополнений и используется для поддержки BCD арифметика.
- T Битовая копия. Этот бит используется в специальных инструкциях по загрузке и хранению битов.
- я Флаг прерывания. Устанавливается, когда разрешены прерывания.
Обращение
Доступны следующие адресные пространства:
- Регистры общего назначения адресуются по их номерам (0–31), хотя полное 5-битное число не сохраняется в командах, которые могут работать только с подмножеством этих регистров.
- Регистры ввода-вывода имеют выделенное 6-битное адресное пространство, нижняя половина которого является адресуемой по битам; некоторые части имеют регистры ввода-вывода за пределами этого адресного пространства, которые называются «расширенным вводом-выводом» и доступны только как ввод-вывод с отображением памяти в адресном пространстве данных.
- В адресном пространстве данных отображаются 32 регистра общего назначения, все регистры ввода-вывода (включая те, которые также доступны через адресное пространство ввода-вывода) и ОЗУ; к нему можно обращаться либо прямо, либо косвенно через регистры указателя X, Y и Z, при необходимости к ним добавляются RAMPX, RAMPY и RAMPZ соответственно.
- Программная память (вспышка ) имеет отдельное адресное пространство, адресованное как 16-битные слова для получения инструкций
- Для получения постоянных данных память программ адресуется побайтно через регистр указателя Z, при необходимости добавляемый RAMPZ.
- В EEPROM отображается в памяти в некоторых устройствах; в других случаях он не является адресуемым напрямую, а вместо этого доступен через регистры адреса, данных и управления вводом-выводом.
- Регистры общего назначения, регистр состояния и некоторые регистры ввода-вывода имеют битовую адресацию, причем бит 0 является наименее значимым, а бит 7 - наиболее значимым.
Первые 64 регистра ввода-вывода доступны как через ввод-вывод, так и через адресное пространство данных. Следовательно, у них два разных адреса. Обычно они записываются как от «0x00 (0x20)» до «0x3F (0x5F)», где первый элемент - это адрес ввода-вывода, а второй, в скобках, адрес данных.
К регистрам специального назначения ЦП, за исключением ПК, можно обращаться как к регистрам ввода-вывода. Некоторые регистры (RAMPX, RAMPY) могут отсутствовать на машинах с числом менее 64 KiB адресуемой памяти.
регистр | Адрес ввода / вывода | Адрес данных |
---|---|---|
SREG | 0x3F | 0x5F |
SP | 0x3E: 0x3D | 0x5E: 0x5D |
EIND | 0x3C | 0x5C |
РАМПЗ | 0x3B | 0x5B |
RAMPY | 0x3A | 0x5A |
RAMPX | 0x39 | 0x59 |
RAMPD | 0x38 | 0x58 |
Типичная карта памяти ATmega может выглядеть так:
Адрес данных | Адрес ввода / вывода | Содержание |
---|---|---|
0x0000 - 0x001F | Регистры R0 - R31 | |
0x0020 - 0x003F | 0x00 - 0x1F | Регистры ввода / вывода (с битовой адресацией) |
0x0040 - 0x005F | 0x20 - 0x3F | Регистры ввода / вывода (без битовой адресации) |
0x0060 - 0x00FF | Расширенные регистры ввода-вывода (только ввод-вывод с отображением в память) | |
0x0100 - RAMEND | Внутренняя SRAM |
где RAMEND - последний адрес RAM. В частях, в которых отсутствует расширенный ввод-вывод, ОЗУ будет начинаться с 0x0060.
Время обучения
Арифметические операции работают с регистрами R0 – R31, но не непосредственно с ОЗУ, и занимают один тактовый цикл, за исключением умножения и сложения по всему слову (ADIW и SBIW), которые занимают два цикла.
Доступ к ОЗУ и пространству ввода-вывода можно получить только путем копирования в регистры или из них. Косвенный доступ (включая необязательный постинкремент, прединкремент или постоянное смещение) возможен через регистры X, Y и Z. Все обращения к ОЗУ занимают два тактовых цикла. Перемещение между регистрами и вводом / выводом - один цикл. Перемещение восьми или шестнадцати битовых данных между регистрами или константой в регистр также составляет один цикл. Чтение памяти программ (LPM) занимает три цикла.
Список инструкций
Инструкции состоят из одного 16-битного слова, за исключением тех, которые включают 16-битный или 22-битный адрес, которые занимают два слова.
Есть два типа условных переходов: переход к адресу и пропуск. Условные переходы (BRxx) могут проверять флаг ALU и переходить по указанному адресу. Пропуск (SBxx) проверки произвольного бита в регистре или вводе / выводе и пропуск следующей инструкции, если проверка верна.
В следующих:
- Rd и Rr - регистры в диапазоне R0 – R31.
- Rdh и Rrh являются регистрами в диапазоне R16 – R31 (высокая половина).
- Rdq и Rrq - регистры в диапазоне R16 – R23 (одна четверть регистрового файла).
- Rp - это регистровая пара R25: R24, R27: R26 (X), R29: R28 (Y) или R31: R30 (Z)
- XYZ - это регистр указателя, либо X, либо Y, либо Z
- YZ - это регистр указателя, Y или Z
- s - номер бита в регистре состояния (0 = C, 1 = Z и т. д., см. список выше)
- b - номер бита в регистре общего назначения или в регистре ввода-вывода (0 = наименее значимый, 7 = наиболее значимый)
- K6 - это 6-битный немедленный беззнаковый константа (диапазон: 0–63)
- K8 - 8-битная непосредственная константа; поскольку он используется только в 8-битных операциях, его подпись не имеет значения
- IO5 - это 5-битный адрес ввода-вывода, охватывающий побитово-адресную часть адресного пространства ввода-вывода, то есть нижнюю половину (диапазон: 0–31)
- IO6 - это 6-битный адрес ввода-вывода, охватывающий все адресное пространство ввода-вывода (диапазон: 0–63).
- D16 - это 16-битный адрес данных, охватывающий 64KiB; в частях с пространством данных более 64 КБ, содержимое сегментного регистра RAMPD добавляется в начало
- P22 - это 22-битный адрес программы, покрывающий 222 16-битные слова (т.е. 8МиБ )
- S7 и S12 7-битные (соответственно 12-битные) подписанный смещения в единицах слов относительно адреса программы, хранящегося в программном счетчике
Арифметика | Бит и другие | Передача | Прыгать | Ответвляться | Вызов |
---|---|---|---|---|---|
ADD Rd, Rr ADC Rd, Rr ADIW Rp + 1: Rp, K6 SUB Rd, Rr SUBI Rdh, K8 SBC Rd, Rr SBCI Rdh, K8 SBIW Rp + 1: Rp, K6 INC Rd DEC Rd AND Rd, Rr ANDI Rdh , K8 OR Rd, Rr ORI Rdh, K8 OR Rd, Rr COM Rd NEG Rd CP Rd, Rr CPC Rd, Rr CPI Rdh, K8 SWAP Rd LSR Rd ROR Rd ASR Rd MUL Rd, Rr MULS Rdh, Rrh MULSU Rdq, Rrq FMUL Rdq, Rrq FMULS Rdq, Rrq FMULSU Rdq, Rrq | BSET s BCLR s SBI IO5, b CBI IO5, b BST Rd, b BLD Rd, b NOP BREAK SLEEP WDR | MOV Rd, Rr MOVW Rd + 1: Rd, Rr + 1: Rr IN Rd, IO6 OUT IO6, Rr PUSH Rr POP Rr LDI Rdh, K8 LDS Rd, D16 LD Rd, X LDD Rd, YZ + K6 LD Rd, - XYZ LD Rd, XYZ + STS D16, Rr ST X, Rr STD YZ + K6, Rr ST -XYZ, Rr ST XYZ +, Rr LPM LPM Rd, Z LPM Rd, Z + ELPM ELPM Rd, Z ELPM Rd, Z + SPM | RJMP S12 IJMP EIJMP JMP P22 | CPSE Rd, Rr SBRC Rr, b SBRS Rr, b SBIC IO5, b SBIS IO5, b BRBC s, S7 BRBS s, S7 | RCALL S12ICALL EICALL CALL P22 RET RETI |
Наследование набора инструкций
Не все инструкции выполняются во всех Atmel AVR контроллеры. Это случай инструкций, выполняющих умножение, расширенные нагрузки / переходы / вызовы, длинные переходы и управление мощностью.
Необязательные инструкции можно разделить на три категории:
- функции ядра процессора (вычислений), добавленные на более мощные ядра ЦП
- функции адресации памяти, добавленные на всех моделях с памятью, достаточной для их использования
- дополнительные функции, несколько периферийных устройств, которые могут присутствовать или отсутствовать на конкретной модели.
Хотя процессоры более высокого уровня, как правило, имеют как более мощные ядра, так и больше памяти, наличие одного не гарантирует наличия другого.
Инструкции основного процессора
Начиная с оригинального «классического» ядра, улучшения разбиты на следующие уровни, каждый из которых включает в себя все предыдущие:
- "Классическое" ядро имеет только форму с нулевым операндом
LPM
инструкция, которая эквивалентнаLPM r0, Z
. - «Классический плюс» добавляет
MOVW
инструкция для перемещения пар регистров и более общая форма инструкции LPM (LPM Rd, Z
иLPM Rd, Z +
), которые разрешают произвольный регистр назначения и автоинкремент Z-указателя. - "Расширенные" ядра добавляют инструкции умножения.
- Ядра XMEGA не добавляют новые инструкции как таковой, но внесите некоторые существенные изменения:
- Карта памяти реорганизована, устраняется отображение памяти файла регистров процессора (поэтому порты ввода-вывода начинаются с адреса 0 ОЗУ) и расширяется диапазон портов ввода-вывода. Теперь первый 4K - это регистры специальной функции, второй 4K - это флэш-память данных, а нормальная RAM начинается с 8K.
- Нет необходимости явно отключать прерывания перед настройкой регистров указателя стека (SPL и SPH); любая запись в SPL автоматически отключает прерывания на 4 тактовых цикла, чтобы дать время для обновления SPH.
- Другие многобайтовые регистры снабжены теневыми регистрами для включения атомный прочти и напиши. Когда читается младший байт, старшие байты копируются в теневые регистры, поэтому их последующее чтение производит снимок реестра на момент первого чтения. Записи в младшие байты буферизуются до тех пор, пока не будет записан самый старший байт, после чего весь многобайтовый регистр обновляется атомарно.
- Более поздние ядра XMEGA (в частности, модели B, C и AU, такие как ATxmega16A4U, но нет более ранние модели A, D и E, такие как ATxmega16D4) добавляют четыре атомных читать-изменять-писать инструкция: обмен (
XCH
), загрузка и установка, загрузка и очистка и загрузка и переключение. Это помогает координировать свои действия с прямой доступ к памяти периферийные устройства, в частности USB контроллер.
Менее производительны, чем у «классических» ядер ЦП, два подмножества: ядро «AVR1» и «крошечный AVR». Как ни странно, процессоры под брендом ATtiny имеют множество ядер, включая AVR1 (ATtiny11, ATtiny28), classic (ATtiny22, ATtiny26), classic + (ATtiny24) и AVRtiny (ATtiny20, ATtiny40).
Подмножество AVR1 не было популярным, и с 2000 года не было представлено никаких новых моделей. В нем отсутствует вся оперативная память, за исключением 32 регистров, отображаемых по адресам 0–31, и портов ввода / вывода по адресам 32–95. Стек заменяется трехуровневым аппаратным стеком, а ТОЛКАТЬ
и Поп
инструкции удаляются. Удаляются все 16-битные операции, как и IJMP
, Я ЗВОНЮ
, а также все режимы адресации загрузки и сохранения, кроме косвенной через Z.
Вторая, более успешная попытка подмножества набора команд AVR - это "крошечное" ядро AVR.
Наиболее значительным изменением является то, что ядро AVRtiny пропускает регистры R0 – R15. Регистры также не отображаются в памяти, с портами ввода-вывода от 0 до 63 и ОЗУ общего назначения, начинающимися с адреса 64. 16-разрядные арифметические операции (ADIW
, SBIW
) опускаются, как и загрузка / сохранение с режимами смещения адресации (Г + д
, Z + d
), но режимы адресации до и после приращения сохраняются. В LPM
инструкция опущена; вместо этого ПЗУ программы отображается в адресное пространство данных и может быть доступно с помощью обычных инструкций загрузки.
Наконец, ядро AVRtiny удаляет 2-слово СПД
и СТС
инструкции для прямой адресации ОЗУ, и вместо этого использует пространство кода операции, ранее назначенное для загрузки / сохранения с инструкциями смещения для нового 1-слова СПД
и СТС
инструкции, которые могут получить доступ к первым 128 ячейкам ОЗУ общего назначения, адресуются от 0x40 до 0xBF. (The В
и ИЗ
инструкции обеспечивают прямой доступ к пространству ввода-вывода от 0 до 0x3F.)
Инструкции по адресации памяти
Наименьшие ядра имеют ≤256 байтов адресного пространства данных (что означает ≤128 байтов ОЗУ после удаления портов ввода-вывода и других зарезервированных адресов) и ≤8192 байта (8 КиБ) программного ПЗУ. Они имеют только 8-битный указатель стека (в SPL) и поддерживают только 12-битные относительные инструкции перехода / вызова RJMP
/RCALL
. (Поскольку счетчик программы AVR считает 16-битные слова, а не байты, 12-битного смещения достаточно для адреса 213 байтов ПЗУ.)
Присутствуют дополнительные возможности адресации памяти, необходимые для доступа к доступным ресурсам:
- Модели с> 256 байтами адресного пространства данных (≥256 байтов ОЗУ) имеют 16-битный указатель стека, причем старшая половина находится в регистре SPH.
- В моделях с объемом ПЗУ> 8 КБ добавляется 2-слово (22 бита)
ПРЫГАТЬ
иВЫЗОВ
инструкции. (Некоторые ранние модели страдают ошибка если за инструкцией пропуска следует инструкция из 2 слов.) - Модели с объемом ПЗУ> 64 КБ добавляют
ELPM
инструкция и соответствующий регистр RAMPZ.LPM
инструкции расширения адреса ПЗУ в Z нулями;ELPM
инструкции добавляют регистр RAMPZ к старшим битам. Это не то же самое, что и более общийLPM
инструкция; существуют "классические" модели только с нулевым операндомELPM
(ATmega103 и at43usb320). Когда доступно автоматическое приращение (большинство моделей), он обновляет весь 24-битный адрес, включая RAMPZ. - (Редкие) модели с объемом ПЗУ> 128 КБ имеют 3-байтовый счетчик программ. Вызовы и возврат подпрограмм используют дополнительный байт пространства стека, есть новый регистр EIND для предоставления дополнительных старших битов для косвенных переходов и вызовов, а также есть новые расширенные инструкции
EIJMP
иEICALL
которые используют EIND: Z в качестве адреса назначения. (ПредыдущийIJMP
иЯ ЗВОНЮ
инструкции используют Z с расширенным нулем.) - (Редкие) модели с адресным пространством ОЗУ> 64 Кбайт расширяют пределы адресации 16-разрядной ОЗУ с помощью регистров RAMPX, RAMPY, RAMPZ и RAMPD. Они предоставляют дополнительные старшие биты для режимов адресации, которые используют пары регистров X, Y или Z соответственно, или инструкции прямой адресации.
СПД
/СТС
. В отличие от доступа к ПЗУ, здесь нет отдельных «расширенных» инструкций; вместо этого безоговорочно используются регистры RAMP.
Инструкции по дополнительным функциям
Три инструкции присутствуют только на моделях с соответствующим оборудованием.
SPM
для хранения во флэш-ПЗУ, присутствует только на процессорах с флэш-ПЗУ (большинство из них)ПЕРЕМЕНА
для вызова встроенного отладчика, опущен на некоторых небольших моделях без поддержки встроенного отладчикаDES
для выполнения Стандарт шифрования данных раундов, присутствует на моделях XMEGA с поддержкой ускорителя DES
Архитектуры, отличные от AVR1, именуются в соответствии с соглашениями avr-libc.[2]
Семья | Члены | Арифметика | ветви | Переводы | Bit-Wise |
---|---|---|---|---|---|
Минимальное ядро AVR1 |
|
|
|
|
|
Классическое ядро до 8K Program Space («AVR2») |
| новые инструкции:
| новые инструкции:
| новые инструкции:
| (Ничего нового) |
AVR2, с инструкциями MOVW и LPM («AVR2.5») |
| (Ничего нового) | новые инструкции:
| (Ничего нового) | (Ничего нового) |
Классическое ядро до 128 КБ ("AVR3") |
| (Ничего нового) | новые инструкции:
| новые инструкции:
| (Ничего нового) |
Расширенное ядро до 8 КБ ("AVR4") |
| новые инструкции:
| (Ничего нового) | новые инструкции:
| (Ничего нового) |
Расширенное ядро до 128 КБ ("AVR5", "AVR5.1") |
| (Ничего нового) | новая инструкция:
| (Ничего нового) | новые инструкции:
|
Расширенное ядро до 4 МБ («AVR5» и «AVR6») |
| (Ничего нового) | новые инструкции:
| (Ничего нового) | (Ничего нового) |
XMEGA Core ("avrxmega" 2-6) | Серия ATxmega | новые инструкции:
| (Ничего нового) | новые инструкции (из силикона второй ревизии - части AU, B, C)
| (Ничего нового) |
Уменьшенное ядро AVRtiny ("avrtiny10") |
| (Идентично минимальному ядру, за исключением уменьшенного набора регистров ЦП) | (Идентично классическому ядру до 8 КБ, за исключением уменьшенного набора регистров ЦП) | Идентично классическому ядру до 8K, за следующими исключениями:
| (Идентично расширенному ядру до 128 КБ, за исключением уменьшенного набора регистров ЦП) |
Кодировка инструкции
Назначения битов:
- rrrrr = Исходный регистр
- rrrr = Исходный регистр (R16 – R31)
- rrr = регистр источника (R16 – R23)
- RRRR = пара регистров источника (R1: R0 – R31: R30)
- ddddd = Регистр назначения
- dddd = Регистр назначения (R16 – R31)
- ddd = Регистр назначения (R16 – R23)
- DDDD = Пара регистров назначения (R1: R0 – R31: R30)
- pp = пара регистров, W, X, Y или Z
- y = бит пары регистров Y / Z (0 = Z, 1 = Y)
- u = FMUL (S (U)) со знаком 0 = со знаком или 1 = без знака
- s = бит сохранения / загрузки (0 = загрузка, 1 = сохранение)
- c = вызов / прыжок (0 = прыжок, 1 = вызов)
- cy = с переносом (0 = без переноса, 1 = с переносом)
- e = Расширить адрес косвенного перехода / вызова с помощью EIND (0 = 0: Z, 1 = EIND: Z)
- q = расширить адрес памяти программ с помощью RAMPZ (0 = 0: Z, 1 = RAMPZ: Z)
- aaaaaa = адрес пространства ввода-вывода
- aaaaa = адрес пространства ввода-вывода (только первые 32)
- bbb = номер бита (0–7)
- B = битовое значение (0 или 1)
- kkkk = 4-битная константа без знака (код операции DES)
- kkkkkk = 6-битная беззнаковая константа
- KKKKKKKK = 8-битная константа
Atmel AVR использует много разделенных полей, где биты не являются смежными в командном слове. Инструкции загрузки / сохранения со смещением являются наиболее ярким примером, когда 6-битное смещение разбивается на три части.
1 5 | 1 4 | 1 3 | 1 2 | 1 1 | 1 0 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | Инструкция |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | NOP |
0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | Д Д Д Д | R R R R | MOVW Rd, Rr Перемещение пары регистров | ||||||
0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | д д д д | r r r r | MULS Rd, Rr | ||||||
0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 0 | д д д | 0 | r r r | MULSU Rd, Rr | ||||
0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 0 | д д д | 1 | r r r | FMUL Rd, Rr | ||||
0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 1 | д д д | ты | r r r | FMULS (U) Rd, Rr | ||||
0 | 0 | код операции | р | д д д д д | r r r r | 2-операндные инструкции | ||||||||||
0 | 0 | 0 | c̅y̅ | 0 | 1 | р | д д д д д | r r r r | CPC / CP Rd, Rr | |||||||
0 | 0 | 0 | c̅y̅ | 1 | 0 | р | д д д д д | r r r r | SBC / SUB Rd, Rr | |||||||
0 | 0 | 0 | Сай | 1 | 1 | р | д д д д д | r r r r | ADD / ADC Rd, Rr (LSL / ROL Rd, когда Rd = Rr) | |||||||
0 | 0 | 0 | 1 | 0 | 0 | р | д д д д д | r r r r | CPSE Rd, Rr | |||||||
0 | 0 | 1 | 0 | 0 | 0 | р | д д д д д | r r r r | И Rd, Rr | |||||||
0 | 0 | 1 | 0 | 0 | 1 | р | д д д д д | r r r r | EOR Rd, Rr | |||||||
0 | 0 | 1 | 0 | 1 | 0 | р | д д д д д | r r r r | ИЛИ Rd, Rr | |||||||
0 | 0 | 1 | 0 | 1 | 1 | р | д д д д д | r r r r | MOV Rd, Rr | |||||||
0 | 0 | 1 | 1 | К К К К | д д д д | К К К К | ИПЦ Rd, тыс. | |||||||||
0 | 1 | opc | К К К К | д д д д | К К К К | Регистр-немедленные операции | ||||||||||
0 | 1 | 0 | c̅y̅ | К К К К | д д д д | К К К К | SBCI / SUBI Rd, K | |||||||||
0 | 1 | 1 | 0 | К К К К | д д д д | К К К К | ORI Rd, K SBR Rd, K | |||||||||
0 | 1 | 1 | 1 | К К К К | д д д д | К К К К | ANDI Rd, K CBR Rd, K | |||||||||
1 | 0 | k | 0 | k k | s | д д д д д | у | к к к | LDD / STD Rd через Z + k или Y + k | |||||||
1 | 0 | 0 | 1 | 0 | 0 | s | д д д д д | код операции | Загрузка / сохранение операций | |||||||
1 | 0 | 0 | 1 | 0 | 0 | s | д д д д д | 0 | 0 | 0 | 0 | LDS rd, i / STS i, rd | ||||
16-битный немедленный адрес SRAM i | ||||||||||||||||
1 | 0 | 0 | 1 | 0 | 0 | s | д д д д д | у | 0 | 0 | 1 | LD / ST Rd через Z + / Y + | ||||
1 | 0 | 0 | 1 | 0 | 0 | s | д д д д д | у | 0 | 1 | 0 | LD / ST Rd через −Z / −Y | ||||
1 | 0 | 0 | 1 | 0 | 0 | 0 | д д д д д | 0 | 1 | q | 0 | LPM / ELPM Rd, Z | ||||
1 | 0 | 0 | 1 | 0 | 0 | 0 | д д д д д | 0 | 1 | q | 1 | LPM / ELPM Rd, Z + | ||||
1 | 0 | 0 | 1 | 0 | 0 | 1 | д д д д д | 0 | 1 | 0 | 0 | XCH Z, Rd | ||||
1 | 0 | 0 | 1 | 0 | 0 | 1 | д д д д д | 0 | 1 | 0 | 1 | LAS Z, Rd | ||||
1 | 0 | 0 | 1 | 0 | 0 | 1 | д д д д д | 0 | 1 | 1 | 0 | LAC Z, Rd | ||||
1 | 0 | 0 | 1 | 0 | 0 | 1 | д д д д д | 0 | 1 | 1 | 1 | LAT Z, Rd | ||||
1 | 0 | 0 | 1 | 0 | 0 | s | д д д д д | 1 | 1 | 0 | 0 | LD / ST Rd через X | ||||
1 | 0 | 0 | 1 | 0 | 0 | s | д д д д д | 1 | 1 | 0 | 1 | LD / ST Rd через X + | ||||
1 | 0 | 0 | 1 | 0 | 0 | s | д д д д д | 1 | 1 | 1 | 0 | LD / ST Rd через −X | ||||
1 | 0 | 0 | 1 | 0 | 0 | s | д д д д д | 1 | 1 | 1 | 1 | POP / PUSH Rd | ||||
1 | 0 | 0 | 1 | 0 | 1 | 0 | д д д д д | 0 | код операции | Инструкции с одним операндом: | ||||||
1 | 0 | 0 | 1 | 0 | 1 | 0 | д д д д д | 0 | 0 | 0 | 0 | COM Rd | ||||
1 | 0 | 0 | 1 | 0 | 1 | 0 | д д д д д | 0 | 0 | 0 | 1 | NEG Rd | ||||
1 | 0 | 0 | 1 | 0 | 1 | 0 | д д д д д | 0 | 0 | 1 | 0 | SWAP Rd | ||||
1 | 0 | 0 | 1 | 0 | 1 | 0 | д д д д д | 0 | 0 | 1 | 1 | INC Rd | ||||
1 | 0 | 0 | 1 | 0 | 1 | 0 | д д д д д | 0 | 1 | 0 | 0 | (зарезервированный) | ||||
1 | 0 | 0 | 1 | 0 | 1 | 0 | д д д д д | 0 | 1 | 0 | 1 | ASR Rd | ||||
1 | 0 | 0 | 1 | 0 | 1 | 0 | д д д д д | 0 | 1 | 1 | 0 | ЛСР Роуд | ||||
1 | 0 | 0 | 1 | 0 | 1 | 0 | д д д д д | 0 | 1 | 1 | 1 | ROR Rd | ||||
1 | 0 | 0 | 1 | 0 | 1 | 0 | 0 | B̅ | б б б | 1 | 0 | 0 | 0 | Бит сброса / установки регистра состояния SEx / CLx | ||
1 | 0 | 0 | 1 | 0 | 1 | 0 | 1 | код операции | 1 | 0 | 0 | 0 | Инструкции с нулевым операндом | |||
1 | 0 | 0 | 1 | 0 | 1 | 0 | 1 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | RET |
1 | 0 | 0 | 1 | 0 | 1 | 0 | 1 | 0 | 0 | 0 | 1 | 1 | 0 | 0 | 0 | РЕТИ |
1 | 0 | 0 | 1 | 0 | 1 | 0 | 1 | 0 | 0 | 1 | Икс | 1 | 0 | 0 | 0 | (зарезервированный) |
1 | 0 | 0 | 1 | 0 | 1 | 0 | 1 | 0 | 1 | Икс | Икс | 1 | 0 | 0 | 0 | (зарезервированный) |
1 | 0 | 0 | 1 | 0 | 1 | 0 | 1 | 1 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | СПАТЬ |
1 | 0 | 0 | 1 | 0 | 1 | 0 | 1 | 1 | 0 | 0 | 1 | 1 | 0 | 0 | 0 | ПЕРЕМЕНА |
1 | 0 | 0 | 1 | 0 | 1 | 0 | 1 | 1 | 0 | 1 | 0 | 1 | 0 | 0 | 0 | WDR |
1 | 0 | 0 | 1 | 0 | 1 | 0 | 1 | 1 | 0 | 1 | 1 | 1 | 0 | 0 | 0 | (зарезервированный) |
1 | 0 | 0 | 1 | 0 | 1 | 0 | 1 | 1 | 1 | 0 | q | 1 | 0 | 0 | 0 | LPM / ELPM |
1 | 0 | 0 | 1 | 0 | 1 | 0 | 1 | 1 | 1 | 1 | 0 | 1 | 0 | 0 | 0 | SPM |
1 | 0 | 0 | 1 | 0 | 1 | 0 | 1 | 1 | 1 | 1 | 1 | 1 | 0 | 0 | 0 | SPM Z + |
1 | 0 | 0 | 1 | 0 | 1 | 0 | c | 0 | 0 | 0 | е | 1 | 0 | 0 | 1 | Косвенный переход / вызов в Z или EIND: Z |
1 | 0 | 0 | 1 | 0 | 1 | 0 | д д д д д | 1 | 0 | 1 | 0 | DEC Rd | ||||
1 | 0 | 0 | 1 | 0 | 1 | 0 | 0 | к к к к | 1 | 0 | 1 | 1 | DES раунд k | |||
1 | 0 | 0 | 1 | 0 | 1 | 0 | к к к к к | 1 | 1 | c | k | JMP / CALL abs22 | ||||
К К К К К К К К К К К К К К К К К К | ||||||||||||||||
1 | 0 | 0 | 1 | 0 | 1 | 1 | 0 | k k | p p | к к к к | ADIW Rp, uimm6 | |||||
1 | 0 | 0 | 1 | 0 | 1 | 1 | 1 | k k | p p | к к к к | SBIW Rp, uimm6 | |||||
1 | 0 | 0 | 1 | 1 | 0 | B | 0 | а а а а | б б б | CBI / SBI a, b (сброс / установка бита ввода / вывода) | ||||||
1 | 0 | 0 | 1 | 1 | 0 | B | 1 | а а а а | б б б | SBIC / SBIS a, b (битовый тест ввода / вывода) | ||||||
1 | 0 | 0 | 1 | 1 | 1 | р | д д д д д | r r r r | MUL без знака: R1: R0 = Rr × Rd | |||||||
1 | 0 | 1 | 1 | s | а а | д д д д д | а а а | ВХОД / ВЫХОД в пространство ввода / вывода | ||||||||
1 | 1 | 0 | c | 12-битное смещение со знаком | RJMP / RCALL к ПК + simm12 | |||||||||||
1 | 1 | 1 | 0 | К К К К | д д д д | К К К К | LDI Rd, K | |||||||||
1 | 1 | 1 | 1 | 0 | B̅ | 7-битное смещение со знаком | б б б | Условный переход по биту регистра состояния | ||||||||
1 | 1 | 1 | 1 | 1 | 0 | s | д д д д д | 0 | б б б | Бит регистра BLD / BST в STATUS.T | ||||||
1 | 1 | 1 | 1 | 1 | 1 | B | д д д д д | 0 | б б б | SBRC / SBRS пропускает, если бит регистра равен B | ||||||
1 | 1 | 1 | 1 | 1 | Икс | Икс | д д д д д | 1 | б б б | (зарезервированный) |
Рекомендации
- ^ "Руководство по набору инструкций AVR" (PDF). Атмель. Ноябрь 2016. Atmel-0856L.
- ^ «Использование инструментов GNU». Руководство по AVR Libc. Получено 6 мая 2018.
- ^ Атмель. Примечание по применению «AVR201: Использование аппаратного умножителя AVR». 2002. Цитата: «MegaAVR - это серия новых устройств в семействе микроконтроллеров AVR RISC, включающая, помимо других усовершенствований, аппаратный умножитель».
внешняя ссылка
- Среда разработки GNU:
- Программирование микроконтроллера AVR с помощью GCC Гвидо Сочер
- Среда разработки GNU для микроконтроллера AVR по Рич Несволд
- Опции AVR в GCC-AVR
- Руководство по набору инструкций AVR PDF
- Симулятор набора команд AVR (ATmega32u4 для GCC Intel Hex Files)
- Наследование набора инструкций AVR (Примечание LLVM) на основе этой страницы и кода GCC и Binutils