Типы и виды команд

Все множество команд микроконтроллеров AVR семейства Mega можно разбить на несколько групп:

• команды логических операций;

• команды арифметических операций и команды сдвига;

• команды операций с битами;

• команды пересылки данных;

• команды передачи управления;

• команды управления системой.

Далее коротко описана каждая группа команд.

Команды логических операций (табл. 2) позволяют выполнять стандартные логические операции над байтами, такие как логическое умножение (И), логическое сложение (ИЛИ), операцию «Исключающее ИЛИ», а также вычисление обратного (дополнение до единицы) и дополнительного (дополнение до двух) кодов числа. К этой группе можно отнести также команды очистки/установки регистров и команду перестановки полубайтов. Операции производятся между регистрами общего назначения, либо между регистром и константой; результат сохраняется в РОН. Все команды из этой группы выполняются за один такт.

Таблица 2. Логические команды

Мнемоника Описание Операция Флаги
AND Rd, Rr «Логическое И» двух РОН Rd = Rd • Rr Z,N,V
ANDI Rd, K * «Логическое И» РОН и константы Rd = Rd • К Z,N,V
EOR Rd, Rr «Исключающее ИЛИ» двух РОН Rd = RdÅRr Z,N,V
OR Rd, Rr «Логическое ИЛИ» двух РОН Rd = Rd v Rr Z,N,V
ORI Rd, K * «Логическое ИЛИ» РОН и константы Rd = Rd v K Z,N,V
COM Rd Перевод в обратный код Rd = $FF - Rd Z,C,N,V
NEG Rd Перевод в дополнительный код Rd = $00 - Rd Z,C,N,V,H
CLR Rd Сброс всех битов РОН Rd = RdÅRd Z,N,V
SER Rd * Установка всех битов РОН Rd = $FF -
TST Rd Проверка РОН на отрицательное или нулевое значение Rd • Rd Z,N,V
SWAP Rd Обмен местами полубайтов в РОН Rd(3...0) = Rd(7...4), Rd(7...4) = Rd(3...0) -
0 ≤ d ≤ 31, 0 ≤ r ≤ 31, 0 ≤ K ≤ 255 (* в командах ANDI, ORI и SER: 16 ≤ d ≤ 31)

К группе команд арифметических операций и сдвига (табл. 3) относятся команды, позволяющие выполнять такие базовые операции, как сложение, вычитание, сдвиг (вправо и влево), инкрементирование, декрементирование, а также умножение. Все операции производятся только над регистрами общего назначения. При этом микроконтроллеры AVR позволяют легко оперировать как знаковыми, так и беззнаковыми числами, а также работать с числами, представленными в дополнительном коде. Почти все команды рассматриваемой группы выполняются за один такт. Команды умножения и команды, оперирующие 2-байтными значениями, выполняются за два такта.

Таблица 3. Арифметические и сдвиговые команды

Мнемоника Описание Операция Флаги
ADD Rd, Rr Сложение двух РОН Rd = Rd + Rr Z,C,N,V,H
ADC Rd, Rr Сложение двух РОН с переносом Rd = Rd + Rr + С Z,С,N,V,H
ADIW Rd, K ** Сложение регистровой пары с константой Rd+1:Rd = Rd+1:Rd + K Z,C,N,V,S
SUB Rd, Rr Вычитание двух РОН Rd = Rd - Rr Z,C,N,V,H
SUBI Rd, K * Вычитание константы из РОН Rd = Rd - К Z,C,N,V,H
SBC Rd, Rr Вычитание двух РОН с заемом Rd = Rd – Rr - C Z,C,N,V,H
SBCI Rd, K * Вычитание константы из РОН с заемом Rd = Rd – K - C Z,C,N,V,H
SBIW Rd, K ** Вычитание константы из регистровой пары Rd+1:Rd = Rd+1:Rd - K Z,C,N,V,S
DEC Rd Декрементирование РОН Rd = Rd - 1 Z,N,V
INC Rd Инкрементирование РОН Rd = Rd + 1 Z,N,V
ASR Rd Арифметический сдвиг вправо Rd(n) = Rd(n+1), n = 0..6 Z,C,N,V
LSL Rd Логический сдвиг влево Rd(n+1) = Rd(n), Rd(0) = 0 Z,C,N,V
LSR Rd Логический сдвиг вправо Rd(n) = Rd(n+l), Rd(7) = 0 Z,C,N,V
ROL Rd Сдвиг влево через перенос Rd(0) = C, Rd(n+l) = Rd(n), C = Rd(7) Z,C,N,V
ROR Rd Сдвиг вправо через перенос Rd(7) = C, Rd(n) = Rd(n+l), C = Rd(0) Z,C,N,V
MUL Rd, Rr Умножение беззнаковых чисел R1:R0 = Rd*Rr Z,C
MULS Rd, Rr * Умножение чисел со знаком R1:R0 = Rd*Rr Z,C
MULSU Rd, Rr *** Умножение беззнакового числа на число со знаком R1:R0 = Rd*Rr Z,C
FMUL Rd, Rr *** Умножение дробных беззнаковых чисел R1:R0 = (Rd*Rr) << l Z,C
FMULS Rd, Rr *** Умножение дробных чисел со знаком R1:R0 = (Rd*Rr) << l Z,C
FMULSU Rd, Rr *** Умножение дробного беззнакового числа и дробного числа со знаком R1:R0 = (Rd*Rr) << l Z,C
0 ≤ d ≤ 31, 0 ≤ r ≤ 31, 0 ≤ K ≤ 255 (* в командах SUBI, SBCI, MULS: 16 ≤ d ≤ 31, 16 ≤ r ≤ 31; ** в командах ADIW, SBIW: d = {24, 26, 28, 30}, 0 ≤ K ≤ 63; *** в командах MULSU, FMUL, FMULS, FMULSU 16 ≤ d ≤ 23, 16 ≤ r ≤ 23)

