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

Наши рекомендации