Система команд микроконтроллеров семейства AVR
Мнемо-ника | Операнды | Описание | Операция | Флаги | Число тактов* |
Арифметические и логические команды | |||||
ADD | Rd, Rr | Сложить без учёта флага переноса | Rd Rd + Rr | Z, C, N, V, H, S | |
ADC | Rd, Rr | Сложить с учётом флага переноса | Rd Rd + Rr + C | Z, C, N, V, H, S | |
ADIW | Rdl, К6 | Сложить слово и константу | Rdh:Rdl Rdh:Rdl – K6 | Z, C, N, V, S | |
SUB | Rd, Rr | Вычесть без учёта флага переноса | Rd Rd – Rr | Z, C, N, V, H, S | |
SUBI | Rd, К8 | Вычесть константу | Rd Rd – K8 | Z, C, N, V, H, S | |
SBC | Rd, Rr | Вычесть с учётом флага переноса | Rd Rd – Rr – C | Z, C, N, V, H, S | |
SBCI | Rd, К8 | Вычесть константу с учётом флага переноса | Rd Rd – K8 – C | Z, C, N, V, H, S | |
SBIW | Rdl, К6 | Вычесть константу из слова | Rdh:Rdl Rdh:Rdl – – K6 | Z, C, N, V, S | |
AND | Rd, Rr | Выполнить логическое И | Rd Rd · Rr | Z, N, V, S | |
ANDI | Rd, К8 | Выполнить логическое И с константой | Rd Rd · K8 | Z, N, V, S | |
OR | Rd, Rr | Выполнить логическое ИЛИ | Rd Rd v Rr | Z, N, V, S | |
ORI | Rd, К8 | Выполнить логическое ИЛИ с константой | Rd Rd v K8 | Z, N, V, S | |
EOR | Rd, Rr | Выполнить логическое исключающее ИЛИ | Rd Rd Å Rr | Z, N, V, S | |
COM | Rd | Вычислить дополнение до од-ного (поразрядная инверсия) | Rd $FF – Rd | Z, C, N, V, S | |
NEG | Rd | Вычислить дополнение до двух (изменить знак) | Rd $00 – Rd | Z, C, N, V, H, S | |
SBR | Rd, К8 | Установить разряд (разряды) в РОН | Rd Rd v K8 | Z, C, N, V, S | |
CBR | Rd, К8 | Сбросить разряды в РОН | Rd Rd · ($FF – K8) | Z, C, N, V, S | |
INC | Rd | Инкрементировать содержимое РОН | Rd Rd + 1 | Z, N, V, S | |
DEC | Rd | Декрементировать содержимое РОН | Rd Rd – 1 | Z, N, V, S | |
TST | Rd | Проверить на равенство нулю или отрицательное значение | Rd Rd · Rd | Z, C, N, V, S | |
CLR | Rd | Очистить все разряды РОН | Rd Rd Å Rd | Z, C, N, V, S | |
SER | Rd | Установить все разряды РОН | Rd $FF | Нет | |
CP | Rd, Rr | Сравнить | Rd – Rr | Z, C, N, V, H, S | |
CPC | Rd, Rr | Сравнить с учётом флага переноса | Rd – Rr – C | Z, C, N, V, H, S | |
CPI | Rd, К8 | Сравнить с константой | Rd – K8 | Z, C, N, V, H, S | |
MUL | Rd, Rr | Перемножить содержимое двух РОН (без знака) | R1:R0 Rd × Rr | Z, C | |
MULS | Rd, Rr | Перемножить содержимое двух РОН (со знаком) | R1:R0 Rd × Rr | Z, C | |
MULSU | Rd, Rr | Перемножить содержимое двух РОН (Rd – со знаком; Rr – без знака) | R1:R0 Rd × Rr | Z, C | |
FMUL | Rd, Rr | Перемножить содержимое двух РОН (без знака) со сдвигом влево на 1 разряд | R1:R0 Rd × Rr << 1 | Z, C | |
FMULS | Rd, Rr | Перемножить содержимое двух РОН (со знаком) со сдвигом влево на 1 разряд | R1:R0 Rd × Rr << 1 | Z, C | |
FMULSU | Rd, Rr | Перемножить содержимое двух РОН (Rd – со знаком; Rr – без знака) со сдвигом влево на 1 разряд | R1:R0 Rd × Rr << 1 | Z, C | |
Команды ветвления | |||||
RJMP | k | Относительный переход | PC PC + k +1 | Нет | |
IJMP | Нет | Косвенный переход | PC Z | Нет | |
EIJMP | Нет | Расширенный косвенный переход | PC(15:0) Z, PC(21:16) EIND | Нет | |
JMP | k | Косвенный переход | PC k | Нет | |
RCALL | k | Относительный вызов подпрограммы | STACK PC + 1, PC PC + k + 1 | Нет | |
ICALL | Нет | Косвенный вызов подпрограммы | STACK PC + 1, PC Z | Нет | |
EICALL | Нет | Расширенный косвенный вызов подпрограммы | STACK PC + 1, PC(15:0) Z, PC(21:16) EIND | Нет | |
CALL | k | Вызов подпрограммы | STACK PC + 1, PC k | Нет | 4/5 |
RET | Нет | Возврат из подпрограммы | PC STACK | Нет | |
RETI | Нет | Возврат из подпрограммы обработки прерывания | PC STACK | I | |
CPSE | Rd, Rr | Сравнить и пропустить, если равно | если Rd = Rr, PC PC + 2 (или 3) | Нет | 1/2/3 |
SBRC | Rr, b | Пропустить, если бит в РОН сброшен | если Rr(b) = 0, PC PC + 2 (или 3) | Нет | 1/2/3 |
SBRS | Rr, b | Пропустить, если бит в РОН установлен | если Rr(b)=1, PC PC + 2 (или 3) | Нет | 1/2/3 |
SBIC | I/O, b | Пропустить, если бит в регистре ввода-вывода сброшен | если I/O(b) = 0, PC PC + 2 (или 3) | Нет | 1/2/3 |
SBIS | I/O, b | Пропустить, если бит в регистре ввода-вывода установлен | если I/O(b) = 1, PC PC + 2 (или 3) | Нет | 1/2/3 |
BRBC | s, k | Перейти, если флаг в регистре SREG сброшен | если SREG(s) = 0, PC PC + k + 1 | Нет | 1/2 |
BRBS | s, k | Перейти, если флаг в регистре SREG установлен | если SREG(s) = 1, PC PC + k + 1 | Нет | 1/2 |
BREQ | k | Перейти, если равно | если Z = 1, PC PC + k + 1 | Нет | 1/2 |
BRNE | k | Перейти, если не равно | если Z = 0, PC PC + k + 1 | Нет | 1/2 |
BRCS | k | Перейти, если флаг переноса установлен | если C = 1, PC PC + k + 1 | Нет | 1/2 |
BRCC | k | Перейти, если флаг переноса сброшен | если C = 0, PC PC + k + 1 | Нет | 1/2 |
BRSH | k | Перейти, если равно или больше | если C = 0, PC PC + k + 1 | Нет | 1/2 |
BRLO | k | Перейти, если меньше | если C = 1, PC PC + k + 1 | Нет | 1/2 |
BRMI | k | Перейти, если минус | если N = 1, PC PC + k + 1 | Нет | 1/2 |
BRPL | k | Перейти, если плюс | если N = 0, PC PC + k + 1 | Нет | 1/2 |
BRGE | k | Перейти, если больше или равно (со знаком) | если S = 0, PC PC + k + 1 | Нет | 1/2 |
BRLT | k | Перейти, если меньше (со знаком) | если S = 1, PC PC + k + 1 | Нет | 1/2 |
BRHS | k | Перейти, если флаг полупереноса установлен | если H = 1, PC PC + k + 1 | Нет | 1/2 |
BRHC | k | Перейти, если флаг полупереноса сброшен | если H = 0, PC PC + k + 1 | Нет | 1/2 |
BRTS | k | Перейти, если флаг T установлен | если T = 1, PC PC + k + 1 | Нет | 1/2 |
BRTC | k | Перейти, если флаг T сброшен | если T = 0, PC PC + k + 1 | Нет | 1/2 |
BRVS | k | Перейти, если флаг переполнения установлен | если V = 1, PC PC + k + 1 | Нет | 1/2 |
BRVC | k | Перейти, если флаг переполнения сброшен | если V = 0, PC PC + k + 1 | Нет | 1/2 |
BRIE | k | Перейти, если прерывания разрешены | если I = 1, PC PC + k + 1 | Нет | 1/2 |
BRID | k | Перейти, если прерывания запрещены | если I = 0, PC PC + k + 1 | Нет | 1/2 |
Команды передачи данных | |||||
MOV | Rd, Rr | Копирование РОН | Rd Rr | Нет | |
MOVW | Rd, Rr | Копирование пары РОН | Rd+1:Rd Rr+1:Rr | Нет | |
LDI | Rd, К8 | Загрузка константы в РОН | Rd K8 | Нет | |
LDS | Rd, k | Прямая загрузка из ОЗУ в РОН | Rd (k) | Нет | |
LD | Rd, X | Косвенная загрузка из ОЗУ в РОН | Rd (X) | Нет | |
LD | Rd, X+ | Косвенная загрузка из ОЗУ с постинкрементом | Rd (X), X X + 1 | Нет |
LD | Rd, –X | Косвенная загрузка из ОЗУ с предекрементом | X X – 1, Rd (X) | Нет | |
LD | Rd, Y | Косвенная загрузка из ОЗУ в РОН | Rd (Y) | Нет | |
LD | Rd, Y+ | Косвенная загрузка из ОЗУ с постинкрементом | Rd (Y), Y Y + 1 | Нет | |
LD | Rd, –Y | Косвенная загрузка из ОЗУ с предекрементом | Y Y – 1, Rd (Y) | Нет | |
LDD | Rd, Y+q | Косвенная загрузка из ОЗУ со смещением | Rd (Y + q) | Нет | |
LD | Rd, Z | Косвенная загрузка из ОЗУ в РОН | Rd (Z) | Нет | |
LD | Rd, Z+ | Косвенная загрузка из ОЗУ с постинкрементом | Rd (Z), Z Z + 1 | Нет | |
LD | Rd, –Z | Косвенная загрузка из ОЗУ с предекрементом | Z Z – 1, Rd (Z) | Нет | |
LDD | Rd, Z+q | Косвенная загрузка из ОЗУ со смещением | Rd (Z + q) | Нет | |
STS | k, Rr | Прямое сохранение в ОЗУ | (k) Rr | Нет | |
ST | X, Rr | Косвенное сохранение в ОЗУ | (X) Rr | Нет | |
ST | X+, Rr | Косвенное сохранение в ОЗУ с постинкрементом | (X) Rr, X X + 1 | Нет | |
ST | –X, Rr | Косвенное сохранение в ОЗУ с предекрементом | X X – 1, (X) Rr | Нет | |
ST | Y, Rr | Косвенное сохранение в ОЗУ | (Y) Rr | Нет | |
ST | Y+, Rr | Косвенное сохранение в ОЗУ с постинкрементом | (Y) Rr, Y Y + 1 | Нет | |
ST | –Y, Rr | Косвенное сохранение в ОЗУ с предекрементом | Y Y – 1, (Y) Rr | Нет | |
STD | Y+q, Rr | Косвенное сохранение в ОЗУ со смещением | (Y + q) Rr | Нет | |
ST | Z, Rr | Косвенное сохранение в ОЗУ | (Z) Rr | Нет | |
ST | Z+, Rr | Косвенное сохранение в ОЗУ с постинкрементом | (Z) Rr, Z Z + 1 | Нет | |
ST | –Z, Rr | Косвенное сохранение в ОЗУ с предекрементом | Z Z – 1, (Z) Rr | Нет | |
ST | Z+q, Rr | Косвенное сохранение в ОЗУ со смещением | (Z + q) Rr | Нет | |
LPM | Нет | Загрузка байта из памяти программ | R0 (Z) | Нет | |
LPM | Rd, Z | Загрузка байта из памяти программ | Rd (Z) | Нет | |
LPM | Rd, Z+ | Загрузка байта из памяти программ с постинкрементом | Rd (Z), Z Z + 1 | Нет | |
ELPM | Нет | Расширенная загрузка байта из памяти программ | R0 (RAMPZ:Z) | Нет | |
ELPM | Rd, Z | Расширенная загрузка байта из памяти программ | Rd (RAMPZ:Z) | Нет |
ELPM | Rd, Z+ | Расширенная загрузка байта из памяти программ с постинкрементом | Rd (RAMPZ:Z), Z Z + 1 | Нет | |
SPM | Нет | Запись в память программ | (Z) R1:R0 | Нет | – |
IN | Rd, I/O | Чтение регистра ввода-вывода | Rd I/O | Нет | |
OUT | I/O, Rr | Запись в регистр ввода-вывода | I/O Rr | Нет | |
PUSH | Rr | Занесение содержимого РОН в стек | STACK Rr | Нет | |
POP | Rd | Извлечение из стека в РОН | Rd STACK | Нет | |
Команды работы с битами | |||||
LSL | Rd | Логический сдвиг влево | Rd(n + 1) Rd(n), Rd(0) 0, C Rd(7) | Z, C, N, V, H, S | |
LSR | Rd | Логический сдвиг вправо | Rd(n) Rd(n + 1), Rd(7) 0, C Rd(0) | Z, C, N, V, H, S | |
ROL | Rd | Циклический сдвиг влево через флаг переноса | Rd(0) C, Rd(n + 1) Rd(n), C Rd(7) | Z, C, N, V, H, S | |
ROR | Rd | Циклический сдвиг вправо через флаг переноса | Rd(7) C, Rd(n) Rd(n + 1), C Rd(0) | Z, C, N, V, S | |
ASR | Rd | Арифметический сдвиг вправо | Rd(n) Rd(n + 1), n = 0...6 | Z, C, N, V, S | |
SWAP | Rd | Поменять нибблы местами (перестановка тетрад) | Rd(3...0) Rd(7...4), Rd(7...4) Rd(3...0) | Нет | |
BSET | s | Установить флаг в регистре состояния SREG | SREG(s) 1 | SREG(s) | |
BCLR | s | Сбросить флаг в регистре состояния SREG | SREG(s) 0 | SREG(s) | |
SBI | I/O, b | Установить разряд в регистре ввода-вывода | I/O(b) 1 | Нет | |
CBI | I/O, b | Сбросить разряд в регистре ввода-вывода | I/O(b) 0 | Нет | |
BST | Rr, b | Сохранить разряд РОН во флаге T | T Rr(b) | T | |
BLD | Rd, b | Загрузить разряд из флага T в РОН | Rd(b) T | Нет | |
SEC | Нет | Установить флаг переноса | C 1 | C | |
CLC | Нет | Сбросить флаг переноса | C 0 | C | |
SEN | Нет | Установить флаг отрицательного числа | N 1 | N | |
CLN | Нет | Сбросить флаг отрицательного числа | N 0 | N | |
SEZ | Нет | Установить флаг нуля | Z 1 | Z | |
CLZ | Нет | Сбросить флага нуля | Z 0 | Z | |
SEI | Нет | Установить флаг разрешения прерываний | I 1 | I |
CLI | Нет | Сбросить флаг разрешения прерываний | I 0 | I | |
SES | Нет | Установить флаг числа со знаком | S 1 | S | |
CLS | Нет | Сбросить флаг числа со знаком | S 0 | S | |
SEV | Нет | Установить флаг переполнения | V 1 | V | |
CLV | Нет | Сбросить флаг переполнения | V 0 | V | |
SET | Нет | Установить флаг T | T 1 | T | |
CLT | Нет | Сбросить флаг T | T 0 | T | |
SEH | Нет | Установить флаг внутреннего переноса | H 1 | H | |
CLH | Нет | Сбросить флаг внутреннего переноса | H 0 | H | |
NOP | Нет | Нет операции | Нет | Нет | |
BREAK | Нет | Сброс | См. описание конкретного микроконтроллера | Нет | |
SLEEP | Нет | Уменьшить энергопотребление | См. описание конкретного микроконтроллера | Нет | |
WDR | Нет | Сбросить сторожевой таймер | См. описание конкретного микроконтроллера | Нет |
Условные обозначения:
Rd – результирующий (destination) и исходный РОН;
Rr – исходный (source) РОН;
I/O – регистр ввода-вывода;
b – разряд в регистре общего назначения или регистре ввода-вывода;
s – разряд (флаг) в регистре состояния SREG;
Rdl – регистры R24, R26, R28, R30;
X, Y, Z – регистры-указатели для косвенной адресации (X = R27:R26, Y = R29:R28,
Z = R31:R30);
RAMPX, RAMPY, RAMPZ – регистры, связанные с регистрами-указателями X, Y и Z и обеспечивающие косвенную адресацию по всему объёму памяти данных (при размере памяти данных более 64 Кбайт) и доступ к размещённым в памяти программ константам в микроконтроллерах с размером памяти программ более 64 Кбайт;
РС – программный счётчик (Program Counter);
STACK – стек для хранения адресов возврата и содержимого регистров;
SP – указатель стека (Stack Pointer);
EIND – регистр, связанный с программным счётчиком и обеспечивающий косвенную адресацию по всему объёму памяти программ для микроконтроллеров с размером памяти программ более 64 Кбайт;
K6 – константа (6 разрядов), может быть константное выражение;
K8 – константа (8 разрядов), может быть константное выражение;
k – адресная константа для программного счётчика (размер зависит от команды);
q – смещение при косвенной адресации (6 разрядов).
Разряды регистра состояния SREG:
C – флаг переноса;
Z – флаг нулевого значения;
N – флаг отрицательного значения;
V – флаг переполнения;
S = N Å V – флаг для проверок со знаком при переполнении;
H – флаг полупереноса (переноса между третьим и четвёртым разрядами байта);
T – флаг для команд пересылки;
I – флаг глобального разрешения (запрещения) прерываний.
Примечания: 1. Транслятор с языка ассемблера AVR-микроконтроллеров не различает регистр символов.
2. Мнемокоды ANDI и CBR а также ORI и SBR транслируются в один и тот же машинный код. Выбор между ними производится в зависимости от контекста программы.
3. Длительность выполнения команд условных переходов составляет 1 такт, если условие ложно (переход не производится), и 2 (3) такта (в зависимости от величины смещения), если соответствующее условие истинно (производится переход).
4. Для команд доступа к данным длительность выполнения указана при обращении к внутренней оперативной памяти данных.
Приложение 3