Команды вызова подпрограммы (icall, rcall, call) работают практически так же, как и команды безусловного перехода. Отличие заключается в том, что, перед тем как выполнить переход, значение счетчика команд сохраняется в стеке. Кроме того, подпрограмма должна заканчиваться командой возврата RET.
Очевидно, что команды передачи управления нарушают нормальное (линейное) выполнение основной программы. Каждый раз, когда выполняется команда из этой группы (кроме команд сравнения), нормальное функционирование конвейера нарушается. Перед загрузкой в конвейер нового адреса производится остановка и очистка выполняемой последовательности команд. Соответственно, реинициализация конвейера приводит к необходимости использования нескольких машинных циклов для выполнения таких команд.
Команды управления системой
В эту группу входят всего 3 команды:
• NOP — пустая команда;
• SLEEP — перевод микроконтроллера в режим пониженного энергопотребления;
• wdr— сброс сторожевого таймера.
Все команды этой группы выполняются за один машинный цикл.
Сводные таблицы команд
В Таблице указаны все команды, которыми располагают микроконтроллеры. В каждой таблице команды сгруппированы по функциональному признаку. В таблицах приведены такие основные сведения о командах, как мнемоническое обозначение команды, ее описание, число машинных циклов, необходимых для ее выполнения, а также флаги регистра SREG, на которые воздействует эта команда.
Группа команд логических операций
Мнемоника | Описание | Операция | Циклы | Флаги |
AND Rd,Rr | «Логическое И» двух РОН | Rd=Rd • Rr | 1 | Z,N,V |
ANDI Rd,K | «Логическое И» РОН и константы | Rd = Rd • К | 1 | Z,N,V |
EOR Rd, Rr | «Исключающее ИЛИ» двух РОН | Rd = Rd ®Rr | 1 | Z,N,V |
OR Rd,Rr | «Логическое ИЛИ» двух РОН | Rd = RdvRr | 1 | Z,N,V |
ORI Rd,K | «Логическое ИЛИ» РОН и константы | Rd = Rd v К | 1 | Z,N,V |
COM Rd | Перевод в обратный код | Rd = $FF-Rd | 1 | Z,C,N,V |
NEG Rd | Перевод в дополнительный код | Rd = $00-Rd | 1 | Z,C,N,V,H |
CLR Rd | Сброс всех разрядов РОН | Rd=Rd®Rd | 1 | Z,N,V |
SER Rd | Установка всех разрядов РОН | Rd =$FF | 1 | |
TST Rd | Проверка РОН на отрицательное или нулевое значение | Rd • Rd | 1 | Z,N,V |
SWAP Rd | Обмен местами тетрад в РОН | Rd(3...O) = Rd(7...4), Rd(7...4) = Rd(3...O) | 1 |
Группа команд арифметических операций
Мнемоника | Описание | Операция | Циклы | Флаги | |||||||||
ADD Rd.Rr | Сложение двух РОН | Rd = Rd + Rr | 1 | Z,C,N,V,H | |||||||||
ADC Rd.Rr | Сложение двух РОН с переносом | Rd = Rd + Rr + C | 1 | Z,C,N,V,H | |||||||||
ADIW Rd,K | Сложение регистровой пары с константой | Rdh:RdI = Rdh:Rdl + К | 2 | Z,C,N,V,S | |||||||||
SUB Rd,Rr | Вычитание двух РОН | Rd = Rd-Rr | 1 | Z,C,N,V,H | |||||||||
SUBI Rd,K | Вычитание константы из РОН | Rd = Rd-K | 1 | Z,C,N,V,H | |||||||||
SBC Rd,Rr | Вычитание двух РОН с заемом | Rd=Rd-Rr-C | 1 | Z,C,N,V,H | |||||||||
SBCI Rd,K | Вычитание константы из РОН с заемом | Rd = Rd-K-C | 1 | Z,C,N,V,H | |||||||||
SBIW Rd,K | Вычитание константы из регистровой пары | Rdh:Rdl = Rdh:Rdt-K | 2 | Z,C,N,V,S | |||||||||
DEC Rd | Декремент РОН | Rd = Rd-l | 1 | Z,N,V | |||||||||
INC Rd | Инкремент РОН | Rd = Rd + 1 | 1 | Z,N,V | |||||||||
ASR Rd | Арифметический сдвиг вправо | Rd(n) = Rd(n+ 1), n = 0...6 | 1 | Z,C,N,V | |||||||||
LSL Rd | Логический сдвиг влево | Rd(n+l) = Rd(n), Rd(0) = 0 | 1 | Z,C,N,V | |||||||||
LSR Rd | Логический сдвиг вправо | Rd(n) = Rd(n+l),Rd(7) = 0 | 1 | Z,C,N,V | |||||||||
Мнемоника | Описание | Операция | Циклы | Флаги | |||||||||
ROL Rd | Сдвиг влево через перенос | Rd(0) = C, Rd(n+l) = Rd(n), С = Rd(7) | 1 | Z,C,N,V | |||||||||
ROR Rd | Сдвиг вправо через перенос | Rd(7) = C, Rd(n) = Rd(n+l), С = Rd(0) | 1 | Z,C,N,V | |||||||||
MUL Rd,Rr | Умножение беззнаковых чисел | Rl:RO = RdXRr | 2 | Z,C | |||||||||
MULS Rd,Rr | Умножение чисел со знаком | Rl:RO = RdXRr | 2 | Z,C | |||||||||
MULSU Rd,Rr | Умножение беззнакового числа на число со знаком | Rl:RO = RdXRr | 2 | Z,C | |||||||||
FMDL Rd,Rr | Умножение дробных беззнаковых чисел | Rl:RO = (RdXRr)«l | 2 | Z,C | |||||||||
FMULSRd,Rr | Умножение дробных чисел со знаком | Rl:RO = (RdXRr)«l | 2 | Z,C | |||||||||
FMULSU Rd,Rr | Умножение дробного беззнакового числа и дробного числа со знаком | Rl:RO = (RdXRr)«1 | 2 | Z,C | |||||||||
Группа команд операций с битами | |||||||||||||
Мнемоника | Описание | Операция | Циклы | Флаги | |||||||||
CBR Rd,K | Сброс разряда(ов) РОН | Rd = Rd»($FF-K) | 1 | Z,N,V | |||||||||
SBR Rd,K | Установка разрада(ов) РОН | Rd=RdvK | 1 | Z, N,V | |||||||||
CBI A,b | Сброс разряда РВВ | A.b = 0 | 2 | ||||||||||
SBI A,b | Установка разряда РВВ | A.b=l | 2 | ||||||||||
BCLR s | Зброс флага | SREG.S - 0 | 1 | SREG.S | |||||||||
BSET s | Установка флага | SREG.S=l | 1 | SREG.S | |||||||||
BLD Rd,b | Загрузка разряда РОН из флага Т (SREG) | Rd.b = T | 1 | ||||||||||
BST Rr,b | Запись разряда РОН в флаг Т (SREG) | T = Rr.b | 1 | T | |||||||||
CLC | Сброс флага переноса | С = 0 | 1 | С | |||||||||
SEC | Установка флага переноса | C=l | 1 | С | |||||||||
CLN | Сброс флага отр. числа | N = 0 | 1 | N | |||||||||
SEN | Установка флага отр. числа | N = 1 | 1 | N | |||||||||
CLZ | Сброс флага нуля | Z = 0 | 1 | Z | |||||||||
SEZ | Установка флага нуля | Z = l | 1 | Z | |||||||||
CLI | Общее запрещение прерываний | 1 = 0 | 1 | I | |||||||||
SEI | Общее разрешение прерываний | 1 = 1 | 1 | I | |||||||||
CLS | Сброс флага знака | S = 0 | 1 | S | |||||||||
SES | Установка флага знака | S = l | 1 | S | |||||||||
CLV | Сброс флага переполнения доп. кода | V = 0 | 1 | V | |||||||||
SEV | Установка флага переполнения доп. кода | V = l | 1 | V | |||||||||
CLT | Сброс флага Т | T = 0 | 1 | T | |||||||||
SET | Установка флага Т | T = l | 1 | T | |||||||||
CLH | Сброс флага половинного переноса | H = 0 | 1 | H | |||||||||
SEH | Установка флага половинного переноса | H = l | 1 | H | |||||||||
Группа команд пересылки данных | |||||||||||||
Мнемоника | Описание | Операция | Циклы | Флаги | |||||||||
MOV Rd,Rr | Пересылка между РОН | Rd = Rr | 1 | ||||||||||
MOVW Rd,Rr | Пересылка двухбайтовых значений | Rd + l:Rd = Rr+l:Rr | 1 | ||||||||||
LDI Rd,K | Загрузка константы в РОН | Rd = K | 1 | ||||||||||
Мнемоника | Описание | Операция | Циклы | Флаги | |||||||||
LD Rd,X | Косвенное чтение | Rd=[X] | 2 | ||||||||||
LD Rd,X+ | Косвенное чтение с постинкрементом | Rd = [X],X = X+I | 2 | ||||||||||
LD Rd,-X | Косвенное чтениес преддекрементом | X = X-l,Rd = [X] | 2 | ||||||||||
LD Rd,Y | Косвенное чтение | Rd=[Y] | 2 | ||||||||||
LD Rd,Y+ | Косвенное чтение с постинкрементом | Rd = [Y],Y = Y+l | 2 | ||||||||||
LD Rd,-Y | Косвенное чтение с преддекрементом | Y=Y-l,Rd=[Y] | 2 | ||||||||||
LDD Rd,Y+q | Косвенное относительное чтение | Rd = [Y+q] | 2 | ||||||||||
LD Rd,Z | Косвенное чтение | Rd = [Z] | 2 | ||||||||||
LD Rd,Z+ | Косвенное чтение с постинкрементом | Rd = [Z],Z = Z+l | 2 | ||||||||||
LD Rd,-Z | Косвенное чтение с преддекрементом | Z = Z - 1, Rd = [Z] | 2 | ||||||||||
LDD Rd,Z+q | Косвенное относительное чтение | Rd = [Z + q] | 2 | ||||||||||
LDS Rd,k | Непосредственное чтение из ОЗУ | Rd = [k] | 2 | ||||||||||
ST X,Rr | Косвенная запись | [X] = Rr | 2 | ||||||||||
ST X+,Rr | Косвенная запись с постинкрементом | [X] = Rr, X=X+1 | 2 | ||||||||||
ST -X,Rr | Косвенная запись с преддекрементом | X = X-l,[X] = Rr | 2 | ||||||||||
ST Y,Rr | Косвенная запись | [Y] = Rr | 2 | ||||||||||
ST Y+,Rr | Косвенная запись с постинкрементом | [Y] = Rr, Y=Y+1 | 2 | ||||||||||
ST –Y, Rr | Косвенная запись с преддекрементом | Y=Y-l,[X] = Rr | 2 | ||||||||||
STD Y+q,Rr | Косвенная относительная запись | [Y+q] = Rr | 2 | ||||||||||
ST Z,Rr | Косвенная запись | [Z] = Rr | 2 | ||||||||||
ST Z+,Rr | Косвенная запись с постинкрементом | [Z] = Rr,Z = Z+l | 2 | ||||||||||
ST –Z,Rr | Косвенная запись с преддекрементом | Z = Z-l,[Z] = Rr | 2 | ||||||||||
STD Z+q,Rr | Косвенная относительная запись | [Z + q] = Rr | 2 | ||||||||||
STS k,Rr | Непосредственная запись в ОЗУ | [k] = Rr | 2 | ||||||||||
LPM | Загрузка данных из памяти программ | R0 = {Z} | 3 | ||||||||||
LPM Rd,Z | Загрузка данных из памяти программ | Rb={Z} | 3 | ||||||||||
LPM Rd,Z+ | Загрузка данных из памяти программ с постинкрементом | Rb = {Z},Z = Z+1 | 3 | ||||||||||
ELPM | Расширенная загрузка данных из памяти программ | RO = {RAMPZ:Z} | 3 | ||||||||||
ELPM Rd,Z | Расширенная загрузка данных из памяти программ | Rb={RAMPZ:Z} | 3 | ||||||||||
ELPM Rd,Z+ | Расширенная загрузка данных из памяти программ с постинкрементом | Rb = {RAMPZ:Z}, RAMPZ:Z = RAMPZ:Z+1 | 3 | ||||||||||
SPM | Запись в память программ | {Z} = RI:R0 | |||||||||||
IN Rd,A | Пересьика из РВВ в РОН | Rd = A | 1 | ||||||||||
OUT A,Rr | Пересылка из РОН в РВВ | A=Rr | 1 | ||||||||||
PUSH Rr | Сохранение байта в стеке | STACK - Rr | 2 | ||||||||||
POP Rd | Извлечение байта из стека | Rd = STACK | 2 | ||||||||||
Группа команд передачи управления | |||||||||||||
Мнемоника | Описание | Операция | Циклы | Флаги | |||||||||
RJMP k | Относительный безусловный переход | РС =РС + к+1 | 2 | ||||||||||
IJMP | Косвенный безусловный переход | РС=Z | 2 | ||||||||||
Мнемоника | Описание | Операция | Циклы | Флаги | |||||||||
JMP к | Абсолютный переход | РС = к | 3 | ||||||||||
RCALL к | Этносительный вызов подпрограммы | PC = PC + к + 1 | 3 | ||||||||||
ICALL | Сосвенный вызов подпрограммы | PC = Z | 3 | ||||||||||
CALL к | Абсолютный вызов подпрограммы | РС = к | 4 | ||||||||||
RET | Возврат из подпрограммы | PC = STACK | 4 | ||||||||||
RETI | Возврат из подпрограммы обработки прерывания | PC = STACK | 4 | ||||||||||
СР Rd,Rr | Сравнение РОН | Rd-Rr | 1 | Z,N,V,C,H | |||||||||
СРС Rd, Rr | Сравнение РОН с учетом переноса | Rd-Rr-C | 1 | Z,N,V,C,H | |||||||||
CPI Rd,K | Сравнение РОН с константой | Rd-K | 1 | Z,N,V,C,H | |||||||||
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=l, то PC = PC + 2 (3) | 1/2/3 | ||||||||||
SBIC A,b | Пропуск след. команды, если разряд РВВ сброшен | Если A.b = 0, то PC = PC + 2 (3) | 1/2/3 | ||||||||||
SBIS A,b | Пропуск след. команды, если разряд РВВ установлен | Если А.Ь= 1, то PC = PC + 2 (3) | 1/2/3 | ||||||||||
BRBC s,k | Переход, если флаг s регистра SREG сброшен | Если SREG.s= 0, то РС = РС + к+1 | 1/2 | ||||||||||
BRBS s,k | Переход, если флаг s регистра SREG установлен | Если SREG.s =1, то РС = РС + к+1 | 1/2 | ||||||||||
BRCS к | Переход по переносу | Если С =1, то РС = РС + к+1 | 1/2 | ||||||||||
BRCC к | Переход, если нет переноса | Если С = 0, то РС = РС + к+1 | 1/2 | ||||||||||
BREQ к | Переход по «равно» | Если Z = l, то РС = РС + к+1 | 1/2 | ||||||||||
BRNE к | Переход по «не равно» | Если Z = 0, то РС = РС + к+1 | 1/2 | ||||||||||
BRSH к | Переход по «выше или равно» | Если С = 0, то РС = РС + к+1 | 1/2 | ||||||||||
BRLO к | Переход по «меньше» | Если С =1, то РС = РС + к+1 | 1/2 | ||||||||||
BRMI . | Переход по «отрицательное значение» | ЕслиN = 1, то РС = РС + к + | 1/2 | ||||||||||
BRPL | Переход по «положительное значение» | Если N = 0, то РС = РС + к+1 | 1/2 | ||||||||||
BRGE | Переход по «больше или равно» (числа со знаком) | Если (N®V) = 0, то PC = PC + к + 1 | 1/2 | ||||||||||
BRLT | Переход по «меньше нуля» (числа со знаком) | Если (N®V)=l, то PC = PC + к + 1 | 1/2 | ||||||||||
BRHS | Переход по половинному переносу | Если Н = 1, то PC = PC + к + 1 | 1/2 | ||||||||||
BRHC | Переход, если нет половинного переноса | Если Н = 0, то PC = PC + к + 1 | 1/2 | ||||||||||
BRTS | Переход, если флаг Т установлен | Если Т= 1, то РС = РС + к+1 | 1/2 | ||||||||||
BRTC | Переход, если флаг Т сброшен | ЕслиТ = 0, тоРС = РС + к+1 | 1/2 | ||||||||||
BRVS | Переход по переполнению доп. кода | ЕслиУ=1, тоРС = РС + к+1 | 1/2 | ||||||||||
BRVC | Переход, если нет переполнения доп. кода | ЕслиУ = 0, тоРС = РС + к+1 | 1/2 | ||||||||||
BRID | Переход, если прерывания запрещены | Если I = 0, тоРС = РС + к+1 | 1/2 | ||||||||||
BRIE | Переход, если прерывания разрешены | Если1 = 1, тоРС = РС + к+1 | 1/2 |
Группа команд управления системой