К группе команды битовых операций (табл. 4) относятся команды, выполняющие установку или сброс заданного бита РОН или РВВ. Причем для изменения битов регистра состояния SREG имеются отдельные команды (точнее говоря, эквивалентные мнемонические обозначения общих команд), так как проверка состояния битов именно этого регистра производится чаще всего.

Таблица 4. Команды битовых операций

Мнемоника Описание Операция Флаги
CBR Rd, K * Сброс бита(ов) РОН Rd = Rd • ($FF - K) Z, N, V
SBR Rd, K * Установка бита(ов) РОН Rd = Rd v К Z, N, V
CBI P, b Сброс бита РВВ P.b = 0 -
SBI P, b Установка бита РВВ P.b = 1 -
BCLR s Сброс флага SREG.s = 0 SREG.s
BSET s Установка флага SREG.s = 1 SREG.s
BLD Rd, b Загрузка бита РОН из флага Т (SREG) Rd.b = T -
BST Rr, b Запись бита РОН в флаг Т (SREG) T = Rr.b T
CLC Сброс флага переноса C = 0 С
SEC Установка флага переноса C = 1 С
CLN Сброс флага отрицательного числа N = 0 N
SEN Установка флага отрицательного числа N = 1 N
CLZ Сброс флага нуля Z = 0 Z
SEZ Установка флага нуля Z = 1 Z
CLI Общее запрещение прерываний I = 0 I
SEI Общее разрешение прерываний I = 1 I
CLS Сброс флага знака S = 0 S
SES Установка флага знака S = 1 S
CLV Сброс флага переполнения дополнительного кода V = 0 V
SEV Установка флага переполнения дополнительного кода V = l V
CLT Сброс флага Т T = 0 T
SET Установка флага Т T = l T
CLH Сброс флага половинного переноса H = 0 H
SEH Установка флага половинного переноса H = l H
0 ≤ d ≤ 31, 0 ≤ r ≤ 31, 0 ≤ b ≤ 7, 0 ≤ s ≤ 7, 0 ≤ K ≤ 255 (* в командах CBR, SBR: 16 ≤ d ≤ 31)

Все задействованные биты РВВ имеют свои символические имена. Определения этих имен описаны в том же включаемом файле, что и определения символических имен адресов регистров. Соответственно после включения в программу указанного файла в командах вместо числовых значений номеров битов можно будет указывать их символические имена.

Следует помнить, что в командах CBR и SBR операндом является битовая маска, а не номер бита. Для получения битовой маски из номера бита следует воспользоваться ассемблерным оператором «сдвиг влево» («<<»), как показано в следующем примере:

sbr rl6, (1<<SE) + (1<<SM)

out MCUCR, rl6; Установить флаги SE и SM регистра MCUCR

Всем командам данной группы требуется один такт для выполнения, за исключением команд установки/сброса бита РВВ, выполняемых за 2 такта.

Команды пересылки данных(табл. 5)предназначены для пересылки содержимого ячеек, находящихся в адресном пространстве памяти данных.

Таблица 5. Команды пересылки данных

