31. Краткое описание набора инструкций
31.1. Арифметические и логические инструкции
Мнемонический код |
Операнды |
Описание |
Операция |
Флаги |
Количество циклов синхронизации |
ADD |
Rd, Rr |
Сложение без учета переноса |
Rd <-- Rd + Rr |
Z,C,N,V,S,H |
1 |
ADC |
Rd, Rr |
Сложение с учетом переноса |
Rd <-- Rd + Rr + C |
Z,C,N,V,S,H |
1 |
ADIW |
Rd, K |
Сложение слова с константой |
Rd <-- Rd + 1:Rd + K |
Z,C,N,V,S |
2 |
SUB |
Rd, Rr |
Вычитание без учета переноса |
Rd <-- Rd - Rr |
Z,C,N,V,S,H |
1 |
SUBI |
Rd, K |
Вычитание константы |
Rd <-- Rd - K |
Z,C,N,V,S,H |
1 |
SBC |
Rd, Rr |
Вычитание с учетом переноса |
Rd <-- Rd - Rr - C |
Z,C,N,V,S,H |
1 |
SBCI |
Rd, K |
Вычитание константы с учетом переноса |
Rd <-- Rd - K - C |
Z,C,N,V,S,H |
1 |
SBIW |
Rd, K |
Вычитание константы из слова |
Rd + 1:Rd <-- Rd + 1:Rd - K |
Z,C,N,V,S |
2 |
AND |
Rd, Rr |
Логическое И |
Rd <-- Rd · Rr |
Z,N,V,S |
1 |
ANDI |
Rd, K |
Логическое И с константой |
Rd <-- Rd · K |
Z,N,V,S |
1 |
OR |
Rd, Rr |
Логическое ИЛИ |
Rd <-- Rd v Rr |
Z,N,V,S |
1 |
ORI |
Rd, K |
Логическое ИЛИ с константой |
Rd <-- Rd v K |
Z,N,V,S |
1 |
EOR |
Rd, Rr |
Исключающее ИЛИ |
Rd <-- Rd Rr |
Z,N,V,S |
1 |
COM |
Rd |
Инвертирование всех бит |
Rd <-- $FF - Rd |
Z,C,N,V,S |
1 |
NEG |
Rd |
Вычисление двоичного дополнения |
Rd <-- $00 - Rd |
Z,C,N,V,S,H |
1 |
SBR |
Rd,K |
Установка бит в регистре |
Rd <-- Rd v K |
Z,N,V,S |
1 |
CBR |
Rd,K |
Сброс бит в регистре |
Rd <-- Rd · ($FFh - K) |
Z,N,V,S |
1 |
INC |
Rd |
Инкрементирование |
Rd <-- Rd + 1 |
Z,N,V,S |
1 |
DEC |
Rd |
Декрементирование |
Rd <-- Rd - 1 |
Z,N,V,S |
1 |
TST |
Rd |
Проверка на ноль или минус |
Rd <-- Rd · Rd |
Z,N,V,S |
1 |
CLR |
Rd |
Сброс регистра |
Rd <-- Rd Rd |
Z,N,V,S |
1 |
SER |
Rd |
Установка регистра |
Rd <-- $FF |
Нет |
1 |
MUL |
Rd,Rr |
Умножение беззнаковых переменных |
R1:R0 <-- Rd x Rr (UU) |
Z,C |
2 |
MULS |
Rd,Rr |
Умножение знаковых переменных |
R1:R0 <-- Rd x Rr (SS) |
Z,C |
2 |
MULSU |
Rd,Rr |
Умножение знаковой и беззнаковой переменных |
R1:R0 <-- Rd x Rr (SU) |
Z,C |
2 |
FMUL2 |
Rd,Rr |
Дробное умножение беззнаковых переменных |
R1:R0 <-- Rd x Rr<<1 (UU) |
Z,C |
2 |
FMULS |
Rd,Rr |
Дробное умножение знаковых переменных |
R1:R0 <-- Rd x Rr<<1 (SS) |
Z,C |
2 |
FMULSU |
Rd,Rr |
Дробное умножение знаковой и беззнаковой переменных |
R1:R0 <-- Rd x Rr<<<1 (SU) |
Z,C |
2 |
DES |
K |
Шифрование данных |
if (H = 0) then R15:R0 <-- Encrypt(R15:R0, K) else if (H = 1) then R15:R0 <-- Decrypt(R15:R0, K) |
|
1/2 |
31.2. Инструкции переходов
Мнемонический код |
Операнды |
Описание |
Операция |
Флаги |
Количество циклов синхронизации |
RJMP |
k |
Относительный переход |
PC <-- PC + k + 1 |
Нет |
2 |
IJMP |
|
Косвенный переход по адресу в регистре (Z) |
PC(15:0) <-- Z PC(21:16) <-- 0 |
Нет |
2 |
EIJMP |
|
Расширенный косвенный переход по адресу в регистре (Z) |
PC(15:0) <-- Z PC(21:16) <-- EIND |
Нет |
2 |
JMP |
k |
Переход |
PC <-- k |
Нет |
3 |
RCALL |
k |
Относительный вызов подпрограммы |
PC <-- PC + k + 1 |
Нет |
2 / 3(1) |
ICALL |
|
Косвенный вызов по адресу в регистре (Z) |
PC(15:0) <-- Z PC(21:16) <-- 0 |
Нет |
2 / 3(1) |
EICALL |
|
Расширенный косвенный вызов по адресу в регистре (Z) |
PC(15:0) <-- Z PC(21:16) <-- EIND |
Нет |
3(1) |
CALL |
k |
Вызов подпрограммы |
PC <-- k |
Нет |
3 / 4(1) |
RET |
|
Выход из подпрограммы |
PC <-- STACK |
Нет |
4 / 5(1) |
RETI |
|
Выход из процедуры обработки прерывания |
PC <-- STACK |
I |
4 / 5(1) |
CPSE |
Rd,Rr |
Сравнение и пропуск инструкции, если равно |
if (Rd = Rr) PC <-- PC + 2 or 3 |
Нет |
1/2/3 |
CP |
Rd,Rr |
Сравнение |
Rd - Rr |
Z,C,N,V,S,H |
1 |
CPC |
Rd,Rr |
Сравнение с учетом переноса |
Rd -Rr -C |
Z,C,N,V,S,H |
1 |
CPI |
Rd,K |
Сравнение с константой |
Rd - K |
Z,C,N,V,S,H |
1 |
SBRC |
Rr, b |
Пропуск инструкции, если бит в регистре равен 0 |
if (Rr(b) = 0) PC <-- PC + 2 or 3 |
Нет |
1/2/3 |
SBRS |
Rr, b |
Пропуск инструкции, если бит в регистре равен 1 |
if (Rr(b) = 1) PC <-- PC + 2 or 3 |
Нет |
1/2/3 |
SBIC |
A, b |
Пропуск инструкции, если бит в регистре В/В равен 0 |
if (I/O(A,b) = 0) PC <-- PC + 2 or 3 |
Нет |
2/3/4 |
SBIS |
A, b |
Пропуск инструкции, если бит в регистре В/В равен 1 |
If (I/O(A,b) =1) PC <-- PC + 2 or 3 |
Нет |
2/3/4 |
BRBS |
s, k |
Переход, если флаг статуса равен 1 |
if (SREG(s) = 1) then PC <-- PC + k + 1 |
Нет |
1/2 |
BRBC |
s, k |
Переход, если флаг статуса равен 0 |
if (SREG(s) = 0) then PC <-- PC + k + 1 |
Нет |
1/2 |
BREQ |
k |
Переход, если равно |
if (Z = 1) then PC <-- PC + k + 1 |
Нет |
1/2 |
BRNE |
k |
Переход, если неравно |
if (Z = 0) then PC <-- PC + k + 1 |
Нет |
1/2 |
BRCS |
k |
Переход, если перенос равен 1 |
if (C = 1) then PC <-- PC + k + 1 |
Нет |
1/2 |
BRCC |
k |
Переход, если перенос равен 0 |
if (C = 0) then PC <-- PC + k + 1 |
Нет |
1/2 |
BRSH |
k |
Переход, если больше или равно |
if (C = 0) then PC <-- PC + k + 1 |
Нет |
1/2 |
BRLO |
k |
Переход, если меньше |
if (C = 1) then PC <-- PC + k + 1 |
Нет |
1/2 |
BRMI |
k |
Переход, если минус |
if (N = 1) then PC <-- PC + k + 1 |
Нет |
1/2 |
BRPL |
k |
Переход, если плюс |
if (N = 0) then PC <-- PC + k + 1 |
Нет |
1/2 |
BRGE |
k |
Переход, если больше или равно (с учетом знака) |
if (N V= 0) then PC <-- PC + k + 1 |
Нет |
1/2 |
BRLT |
k |
Переход, если меньше (с учетом знака) |
if (N V= 1) then PC <-- PC + k + 1 |
Нет |
1/2 |
BRHS |
k |
Переход, если флаг полупереноса равен 1 |
if (H = 1) then PC <-- PC + k + 1 |
Нет |
1/2 |
BRHC |
k |
Переход, если флаг полупереноса равен 0 |
if (H = 0) then PC <-- PC + k + 1 |
Нет |
1/2 |
BRTS |
k |
Переход, если флаг T равен 1 |
if (T = 1) then PC <-- PC + k + 1 |
Нет |
1/2 |
BRTC |
k |
Переход, если флаг T равен 0 |
if (T = 0) then PC <-- PC + k + 1 |
Нет |
1/2 |
BRVS |
k |
Переход, если флаг переполнения равен 1 |
if (V = 1) then PC <-- PC + k + 1 |
Нет |
1/2 |
BRVC |
k |
Переход, если флаг переполнения равен 0 |
if (V = 0) then PC <-- PC + k + 1 |
Нет |
1/2 |
BRIE |
k |
Переход, если прерывания разрешены |
if (I = 1) then PC <-- PC + k + 1 |
Нет |
1/2 |
BRID |
k |
Переход, если прерывания отключены |
if (I = 0) then PC <-- PC + k + 1 |
Нет |
1/2 |
31.3. Инструкции передачи данных
Мнемонический код |
Операнды |
Описание |
Операция |
Флаги |
Количество циклов синхронизации |
MOV |
Rd, Rr |
Копирование регистра |
Rd <-- Rr |
Нет |
1 |
MOVW |
Rd, Rr |
Копирование пары регистров |
Rd+1:Rd <-- Rr+1:Rr |
Нет |
1 |
LDI |
Rd, K |
Загрузка константы в регистр |
Rd <-- K |
Нет |
1 |
LDS |
Rd, k |
Загрузка регистра по прямому адресу памяти данных |
Rd <-- (k) |
Нет |
2(1)(2) |
LD |
Rd, X |
Косвенная загрузка |
Rd <-- (X) |
Нет |
1(1)(2) |
LD |
Rd, X+ |
Косвенная загрузка с последующим инкрементированием |
Rd <-- (X) X <-- X + 1 |
Нет |
1(1)(2) |
LD |
Rd, -X |
Косвенная загрузка с предварительным декрементированием |
X <-- X - 1 <-- X - 1 Rd <-- (X) <-- (X) |
Нет |
2(1)(2) |
LD |
Rd, Y |
Косвенная загрузка |
Rd <-- (Y) <-- (Y) |
Нет |
1(1)(2) |
LD |
Rd, Y+ |
Косвенная загрузка с последующим инкрементированием |
Rd <-- (Y) Y <-- Y + 1 |
Нет |
1(1)(2) |
LD |
Rd, -Y |
Косвенная загрузка с предварительным декрементированием |
Y <-- Y - 1 <-- Y - 1 Rd <-- (Y) <-- (Y) |
Нет |
2(1)(2) |
LDD |
Rd, Y+q |
Косвенная загрузка со смещением |
Rd<--(Y + q) |
Нет |
2(1)(2) |
LD |
Rd, Z |
Косвенная загрузка |
Rd <-- (Z) |
Нет |
1(1)(2) |
LD |
Rd, Z+ |
Косвенная загрузка с последующим инкрементированием |
Rd <-- (Z) Z <-- Z + 1 |
Нет |
1(1)(2) |
LD |
Rd, -Z |
Косвенная загрузка с предварительным декрементированием |
Z <-- Z - 1 <-- Z - 1 Rd <-- (Z) <-- (Z) |
Нет |
2(1)(2) |
LDD |
Rd, Z+q |
Косвенная загрузка со смещением |
Rd <-- (Z + q) |
Нет |
2(1)(2) |
STS |
k, Rr |
Запись по прямому адресу памяти данных |
(k) <-- Rd |
Нет |
2(1) |
ST |
X, Rr |
Косвенная запись |
(X) <-- Rr |
Нет |
1(1) |
ST |
X+, Rr |
Косвенная запись с последующим инкрементированием |
(X) <-- Rr X <-- X + 1 |
Нет |
1(1) |
ST |
-X, Rr |
Косвенная запись с предварительным декрементированием |
X <-- X - 1 (X) <-- Rr |
Нет |
2(1) |
ST |
Y, Rr |
Косвенная запись |
(Y) <-- Rr |
Нет |
1(1) |
ST |
Y+, Rr |
Косвенная запись с последующим инкрементированием |
(Y) <-- Rr Y <-- Y + 1 |
Нет |
1(1) |
ST |
-Y, Rr |
Косвенная запись с предварительным декрементированием |
Y <-- Y - 1 (Y) <-- Rr |
Нет |
2(1) |
STD |
Y+q, Rr |
Косвенная запись со смещением |
(Y + q) <-- Rr |
Нет |
2(1) |
ST |
Z, Rr |
Косвенная запись |
(Z) <-- Rr |
Нет |
1(1) |
ST |
Z+, Rr |
Косвенная запись с последующим инкрементированием |
(Z) <-- Rr Z <-- Z + 1 |
Нет |
1(1) |
ST |
-Z, Rr |
Косвенная запись с предварительным декрементированием |
Z <-- Z - 1 (Z) <-- Rr |
Нет |
2(1) |
STD |
Z+q,Rr |
Косвенная запись со смещением |
(Z + q) <-- Rr |
Нет |
2(1) |
LPM |
|
Чтение памяти программ |
R0 <-- (Z) |
Нет |
3 |
LPM |
Rd, Z |
Чтение памяти программ |
Rd <-- (Z) |
Нет |
3 |
LPM |
Rd, Z+ |
Чтение памяти программ с последующим инкрементированием |
Rd <-- (Z) Z <-- Z + 1 |
Нет |
3 |
ELPM |
|
Расширенное чтение памяти программ |
R0 <-- (RAMPZ:Z) |
Нет |
3 |
ELPM |
Rd, Z |
Расширенное чтение памяти программ |
Rd <-- (RAMPZ:Z) |
Нет |
3 |
ELPM |
Rd, Z+ |
Расширенное чтение памяти программ с последующим инкрементированием |
Rd <-- (RAMPZ:Z) Z <-- Z + 1 |
Нет |
3 |
SPM |
|
Запись в память программ |
(RAMPZ:Z) <-- R1:R0 |
Нет |
- |
SPM |
Z+ |
Запись в память программ с последующим инкрементированием на 2 |
(RAMPZ:Z) <-- R1:R0 Z <-- Z + 2 |
Нет |
- |
IN |
Rd, A |
Чтение из памяти ввода-вывода |
Rd <-- I/O(A) |
Нет |
1 |
OUT |
A, Rr |
Запись в память ввода-вывода |
I/O(A) <-- Rr |
Нет |
1 |
PUSH |
Rr |
Поместить содержимое регистра в стек |
STACK <-- Rr |
Нет |
1(1) |
POP |
Rd |
Извлечь содержимое регистра из стека |
Rd <-- STACK |
Нет |
2(1) |
31.4. Инструкции тестирования и обработки бит
Мнемонический код |
Операнды |
Описание |
Операция |
Флаги |
Количество циклов синхронизации |
LSL |
Rd |
Логический сдвиг влево |
Rd(n+1) <-- Rd(n) Rd(0) <-- 0 C <-- Rd(7) |
Z,C,N,V,H |
1 |
LSR |
Rd |
Логический сдвиг вправо |
Rd(n) <-- Rd(n+1) Rd(7) <-- 0 C <-- Rd(0) |
Z,C,N,V |
1 |
ROL |
Rd |
Циклический сдвиг влево через перенос |
Rd(0) <-- C Rd(n+1) <-- Rd(n) C <-- Rd(7) |
Z,C,N,V,H |
1 |
ROR |
Rd |
Циклический сдвиг вправо через перенос |
Rd(7) <-- C Rd(n) <-- Rd(n+1) C <-- Rd(0) |
Z,C,N,V |
1 |
ASR |
Rd |
Арифметический сдвиг вправо |
Rd(n) <-- Rd(n+1), n=0..6 |
Z,C,N,V |
1 |
SWAP |
Rd |
Обмен тетрадами |
Rd(3..0) <--> Rd(7..4) |
Нет |
1 |
BSET |
s |
Установка флага |
SREG(s) <-- 1 |
SREG(s) |
1 |
BCLR |
s |
Сброс флага |
SREG(s) <-- 0 |
SREG(s) |
1 |
SBI |
A, b |
Установка бита в регистре В/В |
I/O(A, b) <-- 1 |
Нет |
1 |
CBI |
A, b |
Сброс бита в регистре В/В |
I/O(A, b) <-- 0 |
Нет |
1 |
BST |
Rr, b |
Запись бита регистра в бит T |
T <-- Rr(b) |
T |
1 |
BLD |
Rd, b |
Чтение бита Т в бит регистра |
Rd(b) <-- T |
Нет |
1 |
SEC |
|
Установка флага переноса |
C <-- 1 |
C |
1 |
CLC |
|
Сброс флага переноса |
C <-- 0 |
C |
1 |
SEN |
|
Установка флаг отрицательности |
N <-- 1 |
N |
1 |
CLN |
|
Сброс флаг отрицательности |
N <-- 0 |
N |
1 |
SEZ |
|
Установка флага нуля |
Z <-- 1 |
Z |
1 |
CLZ |
|
Сброс флага нуля |
Z <-- 0 |
Z |
1 |
SEI |
|
Общее разрешение прерываний |
I <-- 1 |
I |
1 |
CLI |
|
Общий запрет прерываний |
I <-- 0 |
I |
1 |
SES |
|
Установка флага проверки на знак |
S <-- 1 |
S |
1 |
CLS |
|
Сброс флага проверки на знак |
S <-- 0 |
S |
1 |
SEV |
|
Установка флага переполнения двоичного дополнения |
V <-- 1 |
V |
1 |
CLV |
|
Сброс флага переполнения двоичного дополнения |
V <-- 0 |
V |
1 |
SET |
|
Установка флага T в SREG |
T ? 1 |
T |
1 |
CLT |
|
Сброс флага T в SREG |
T ? 0 |
T |
1 |
SEH |
|
Установка флага полупереноса в SREG |
H ? 1 |
H |
1 |
CLH |
|
Сброс флага полупереноса в SREG |
H <-- 0 |
H |
1 |
31.5. Инструкции управления микроконтроллером
Мнемонический код |
Операнды |
Описание |
Операция |
Флаги |
Количество циклов синхронизации |
BREAK |
|
Останов |
(см. подробное описание инструкции BREAK) |
Нет |
1 |
NOP |
|
Нет операции |
|
Нет |
1 |
SLEEP |
|
Переход в экономичный режим работы |
(см. подробное описание инструкции SLEEP) |
Нет |
1 |
WDR |
|
Сброс сторожевого таймера |
(см. подробное описание инструкции WDR) |
Нет |
1 |
Прим.:
- Количество циклов, необходимых для доступа к памяти данных, распространяются на доступы к внутренней памяти и не имеют отношения к доступам через интерфейс внешнего ОЗУ.
- Для доступа к внутреннему SRAM необходим еще один дополнительный цикл.
|