Арифметические команды рассматривают коды операндов как коды двоичных чисел. Эти команды могут быть разделены на несколько групп.
Команды, приведенные в таблице 4.5, позволяют выполнять операции сложения и вычитания с операндами различных типов при различных ограничениях.
Таблица 4.5. Команды операций (сложение, вычитание)
Мнемо-ника
Операнды
Описание
Операция
Флаги
ADD
Rd, Rr
0 ≤ d ≤ 31
0 ≤ r ≤ 31
Сложить без переноса
Rd Rd + Rr
Z, C, N, V, H
ADC
Rd, Rr
0 ≤ d ≤ 31
0 ≤ r ≤ 31
Сложить с переносом
Rd Rd + Rr + С
Z, C, N, V, H
ADIW
Rd, K
dE{24, 26, 28, 30}
0 ≤ k ≤ 63
Сложить непосредственное значение со словом
Rdh : Rdl
Rdh : Rdl + К
Z, C, N, V
SUB
Rd, Rr
0 ≤ d ≤ 31
0 ≤ r ≤ 31
Вычесть без заема
Rd Rd – Rr
Z, C, N, V, H
SUBI
Rd, К
16 ≤ d ≤ 31 0 ≤ k ≤ 255
Вычесть непосредственное значение
Rd Rd – К
Z, C, N, V, H
SBC
Rd, Rr
0 ≤ d ≤ 31
0 ≤ r ≤ 31
Вычесть с заемом
Rd ß Rd – Rr – C
Z, C, N, V, H
SBCI
Rd, К
16 ≤ d ≤ 32
0 ≤ k ≤ 255
Вычесть непосредственное значение с заемом
RdßRd–K–C
Z, C, N, V, H
SBIW
Rd, К
dE{24, 26, 28, 30} 0 ≤ К ≤ б3
Вычесть непосредственное значение из слова
Rdh : Rdl ß
ß Rdh : Rdl – K
Z, C, N, V
Команды инкремента (увеличения на единицу, INC) и декремента (уменьшения на единицу, DEC) также бывают очень удобны. Их можно в принципе заменить командами суммирования с единицей или вычитания единицы, но инкремент и декремент выполняются быстрее, чем суммиро-вание и вычитание. Эти команды требуют одного входного операнда, который одновременно является и выходным операндом (таблица 4.6).
Таблица 4.6. Команды инкремента и декремента
Мнемо-ника
Операнды
Описание
Операция
Флаги
INC
Rd
0 ≤ d ≤ 31
Инкрементировать
Rd ß Rd + 1
Z, N, V
DEC
Rd
0 ≤ d ≤ 31
Декрементировать
Rd ß Rd – 1
Z, N, V
Команды сравнения, приведенные в таблице 4.7, предназначены для сравнения двух входных операндов. По сути, они вычисляет разность этих двух операндов, но выходного операнда не формируют, а всего лишь изменяет биты в регистре состояния SREG по результату этого вычитания. Следующая за командой сравнения команда (обычно это команда перехода) будет анализировать биты в регистре состояния процессора и выполнять действия в зависимости от их значений.
Таблица 4.7. Команды сравнения
Мнемо-ника
Операнды
Описание
Операция
Флаги
CP
Rd, Rr
0 ≤ d ≤ 31
0 ≤ r ≤ 31
Сравнить
Rd – Rr
Z, C, N, V, H
CPC
Rd, Rr
0 ≤ d ≤ 31
0 ≤ r ≤ 31
Сравнить с учетом переноса
Rd – Rr – C
Z, C, N, V, H
CPI
Rd, К
16 ≤ d ≤ 31
0 ≤ k ≤ 255
Сравнить с константой
Rd – K
Z, C, N, V, H
Логические команды
Логические команды выполняют над операндами логические (побитовые) операции, то есть они рассматривают коды операндов не как единое число, а как набор отдельных битов. Этим они отличаются от арифметических команд. Команды требуют двух входных операндов и формируют один выходной операнд.
Команды логических операций, сведенные в таблицу 4.8, позволяют побитно вычислять основные логические функции от двух входных операндов.
Кроме того, операция И (AND) используется для принудительной очистки заданных битов (в качестве одного из операндов при этом используется код маски, в котором разряды, требующие очистки, установлены в нуль).
Операция ИЛИ (OR) применяется для принудительной установки заданных битов (в качестве одного из операндов при этом используется код маски, в котором разряды, требующие установки в единицу, равны единице).
Операция «Исключающее ИЛИ» (XOR) используется для инверсии заданных битов (в качестве одного из операндов при этом применяется код маски, в котором биты, подлежащие инверсии, установлены в единицу).
Таблица 4.8. Команды логических операций
Мнемо-ника
Операнды
Описание
Операция
Флаги
AND
Rd, Rr
0 ≤ d ≤ 31
0 ≤ r ≤ 31
Выполнить логическое AND
Rd ß Rd × Rr
Z, N, V
ANDI
Rd, К
16≤ d ≤ 31
0 < k ≤ 255
Выполнить логическое AND
Rd ß Rd × К
Z, N, V
OR
Rd, Rr
0 ≤ d ≤ 31
0 ≤ r ≤ 31
Выполнить логическое OR
Rd ßRd Ú Rr
Z, N, V
ORI
Rd, К
16 ≤ d ≤ 31
0 ≤ k ≤ 255
Выполнить логическое OR с непосредственным значением
Rd ß Rd Ú К
Z, N, V
EOR
Rd, Rr
0 ≤ d ≤ 31
0 ≤ r ≤ 31
Выполнить исключающее OR
Rd ß Rd Å Rr
Z, N, V
Команды сдвигов, приведенные в таблице 4.9, позволяют побитно сдвигать код операнда вправо (в сторону младших разрядов) или влево (в сторону старших разрядов). Тип сдвига (логический, арифметический или циклический) определяет, каково будет новое значение старшего бита (при сдвиге вправо) или младшего бита (при сдвиге влево), а также определяет, будет ли где-то сохранено прежнее значение старшего бита (при сдвиге влево) или младшего бита (при сдвиге вправо).
Для примера на рис. 4.1 показаны действия, выполняемые командами сдвигов вправо.
Рис. 4.1. Команды сдвигов вправо.
Таблица 4.9. Команды сдвигов
Мнемо-ника
Операнды
Описание
Операция
Флаги
LSL
Rd
0 ≤ d ≤ 31
Логически сдвинуть влево
Rd(n + 1) ß Rd(n),
Rd(0) ß 0, C ß Rd(7)
Z, C, N, V, H
LSR
Rd
0 ≤ d ≤ 31
Логически сдвинуть вправо
Rd(n) ß Rd(n + 1),
Rd(7) ß 0, C ß Rd(0)
Z, C, N, V
ROL
Rd
0 ≤ d ≤ 31
Сдвинуть влево через перенос
Rd(0) ß C,
Rd(n + 1) ß Rd(n),
C ß Rd(7)
Z, C, N, V, H
ROR
Rd
0 ≤ d ≤ 31
Сдвинуть вправо через перенос
Rd(7) ß C,
Rd(n) ß Rd(n + 1),
C ß Rd(0)
Z, C, N, V
ASR
Rd
0 ≤ d ≤ 31
Арифметически сдвинуть вправо
Rd(n) ß Rd(n + 1), n = 0...6, C ß Rd(0), Rd(7) = const
Z, C, N, V
SWAP
Rd
0 ≤ d ≤ 31
Поменять нибблы местами
Rd(3...0) <–> Rd(7...4)
Нет
Команды проверки битов и операндов (таблица 4.10) предназначены для установки или очистки битов регистров в зависимости от значения выбранных битов или всего операнда в целом. Выходного операнда команды не формируют.
Таблица 4.10. Команды проверки битов и операндов
Мнемо-ника
Операнды
Описание
Операция
Флаги
TST
Rd
0 ≤ r ≤ 31
Проверить на ноль и минус
Rd ß Rd and Rd
Z, N, V
СОМ
Rd
0 ≤ d ≤ 31
Выполнить дополнение до единицы (инверсия)
Rd ß $FF – Rd
Z, C, N, V
NEG
Rd
0 ≤ d ≤ 31
Выполнить дополнение до двух
Rd ß $00 – Rd
Z, C, N, V, H
BST
Rd,b
0 ≤ d ≤ 31
0 ≤ b ≤ 7
Переписать бит из регистра во флаг Т
Т ß Rd(b)
Т
BLD
Rd,b
0 ≤ d ≤ 31
0 ≤ b ≤ 7
Загрузить Т флаг в бит регистра
Rd(b) ß Т
Нет
SBI
P,b
0 ≤ P ≤ 31
0 ≤ b ≤ 7
Установить бит в регистр I/O
I/O (P,b) ß 1
Нет
CBI
P, b
0 ≤ P ≤ 31
0 ≤ b ≤ 7
Очистить бит в регистре I/O
I/O (P,b) ß 0
Нет
SBR
Rd, К
16 ≤ d ≤ 31
0 ≤ k ≤ 255
Установить биты в регистре
Rd ß Rd Ú К
Z, N, V
CBR
Rd, К
16 ≤ d ≤ 31 0 ≤ k ≤ 255
Очистить биты в регистре
Rd ß Rd × ($FF – К)
Z, N, V
SER
Rd
16 ≤ d ≤ 31
Установить все биты регистра
Rd ß $FF
нет
CLR
Rd
0 ≤ d ≤ 31
Очистить регистр
Rd ß Rd Å Rd
Z, N, V
NOP
Нет
Выполнить холостую команду
Нет
SLEEP
Нет
Установить режим SLEEP
Нет
WDR
Нет
Сбросить сторожевой таймер
Нет
Команды установки и очистки битов регистра состояния процессора (то есть флагов) позволяют установить или очистить любой флаг, что бывает очень удобно (таблица 4.11). Каждому флагу обычно соответствуют две команды, одна из которых устанавливает его в единицу, а другая сбрасывает в нуль.
Таблица 4.11. Команды установки и очистки битов (флагов) регистра состояния процессора (SREG).
Мнемоника
Операнды
Описание
Операция
Флаги
BSET
s, 0 ≤ s ≤ 7
Установить флаг
SREG(s) ß 1
SREG(s)
BCLR
s, 0 ≤ s ≤ 7
Очистить флаг
SREG(s) ß 0
SREG(s)
SEI
Нет
Установить флаг глобального прерывания
I ß 1
I
CLI
Нет
Очистить флаг глобального прерывания
I ß 0
I
SET
Нет
Установить флаг Т
T ß 1
T
CLT
Нет
Очистить флаг Т
Т ß 0
T
SEH
Нет
Установить флаг полупереноса
Н ß 1
Н
CLH
Нет
Очистить флаг полупереноса
Н ß 0
Н
SES
Нет
Установить флаг знака
S ß 1
S
CLS
Нет
Очистить флаг знака
S ß 0
S
SEV
Нет
Установить флаг переполнения
V ß 1
V
CLV
Нет
Очистить флаг переполнения
V ß 0
V
SEN
Нет
Установить флаг отрицательного значения
М ß 1
N
CLN
Нет
Очистить флаг отрицательного значения
N ß 0
N
SEZ
Нет
Установить флаг нулевого значения
Z ß 1
Z
CLZ
Нет
Очистить флаг нулевого значения
Z ß 0
Z
SEC
Нет
Установить флаг переноса
С ß 1
С
CLC
Нет
Очистить флаг переноса
С ß 0
С
Команды перехода
Команды переходов предназначены для организации всевозможных циклов, ветвлений, вызовов подпрограмм и т.д., то есть, они нарушают последовательный ход выполнения программы.
Команды безусловных переходов, приведенные в таблице 4.12, вызывают переход в новый адрес, независимо ни от чего. Они могут вызывать переход на указанную величину смещения (вперед или назад) или же на указанный адрес памяти. Величина смещения или новое значение адреса указываются в качестве входного операнда.
Таблица 4.12. Команды безусловных переходов
Мнемо-ника
Операнды
Описание
Операция
Флаги
RJMP
k
–2K < k < 2K
Перейти относительно
PC ß PC + k + 1
Нет
JMP
k
0 < k < 4M
Перейти
PC ß k
Нет
LJMP
Нет
Перейти косвенно
PC ß Z
Нет
Некоторые команды переходов предусматривают в дальнейшем возврат назад, в точку, из которой был сделан переход (таблица 4.13). Если возврат предусмотрен, то текущие параметры процессора сохраняются в стеке.
Таблица 4.13. Команды безусловных переходов с возвратом
Мнемоника
Операнды
Описание
Операция
Флаги
RCALL
k
–2K ≤ k ≤ 2K
Вызвать подпрограмму относительно
PC ß PC + k + 1
Нет
CALL
k
0 ≤ k ≤ 64K
Выполнить длинный вызов подпрограммы
PC ß k
Нет
ICALL
Нет
Вызвать подпрограмму косвенно
PC ß Z
Нет
RET
Нет
Вернуться из подпрограммы
PC ß STACK
Нет
RETI
Нет
Вернуться из прерывания
PC ß STACK
I
Команды условных переходов вызывают переход не всегда, а только при выполнении заданных условий (таблица 4.14).
Таблица 4.14. Команды условных переходов
Мнемо-ника
Операнды
Описание
Операция
Флаги
CPSE
Rd, Rr
0≤ d ≤31,
0 ≤ r ≤ 31
Сравнить и пропустить, если равно
if Rd = Rr then
PC ß PC + 2 (or 3)
Нет
SBRC
Rr, b
0 ≤ r ≤ 31
0 ≤ b ≤ 7
Пропустить, если бит в регистре очищен
if Rr(b) = 0 then
PC ß PC + 2 (or 3)
Нет
SBRS
Rr, b
0 ≤ r ≤ 31
0 ≤ b ≤ 7
Пропустить, если бит в регистре установлен
if Rr(b) = 1 then
PC ß PC + 2 (or 3)
Нет
SBIC
P, b
0 ≤ P ≤ 31
0 ≤ b ≤ 7
Пропустить, если бит в регистре I/O очищен
if I/O P(b) = 0 then
PC ß PC + 2 (or 3)
Нет
SBIS
P, b
0 ≤ r ≤ 31
0 ≤ b ≤ 7
Пропустить, если бит в регистре I/O установлен
if l/O P(b) = 1 then
PC ß PC + 2 (or 3)
Нет
Часто в качестве условий выступают значения флагов в регистре состояния процессора (SREG). То есть условием перехода является результат предыдущей операции, меняющей значения флагов (таблица 4.15).
Таблица 4.15. Команды условных переходов по состоянию флагов