Мнемоника Описание Операция Флаги
MOV Rd, Rr Пересылка между РОН Rd = Rr -
MOVW Rd, Rr Пересылка 2-байтных значений Rd+l:Rd = Rr+l:Rr -
LDI Rd, K * Загрузка константы в РОН Rd = K -
LD Rd, X Косвенное чтение Rd = [X] -
LD Rd, X+ Косвенное чтение с постинкрементом Rd = [X], X = X + l -
LD Rd, -X Косвенное чтение с преддекрементом X = X - l, Rd = [X] -
LD Rd, Y Косвенное чтение Rd = [Y] -
LD Rd, Y+ Косвенное чтение с постинкрементом Rd = [Y], Y = Y + l -
LD Rd, -Y Косвенное чтение с преддекрементом Y = Y - l, Rd = [Y] -
LDD Rd, Y+q Косвенное относительное чтение Rd= [Y + q] -
LD Rd, Z Косвенное чтение Rd = [Z] -
LD Rd, Z+ Косвенное чтение с постинкрементом Rd = [Z], Z = Z +l -
LD Rd, -Z Косвенное чтение с преддекрементом Z = Z - l, Rd = [Z] -
LDD Rd, Z+q Косвенное относительное чтение Rd = [Z + q] -
LDS Rd, k Непосредственное чтение из ОЗУ Rd = [k] -
ST X, Rr Косвенная запись [X] = Rr -
ST X+, Rr Косвенная запись с постинкрементом [X] = Rr, X = X + l -
ST -X, Rr Косвенная запись с преддекрементом X = X - l, [X] = Rr -
ST Y, Rr Косвенная запись [Y] = Rr -
ST Y+, Rr Косвенная запись с постинкрементом [Y] = Rr, Y = Y + l -
ST -Y, Rr Косвенная запись с преддекрементом Y = Y - l, [X] = Rr -
STD Y+q, Rr Косвенная относительная запись [Y + q] = Rr -
ST Z, Rr Косвенная запись [Z] = Rr -
ST Z+, Rr Косвенная запись с постинкрементом [Z] = Rr, Z = Z + l -
ST -Z, Rr Косвенная запись с преддекрементом Z = Z - l, [Z] = Rr -
STD Z+q, Rr Косвенная относительная запись [Z + q] = Rr -
STS k, Rr Непосредственная запись в ОЗУ [k] = Rr -
LPM Загрузка данных из памяти программ R0 = {Z} -
LPM Rd, Z Загрузка данных из памяти программ Rd = {Z} -
LPM Rd, Z+ Загрузка данных из памяти программ Rd = {Z}, Z = Z + 1 -
SPM Запись в память программ {Z} = R1:R0 -
IN Rd, P Пересылка из РВВ в РОН Rd = P -
OUT P, Rr Пересылка из РОН в РВВ P = Rr -
PUSH Rr Сохранение байта в стеке STACK = Rr -
POP Rd Извлечение байта из стека Rd = STACK -
0 ≤ d ≤ 31, 0 ≤ r ≤ 31, 0 ≤ K ≤ 255, 0 ≤ k ≤ 65535, 0 ≤ q ≤ 63, 0 ≤ P ≤ 63 (* в команде LDI: 16 ≤ d ≤ 31); [] – содержимое памяти данных; {} – содержимое памяти команд

Разделение адресного пространства на три части (РОН, РВВ, ОЗУ) предопределило разнообразие команд данной группы. Пересылка данных, выполняемая командами группы, может производиться в следующих направлениях:

• РОН <=> РОН;

• РОН <=> РВВ;

• РОН <=> память данных.

Также к данной группе можно отнести стековые команды PUSH и POP, позволяющие сохранять в стеке и восстанавливать из стека содержимое РОН.

На выполнение команд данной группы требуется от одного до трех тактов в зависимости от команды.

В группу команд передачи управления (табл. 6) входят команды перехода, вызова подпрограмм и возврата из них и команды типа «проверка/пропуск», пропускающие следующую за ними команду при выполнении некоторого условия. Также к этой группе относят команды сравнения, формирующие флаги регистра SREG и предназначенные, как правило, для работы совместно с командами условного перехода. Все команды условного перехода можно разбить на две подгруппы. Первая подгруппа — команды условного перехода общего назначения. В эту подгруппу входят две команды — BRBS s, k и BRBC s, k, в которых явно задается номер тестируемого флага регистра SREG. Соответственно, переход осуществляется при SREG.s = 0 (BRBC) или SREG.s = 1 (BRBS).

Таблица 6. Команды передачи управления

