Система команд микроконтроллеров семейства 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