Набор инструкций Atmel AVR
Эта статья написана как руководство или руководство . ( июнь 2014 г. ) |
Набор команд Atmel AVR — это машинный язык для Atmel AVR , с модифицированной гарвардской архитектурой 8-битного RISC однокристального микроконтроллера , который был разработан Atmel в 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 и показывает истинный знак сравнения.
- H Флаг полупереноса . Это внутренний перенос из сложений, который используется для поддержки арифметики BCD .
- T Битовая копия. Этот бит используется в специальных инструкциях по загрузке и сохранению битов.
- I Флаг прерывания . Устанавливается, когда прерывания разрешены.
Адресация
[ редактировать ]Доступны следующие адресные пространства:
- Регистры общего назначения адресуются по их номерам (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 КиБ адресной памятью .
Зарегистрироваться | Адрес ввода/вывода | Адрес данных |
---|---|---|
КОМФОРТНЫЙ | 0x3F | 0x5F |
СП | 0x3E : 0x3D | 0x5E : 0x5D |
КОНЕЦ | 0x3C | 0x5C |
РАМПЗ | 0x3B | 0x5B |
РАМПЫ | 0x3A | 0x5A |
RAMPX | 0x39 | 0x59 |
РАМПД | 0x38 | 0x58 |
Типичная карта памяти ATmega может выглядеть так:
Адрес данных | Адрес ввода/вывода | Содержание |
---|---|---|
0x0000 – 0x001F | Регистры R0 – R31 | |
0x0020 – 0x003F | 0x00 – 0x1F | Регистры ввода-вывода (с побитовой адресацией) |
0x0040 – 0x005F | 0x20 – 0x3F | Регистры ввода-вывода (без побитовой адресации) |
0x0060 – 0x00FF | Расширенные регистры ввода-вывода (только ввод-вывод, отображаемый в памяти) | |
0x0100 – РАМЕНД | Внутреннее статическое ОЗУ |
где RAMEND — последний адрес ОЗУ. В частях, где отсутствует расширенный ввод-вывод, ОЗУ будет начинаться с 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-битный адрес данных, охватывающий 64 КиБ ; в частях с объемом данных более 64 КиБ к началу добавляется содержимое регистра сегмента RAMPD.
- P22 — 22-битный программный адрес, охватывающий 2 22 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
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 S12
ICALL
EICALL
CALL P22
RET
RETI
|
Наследование набора команд
[ редактировать ]Не все инструкции реализованы во всех контроллерах Atmel AVR . Это касается инструкций, выполняющих умножение, расширенные загрузки/переходы/вызовы, длинные переходы и управление мощностью.
Дополнительные инструкции можно сгруппировать в три категории:
- функции ядра процессора (вычисления), добавленные к более производительным ядрам процессора
- функции адресации памяти, добавленные на все модели с достаточно большим объемом памяти, чтобы они могли потребоваться
- дополнительные функции, несколько периферийных устройств, которые могут присутствовать или отсутствовать в конкретной модели.
Хотя процессоры более высокого класса, как правило, имеют как более производительные ядра, так и больший объем памяти, наличие одного не гарантирует наличие другого.
Инструкции основного процессора
[ редактировать ]Начиная с исходного «классического» ядра, улучшения организованы в следующие уровни, каждый из которых включает в себя все предыдущие:
- «Классическое» ядро имеет только форму с нулевым операндом.
LPM
инструкцию, которая эквивалентнаLPM r0,Z
. - «Классик плюс» добавляет
MOVW
инструкция для перемещения пар регистров и более общая форма инструкции LPM (LPM Rd,Z
иLPM Rd,Z+
), которые допускают произвольный регистр назначения и автоматическое приращение указателя Z. - «Расширенные» ядра добавляют инструкции умножения.
- Ядра XMEGA не добавляют новых инструкций как таковых , но вносят некоторые существенные изменения:
- Карта памяти реорганизована, устраняя отображение файла регистров процессора в памяти (поэтому порты ввода-вывода начинаются с адреса ОЗУ 0) и расширяя диапазон портов ввода-вывода. Теперь первые 4 КБ — это регистры специальных функций, вторые 4 КБ — это флэш-память, а обычная оперативная память начинается с 8 КБ.
- Нет необходимости явно отключать прерывания перед настройкой регистров указателя стека (SPL и SPH); любая запись в SPL автоматически отключает прерывания на 4 такта, чтобы дать время для обновления SPH.
- Другие многобайтовые регистры снабжены теневыми регистрами для обеспечения атомарного чтения и записи. Когда считывается младший байт, байты более высокого порядка копируются в теневые регистры, поэтому при их позднем чтении создается снимок регистра на момент первого чтения. Запись в младшие байты буферизуется до тех пор, пока не будет записан старший байт, после чего весь многобайтовый регистр обновляется атомарно.
- Более поздние ядра XMEGA (в частности, модели B, C и AU, такие как ATxmega16A4U, но не более ранние модели A, D и E, такие как ATxmega16D4) добавляют четыре атомарные инструкции чтения-изменения-записи : обмен (
XCH
), «загрузка и установка», «загрузка и очистка» и «загрузка и переключение». Они помогают координировать работу с периферийными устройствами прямого доступа к памяти , в частности с USB- контроллером.
Менее функциональными, чем «классические» ядра ЦП, являются два подмножества: ядро «AVR1» и «AVR tiny». Как ни странно, процессоры под маркой ATtiny имеют множество ядер, включая AVR1 (ATtiny11, ATtiny28), classic (ATtiny22, ATtiny26), classic+ (ATtiny24) и AVRtiny (ATtiny20, ATtiny40).
Подмножество AVR1 не пользовалось популярностью, и с 2000 года не было представлено никаких новых моделей. В нем отсутствует вся оперативная память, за исключением 32 регистров, сопоставленных по адресам 0–31, и портов ввода-вывода по адресам 32–95. Стек заменяется трехуровневым аппаратным стеком, и PUSH
и POP
инструкции удалены. Все 16-битные операции удаляются, как и IJMP
, ICALL
и все режимы адресации загрузки и сохранения, кроме косвенной через Z.
Вторая, более успешная попытка подмножества набора команд AVR — это ядро «AVR tiny».
Наиболее значительным изменением является то, что в ядре AVRtiny отсутствуют регистры R0–R15. Регистры также не отображаются в памяти: порты ввода-вывода от 0 до 63, а ОЗУ общего назначения начинаются с адреса 64. 16-битные арифметические операции ( ADIW
, SBIW
) опущены, как и режимы загрузки/сохранения со смещением адресации ( Y+d
, Z+d
), но режимы адресации до и после приращения сохраняются. LPM
инструкция опущена; вместо этого ПЗУ программы отображается в адресное пространство данных, и к нему можно получить доступ с помощью обычных инструкций загрузки.
Наконец, ядро AVRtiny удаляет 2-слово LDS
и STS
инструкции для прямой адресации ОЗУ и вместо этого использует пространство кода операции, ранее назначенное для загрузки/сохранения, с инструкциями смещения для нового 1-слова LDS
и STS
инструкции, которые могут получить доступ к первым 128 ячейкам оперативной памяти общего назначения, имеют адреса от 0x40 до 0xBF. ( IN
и OUT
инструкции обеспечивают прямой доступ к пространству ввода-вывода от 0 до 0x3F.)
Инструкции по адресации памяти
[ редактировать ]Самые маленькие ядра имеют ≤256 байт адресного пространства данных (то есть ≤128 байт ОЗУ после удаления портов ввода-вывода и других зарезервированных адресов) и ≤8192 байта (8 КиБ) ПЗУ программы. Они имеют только 8-битный указатель стека (в SPL) и поддерживают только 12-битные инструкции относительного перехода/вызова. RJMP
/ RCALL
. (Поскольку программный счетчик AVR считает 16-битные слова, а не байты, 12-битного смещения достаточно для адреса 2. 13 байт ПЗУ.)
Присутствуют дополнительные возможности адресации памяти, необходимые для доступа к доступным ресурсам:
- Модели с адресным пространством данных >256 байт (≥256 байт ОЗУ) имеют 16-битный указатель стека со старшей половиной в регистре SPH.
- В моделях с ПЗУ >8 КиБ добавляются 2 слова (22 бита).
JUMP
иCALL
инструкции. (В некоторых ранних моделях возникает ошибка , если за инструкцией пропуска следует инструкция из двух слов.) - Модели с ПЗУ >64 КиБ добавляют
ELPM
инструкцию и соответствующий регистр RAMPZ.LPM
инструкции расширяют адрес ПЗУ в Z до нуля;ELPM
инструкции добавляют в регистр RAMPZ старшие биты. Это не то же самое, что более общийLPM
инструкция; существуют «классические» модели только с формой с нулевым операндомELPM
(ATmega103 и at43usb320). Если доступно автоматическое приращение (большинство моделей), оно обновляет весь 24-битный адрес, включая RAMPZ. - (Редкие) модели с ПЗУ >128 КиБ имеют 3-байтовый счетчик программ. Вызовы и возвраты подпрограмм используют дополнительный байт стекового пространства, имеется новый регистр EIND для предоставления дополнительных старших битов для непрямых переходов и вызовов, а также имеются новые расширенные инструкции.
EIJMP
иEICALL
которые используют EIND:Z в качестве адреса назначения. (ПредыдущийIJMP
иICALL
инструкции используют расширение Z с нуля.) - (Редкие) модели с адресным пространством ОЗУ >64 КБ расширяют пределы адресации 16-битной ОЗУ с помощью регистров RAMPX, RAMPY, RAMPZ и RAMPD. Они предоставляют дополнительные старшие биты для режимов адресации, в которых используются пары регистров X, Y или Z соответственно или инструкции прямой адресации.
LDS
/STS
. В отличие от доступа к ПЗУ, здесь нет отдельных «расширенных» инструкций; вместо этого регистры RAMP используются безоговорочно.
Дополнительные инструкции по функциям
[ редактировать ]Три инструкции присутствуют только на моделях, имеющих соответствующее аппаратное обеспечение.
SPM
для сохранения во флэш-ПЗУ, имеется только на процессорах с флэш-ПЗУ (большинство из них)BREAK
для вызова встроенного отладчика не используется в некоторых небольших моделях без поддержки встроенного отладчика.DES
для выполнения раундов Data Encryption Standard , присутствует на моделях XMEGA с поддержкой ускорителя DES.
Архитектуры, отличные от AVR1, именуются в соответствии с соглашениями avr-libc. [2]
Семья | Члены | Арифметика | Филиалы | Трансферы | Побитовый | ||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Минимальное ядро AVR1 |
|
|
|
|
| ||||||||||||
Программное пространство Classic Core до 8K («AVR2») |
|
новые инструкции:
|
новые инструкции:
|
новые инструкции:
|
(ничего нового) | ||||||||||||
AVR2 с инструкциями MOVW и LPM («AVR2.5») |
|
(ничего нового) | (ничего нового) | новые инструкции:
|
(ничего нового) | ||||||||||||
Классическое ядро с разрешением до 128 КБ («AVR3») |
|
(ничего нового) | новые инструкции:
|
новые инструкции:
|
(ничего нового) | ||||||||||||
Enhanced Core с разрешением до 8K («AVR4») |
|
новые инструкции:
|
(ничего нового) | новые инструкции:
|
(ничего нового) | ||||||||||||
Расширенное ядро до 128 КБ («AVR5», «AVR5.1») |
|
(ничего нового) | новая инструкция:
|
(ничего нового) | новые инструкции:
| ||||||||||||
Расширенное ядро до 4 МБ («AVR5» и «AVR6») |
|
(ничего нового) | новые инструкции:
|
(ничего нового) | (ничего нового) | ||||||||||||
XMEGA Core («avrxmega» 2-6) | серия ATxmega | новые инструкции:
|
(ничего нового) | новые инструкции (из кремния второй ревизии - детали AU,B,C)
|
(ничего нового) | ||||||||||||
Уменьшенное ядро AVRtiny («avrtiny10») |
|
(Идентичен минимальному ядру, за исключением уменьшенного набора регистров ЦП. а ) | (Идентичен классическому ядру с разрешением до 8 КБ, за исключением уменьшенного набора регистров ЦП. а ) | Идентичен классическому ядру с разрешением до 8K, за следующими исключениями:
|
(Идентичен расширенному ядру до 128 КБ, за исключением уменьшенного набора регистров ЦП. а ) |
а Сокращенный набор регистров ограничен R16–R31. [1]
Кодирование инструкций
[ редактировать ]Назначение битов:
- ррррр = Исходный регистр
- 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)
- аааааа = адрес пространства ввода-вывода
- aaaaa = адрес пространства ввода-вывода (только первые 32)
- bbb = номер бита (0–7)
- B = значение бита (0 или 1)
- kkkk = 4-битная константа без знака (код операции DES)
- kkkkkkk = 6-битная беззнаковая константа
- 𝑌𝐶𝐶𝐶𝐸𝐶𝐸 = 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 | НЕТ |
0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | ДДДД | р-р-р-р | MOVW Rd,Rr Переместить пару регистров | ||||||
0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | дддд | рррр | МУЛС Роуд, Рр | ||||||
0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 0 | ддд | 0 | ррр | МУЛСУ Роуд, Рр | ||||
0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 0 | ддд | 1 | ррр | FMUL Rd, Rr | ||||
0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 1 | ддд | в | ррр | FMULS(U) Rd,Rr | ||||
0 | 0 | код операции | р | ддддд | рррр | инструкции с двумя операндами | ||||||||||
0 | 0 | 0 | окей | 0 | 1 | р | ддддд | рррр | КТК/КП Рд,Рр | |||||||
0 | 0 | 0 | окей | 1 | 0 | р | ддддд | рррр | SBC/SUB Rd, Rr | |||||||
0 | 0 | 0 | сай | 1 | 1 | р | ддддд | рррр | ADD/ADC Rd,Rr (LSL/ROL Rd, когда Rd=Rr) | |||||||
0 | 0 | 0 | 1 | 0 | 0 | р | ддддд | рррр | CPSE Rd, Rr | |||||||
0 | 0 | 1 | 0 | 0 | 0 | р | ддддд | рррр | И Рд, Рр | |||||||
0 | 0 | 1 | 0 | 0 | 1 | р | ддддд | рррр | EOR Rd,Rr | |||||||
0 | 0 | 1 | 0 | 1 | 0 | р | ддддд | рррр | ИЛИ Рд, Рр | |||||||
0 | 0 | 1 | 0 | 1 | 1 | р | ддддд | рррр | МОВ Р-д, Р-р | |||||||
0 | 0 | 1 | 1 | КККК | дддд | КККК | ИПЦ Рд,К | |||||||||
0 | 1 | опк | КККК | дддд | КККК | Операции с немедленной регистрацией | ||||||||||
0 | 1 | 0 | окей | КККК | дддд | КККК | SBCI/SUBI Rd, K | |||||||||
0 | 1 | 1 | 0 | КККК | дддд | КККК | ОРИ Роуд, К СБР Роуд,К | |||||||||
0 | 1 | 1 | 1 | КККК | дддд | КККК | ЭНДИ Роуд, К. ЦБР Роуд,К | |||||||||
1 | 0 | к | 0 | ок | с | ддддд | и | ккк | LDD/STD Rd через Z+k или Y+k | |||||||
1 | 0 | 0 | 1 | 0 | 0 | с | ддддд | код операции | Операции загрузки/сохранения | |||||||
1 | 0 | 0 | 1 | 0 | 0 | с | ддддд | 0 | 0 | 0 | 0 | LDS rd,i/STS i,rd | ||||
16-битный непосредственный адрес SRAM i | ||||||||||||||||
1 | 0 | 0 | 1 | 0 | 0 | с | ддддд | и | 0 | 0 | 1 | LD/ST Rd через Z+/Y+ | ||||
1 | 0 | 0 | 1 | 0 | 0 | с | ддддд | и | 0 | 1 | 0 | LD/ST Rd через −Z/−Y | ||||
1 | 0 | 0 | 1 | 0 | 0 | 0 | ддддд | 0 | 1 | д | 0 | LPM/ELPM Rd,Z | ||||
1 | 0 | 0 | 1 | 0 | 0 | 0 | ддддд | 0 | 1 | д | 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 | ЛАС З, Рд | ||||
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 | с | ддддд | 1 | 1 | 0 | 0 | LD/ST от Rd до X | ||||
1 | 0 | 0 | 1 | 0 | 0 | с | ддддд | 1 | 1 | 0 | 1 | LD/ST от Rd до X+ | ||||
1 | 0 | 0 | 1 | 0 | 0 | с | ддддд | 1 | 1 | 1 | 0 | LD/ST от Rd до −X | ||||
1 | 0 | 0 | 1 | 0 | 0 | с | ддддд | 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 | Ком Роуд | ||||
1 | 0 | 0 | 1 | 0 | 1 | 0 | ддддд | 0 | 0 | 0 | 1 | НЕГ Роуд | ||||
1 | 0 | 0 | 1 | 0 | 1 | 0 | ддддд | 0 | 0 | 1 | 0 | СВАП Роуд | ||||
1 | 0 | 0 | 1 | 0 | 1 | 0 | ддддд | 0 | 0 | 1 | 1 | ИНК Роуд | ||||
1 | 0 | 0 | 1 | 0 | 1 | 0 | ддддд | 0 | 1 | 0 | 0 | (сдержанный) | ||||
1 | 0 | 0 | 1 | 0 | 1 | 0 | ддддд | 0 | 1 | 0 | 1 | АСР Роуд | ||||
1 | 0 | 0 | 1 | 0 | 1 | 0 | ддддд | 0 | 1 | 1 | 0 | ЛСР Роуд | ||||
1 | 0 | 0 | 1 | 0 | 1 | 0 | ддддд | 0 | 1 | 1 | 1 | РОР Роуд | ||||
1 | 0 | 0 | 1 | 0 | 1 | 0 | 0 | Б̅ | ббб | 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 | ВЕРНО |
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 | д | 1 | 0 | 0 | 0 | ЛПМ/ЭЛПМ |
1 | 0 | 0 | 1 | 0 | 1 | 0 | 1 | 1 | 1 | 1 | 0 | 1 | 0 | 0 | 0 | СЗМ |
1 | 0 | 0 | 1 | 0 | 1 | 0 | 1 | 1 | 1 | 1 | 1 | 1 | 0 | 0 | 0 | СЗМ Z+ |
1 | 0 | 0 | 1 | 0 | 1 | 0 | с | 0 | 0 | 0 | и | 1 | 0 | 0 | 1 | Косвенный переход/вызов Z или EIND:Z |
1 | 0 | 0 | 1 | 0 | 1 | 0 | ддддд | 1 | 0 | 1 | 0 | Дек Роуд | ||||
1 | 0 | 0 | 1 | 0 | 1 | 0 | 0 | хкккк | 1 | 0 | 1 | 1 | DES раунд k | |||
1 | 0 | 0 | 1 | 0 | 1 | 0 | ккккк | 1 | 1 | с | к | JMP/CALL abs22 | ||||
Ккккккккккккккк | ||||||||||||||||
1 | 0 | 0 | 1 | 0 | 1 | 1 | 0 | ок | пп | хкккк | ADIW Rp,uimm6 | |||||
1 | 0 | 0 | 1 | 0 | 1 | 1 | 1 | ок | пп | хкккк | SBIW Rp,uimm6 | |||||
1 | 0 | 0 | 1 | 1 | 0 | Б | 0 | ааааа | ббб | CBI/SBI a,b (очистить/установить бит ввода/вывода) | ||||||
1 | 0 | 0 | 1 | 1 | 0 | Б | 1 | ааааа | ббб | SBIC/SBIS a,b (проверка битов ввода-вывода) | ||||||
1 | 0 | 0 | 1 | 1 | 1 | р | ддддд | рррр | MUL, без знака: R1:R0 = Rr × Rd | |||||||
1 | 0 | 1 | 1 | с | аа | ддддд | аааа | IN/OUT в пространство ввода/вывода | ||||||||
1 | 1 | 0 | с | 12-битное знаковое смещение | RJMP/RCALL на ПК + simm12 | |||||||||||
1 | 1 | 1 | 0 | КККК | дддд | КККК | ЛДИ Роуд, К. | |||||||||
1 | 1 | 1 | 1 | 0 | Б̅ | 7-битное знаковое смещение | ббб | Условный переход по биту регистра состояния | ||||||||
1 | 1 | 1 | 1 | 1 | 0 | с | ддддд | 0 | ббб | Бит регистра BLD/BST в STATUS.T | ||||||
1 | 1 | 1 | 1 | 1 | 1 | Б | ддддд | 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 (примечание LLVM), на основе этой страницы и кода GCC и Binutils.