Мнемоника Описание Операция Флаги
RJMP k ** Относительный безусловный переход РС = РС + к + 1 -
IJMP Косвенный безусловный переход PC = Z -
JMP k *** Абсолютный переход РС = k -
RCALL k ** Относительный вызов подпрограммы STACK = PC, РС = РС + k + 1 -
ICALL Косвенный вызов подпрограммы STACK = PC, PC = Z -
CALL k *** Абсолютный вызов подпрограммы STACK = PC, РС = k -
RET Возврат из подпрограммы PC = STACK -
RETI Возврат из п/п обработки прерывания PC = STACK I
СР Rd, Rr Сравнение РОН Rd - Rr Z,N,V,C,H
СРС Rd, Rr Сравнение РОН с учетом переноса Rd – Rr - C Z,N,V,C,H
CPI Rd, K * Сравнение РОН с константой Rd - K Z,N,V,C,H
CPSE Rd, Rr Сравнение и пропуск следующей команды при равенстве Если Rd = Rr, то PC = PC + 2(3) -
SBRC Rr, b Пропуск следующей команды, если бит РОН сброшен Если Rr.b = 0, то РС = РС + 2(3) -
SBRS Rr, b Пропуск следующей команды, если бит РОН установлен Если Rr.b= 1, то РС = РС + 2(3) -
SBIC P, b Пропуск следующей команды, если бит РВВ сброшен Если P.b = 0, то РС = РС + 2(3) -
SBIS P, b Пропуск следующей команды, если бит РВВ установлен Если P.b = 1, то РС = РС + 2(3) -
BRBC s, k Переход, если флаг s регистра SREG сброшен Eсли SREG.s = 0, то РС = РС + k + 1 -

Окончание табл. 6.

Мнемоника Описание Операция Флаги
BRBS s, k Переход, если флаг s регистра SREG установлен Eсли SREG.s = l, то РС = РС + k + 1 -
BRCS k Переход по переносу Если С = 1, то PC = PC + k + 1 -
BRCC k Переход, если нет переноса Если С = 0, то PC = PC + k + 1 -
BREQ k Переход по «равно» Если Z = 1, то РС = РС + k + 1 -
BRNE k Переход по «не равно» Если Z = 0, то РС = РС + k + 1 -
BRSH k Переход по «больше или равно» Если С = 0, то PC = PC + k + 1 -
BRLO k Переход по «меньше» Если С =1, то PC = PC + k + 1 -
BRMI k Переход по «отрицательное значение» Если N = 1, то РС = РС + k + 1 -
BRPL k Переход по «положительное значение» Если N = 0, то РС = РС + k + 1 -
BRGE k Переход по «больше или равно» (числа со знаком) Если (NÅV) = 0, то PC = PC + k + 1 -
BRLT k Переход по «меньше нуля» (числа со знаком) Ecли (NÅV) = l, то РС = РС + k + 1 -
BRHS k Переход по половинному переносу Если Н = 1, то РС = РС + k + 1 -
BRHC k Переход, если нет половинного переноса Если Н = 0, то РС = РС + k + 1 -
BRTS k Переход, если флаг Т установлен Если Т = 1, то PC = PC + k + 1 -
BRTC k Переход, если флаг Т сброшен Если Т = 0, то PC = PC + k + 1 -
BRVS k Переход по переполнению дополнительного кода Если V = 1, то PC = PC + k + 1 -
BRVC k Переход, если нет переполнения дополнительного кода Если V = 0, то PC = PC + k + 1 -
BRID k Переход, если прерывания запрещены Если I = 0, то PC = PC + k + 1 -
BRIE k Переход, если прерывания разрешены Если I = 1, то PC = PC + k + 1 -
0 ≤ d ≤ 31, 0 ≤ r ≤ 31, 0 ≤ b ≤ 7, 0 ≤ s ≤ 7, 0 ≤ K ≤ 255, -64 ≤ k ≤ 63, 0 ≤ P ≤ 31 (* в команде CPI: 16 ≤ d ≤ 31; ** в командах RJMP, RCALL: -2048 ≤ k ≤ +2047; *** в командах JMP, CALL: 0 ≤ k ≤ 4M)

Другую подгруппу составляют 18 специализированных команд, каждая из которых выполняет переход по какому-либо конкретному условию («равно», «больше или равно», «был перенос» и т. п.). Причем одни команды используются после сравнения беззнаковых чисел, другие — после сравнения чисел со знаком. Вообще говоря, эти команды являются лишь эквивалентными мнемоническими обозначениями команд BRBS s, k и BRBC s, k с определенными значениями операнда s. Команда BREQ k («переход, если равно») имеет, например, такой же код операции, что и команда BRBS 1, k, а команда BRGE k («переход, если больше или равно для чисел со знаком») — BRBC 4, k.

Команды передачи управления нарушают линейное выполнение основной программы, поэтому при каждом выполнении команды этой группы (кроме команд сравнения) нормальное функционирование конвейера нарушается. В результате на выполнение команд затрачивается больше одного такта.

В группу команд управления системой входят всего 4 команды:

• NOP — пустая команда;

• SLEEP — перевод микроконтроллера в режим пониженного энергопотребления;

• WDR — сброс сторожевого таймера;

• BREAK — команда, используемая внутрисхемным отладчиком.

Все команды этой группы, кроме последней, выполняются за один такт.


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: