Система команд микроконтроллеров AVR
Транслятор ассемблера позволяет использовать в тексте программы мнемоники (обозначения команд микроконтроллера), полностью совпадающие с их названием в системе команд микроконтроллера.
Множество команд микроконтроллеров AVR семейства Classic можно представить несколькими группами:
· Команды пересылки данных;
· Команды арифметических операций и команды сдвига;
· Команды логических операций;
· Команды передачи управления;
· Команды операций с битами;
· Команды управления системой.
Рассмотрим каждую группу подробнее.
2.3.1. Команды логических операций
Эти команды позволяют выполнять стандартные логические операции над байтами, такие как «логическое умножение» (И), «логическое сложение» (ИЛИ), операцию «исключающее ИЛИ», а также вычисление обратного и дополнительного кодов числа. К этой группе можно отнести также команды очистки/установки регистров и команд перестановки тетрад. Все операции производятся над регистрами общего назначения, результат сохраняется в одном из РОН. Все логические операции выполняются за один машинный цикл.
Рассмотрим наиболее часто используемые команды логических операций с примерами ( все команды логических операций представлены в таблице 2.1):
1. «Логическое И» двух РОН- ANDRd, Rr
Операция: Rd=RdANDRr
Описание:Выполняет операцию «Логическое И» между содержимым регистров Rd и Rr
Пример: ldiR16,1 ;загрузить 1 в R16
andR2,R16 ;произвести операцию «Логическое И»
2. «Логическое И» РОН и константы- ANDIRd, K
Операция:Rd=RdANDK
Описание:Выполняет операцию «Логическое И» между содержимым регистра Rd и 8- разрядным числом. Результат помещается в регистр Rd. Команда применима только к 16 старшим РОН (R16…R31)
Пример: andiR17,$0F ; обнулить старший полубайт регистра R17
andiR18,$10 ;выделить 4-ый разряд в регистре R18
3. «Логическое ИЛИ» двух РОН- ORRd ,Rr
Операция:Rd=RdÚRr
Описание: Выполняет операцию «Логическое ИЛИ» между регистрами Rd и Rr. Результат помещается в регистр Rd
Пример: orR15,R16 ;поразрядное ИЛИ R15 и R16
bstR15,6 ;записать 6-ой разряд регистра R15 в флаг Т
brtsok ;перейти если флаг Т равен «1»
…
ok:
…
4. «Логическое ИЛИ» РОН и константы-ORIRd, К
Операция:Rd=RdÚK
Описание: Выполняет операцию «Логическое ИЛИ» между регистром Rd и константой К. Результат помещается в регистр Rd. Команда применима только к 16 старшим РОН (R16…R31)
Пример:oriR17,$0F ;установить старший полубайт регистра R17
oriR18,1 ;установить 0-й разряд регистра R18
5. «Исключающее ИЛИ» двух РОН- EORRd, Rr
Операция:Rd=RdÅRr
Описание:Выполняет операцию «Исключающее ИЛИ» между регистрами Rd и Rr. Результат помещается в регистр Rd
Пример:eorR2,R2 ;очистка регистра R2
eorR0,R22 ; побитовое «Исключающее ИЛИ» между R0 и R22
6. Очистка РОН- CLR Rd
Операция:Rd= RdÅRd
Описание:Сбрасывает все разряды регистра общего назначения путем выполнения операции «Исключающее ИЛИ» регистра с самим собой
Пример:Организация цикла с заданным числом повторений
clrR18 ;очистить регистр R18
loop:
inkR18 ;R18=R18+1
…
cpiR18,$50 ;завершить цикл?
brneloop
Таблица 2.1. Команды логических операций
Мнемоника | Описание | Операции | Циклы | Флаги |
AND Rd,Rr | «Логическое И» двух РОН | Rd=Rd*Rr | Z,N,V | |
ANDI Rd,K | «Логическое И» РОН и константы | Rd=Rd*K | Z,N,V | |
EOR Rd,Rr | «Исключающее ИЛИ» двух РОН | Rd=RdÅRr | Z,N,V | |
OR Rd,Rr | «Логическое ИЛИ» двух РОН | Rd=RdÚRr | Z,N,V | |
ORI Rd,K | «Логическое ИЛИ» РОН и константы | Rd=RdÚ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) | - |
2.3.2. Команды арифметических операций и команды сдвига
К данной группе относятся команды, выполняющие такие базовые операции, как сложение, вычитание, сдвиг (вправо и влево), инкремент и декремент. Все операции производятся только над РОН. При этом микроконтроллер позволяет легко оперировать как знаковыми, так и беззнаковыми числами, а также работать с числами, представленными в дополнительном коде.
Все команды рассматриваемой группы выполняются за один машинный цикл, за исключением команд, оперирующих двухбайтовыми значениями, которые выполняются за два цикла.
Рассмотрим наиболее часто используемые команды арифметических операций и команды сдвига с примерами ( все команды арифметических операций и команды сдвига представлены в таблице 2.2):
:
1. Сложение двух РОН- ADDRd, Rr
Операция:Rd=Rd+Rr
Описание:Выполняет операцию сложения между содержимым регистров Rd и Rr
Пример:addR16,R18 ;сложить два регистра
2. Сложение регистровой пары с константой- ADIWRd, К
Операция:Rd+1:Rd=Rd+1:Rd+K
Описание:Складывает содержимое регистровой пары Rd+1:Rd с 6-разрядным числом. Результат помещается обратно в регистровую пару.
Пример:adiwR24,1 ;прибавить 1 к R25:R24
adiwR30,63 ;прибавить 63 к указателю Z(R31:R30)
3. Вычитание двух РОН- SUBRd, Rr
Операция:Rd=Rd-Rr
Описание:Вычитает из регистра Rd содержимое регистра Rr. Результат помещается в регистр Rd
Пример:subR13,R12 ;вычесть R12 из R13 (R13=R13-R12)
brnenoteq ;перейти, если R12 не равно R13
…
noteq:
…
4. Вычитание константы из регистра- SUBIRd, K
Операция:Rd=Rd-K
Описание:Вычитает из регистраRd значение константы К.Результат помещается обратно в регистр. Данная команда применима только к старшей половине регистров общего назначения
Пример:subiR22,$11 ;вычесть $11 из R22
brnenoteq ;перейти, если R22 не равно $11
…
noteq:
…
5. Декремент РОН- DEC Rd
Операция:Rd=Rd-1
тОписание:Уменьшает содержимое регистра Rd на единицу. Так как эта команда не влияет на флаг переноса С, она идеально подходит для организации счетчика числа интераций цикла при выполнении вычислений над многоразрядными числами. При работе с беззнаковыми числами для выполнения перехода в соответствии с результатом выполнения команды могут использоваться только команды условного перехода BREQ и BRNE. При работе с числами в дополнительном коде могут использоваться все команды условного перехода для знаковых проверок. Флаг V устанавливается в «1» только в том случае, если до выполнения операции в регистре находилось значение $80
Пример:ldiR17,$10 ;записать число16 в регистр R17
loop:
add R1,R2 ;R1=R1+R2
decR17 ;декрементировать R17
brneloop ;перейти, если R17 не равно 0
…
6. Инкремент РОН- INC Rd
Операция:Rd=Rd+1
Описание:Увеличивает содержимое регистра Rd на единицу. Так как эта команда не влияет на флаг переноса С, она идеально подходит для организации счетчика числа интераций цикла при выполнении вычислений над многоразрядными числами. При работе с беззнаковыми числами для выполнения перехода в соответствии с результатом выполнения команды могут использоваться только команды условного перехода BREQ и BRNE. При работе с числами в дополнительном коде могут использоваться все команды условного перехода для знаковых проверок. Флаг V устанавливается в «1» только в том случае, если до выполнения операции в регистре находилось значение $7F
Пример:clrR22 ;очистить регистр R22
loop:
inc R22 ;R22=R22+1
…
cpiR22,$4F ;
brneloop ;продолжать цикл, если R22 не равно $4F
…
7.Арифметический сдвиг вправо- ASR Rd
Операция:Rd(n)=Rd(n+1),n=0…6
Описание:Сдвигает содержимое регистра Rd на 1 разряд вправо. Состояние 7-го разряда не изменяется. Значение 0-го разряда помещается в флаг С регистра SPEG. Часто используется для деления чисел со знаком на два
Пример:ldiR16,$10 ;записать число 16 в регистр R16
asrR16 ; R16=R16/2
ldiR17,$FC ;записать число -4 в регистр R17
asr R17 ; R17=R17/2
8. Логический сдвиг влево- LSL Rd
Операция:Rd(n+1)=Rd(n),Rd(0)=0
Описание:Сдвигает все разряды регистра Rd влево. Разряд b0 сбрасывается в «0», а разряд b7 загружается в флаг С регистра SPEG. Эквивалентна команде ADDRd,Rd
Пример:addR0,R4 ; R0=R0+R4
lsl R0 ;R0=R0*2
9. Логический сдвиг вправо- LSR Rd
Операция:Rd(n)=Rd(n+1) Rd(7)=0
Описание:Сдвигает все разряды регистра Rd вправо. Разряд b7 сбрасывается в «0», а разряд b0 загружается в флаг С регистра SPEG.
Пример:addR0,R4 ; R0=R0+R4
lsrR0 ;R0=R0/2
Таблица 2.2. Команды арифметических операций и команд сдвига
Мнемоника | Описание | Операция | Циклы | Флаги |
ADD Rd,Rr | Сложение двух РОН | Rd=Rd+Rr | Z,C,N,V,H | |
ADC Rd,Rr | Сложение двух РОН с переносом | Rd=Rd+Rd+C | Z,C,N,V,H | |
ADIW Rd,K | Сложение регистровой пары с константой | Rdh:Rdl=Rdh:Rdl+K | Z,C,N,V,S | |
SUB Rd,Rr | Вычитание двух РОН | Rd=Rd-Rr | Z,C,N,V,H | |
SUBI Rd,K | Вычитание константы из РОН | Rd=Rd-K | 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 | Вычитание константы из регистровой пары | Rdh:Rdl=Rdh:Rdl-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+1) Rd(7)=0 | Z,C,N,V | |
ROL Rd | Сдвиг влево через перенос | Rd(0)=C,Rd(n+1)=Rd(n),C=Rd(7) | Z,C,N,V | |
ROR Rd | Сдвиг вправо через перенос | Rd(7)=C,Rd(n)=Rd(n+1), C=Rd(0) | Z,C,N,V |
2.3.3. Команды операций с битами
К данной группе относятся команды, выполняющие установку или сброс заданного разряда РОН или РВВ. Причем для изменения состояния разрядов регистра состояния SREG имеются также дополнительные команды (точнее, эквивалентные мнемонические обозначения общих команд), т.к. проверка состояния разрядов именно этого регистра производится чаще всего. Условно к этой группе можно отнести также две команды передачи управления типа «проверка/пропуск», которые пропускают следующую команду в зависимости от состояния разрядов РОН или РВВ.
Всем командам данной группы (Таблица 2.3) требуется один машинный цикл для выполнения, за исключением случаев, когда в результате проверки происходит пропуск команды. В этом случае команда выполняется за два или три машинных цикла в зависимости от пропускаемой команды.
Рассмотрим наиболее часто используемые команды операций с битами с примерами ( все команды операций с битами представлены в таблице 2.3):
1. Сбросить разряд- CBI A, b
Операция: A.b = 0
Описание:Сбрасывает разряд b регистра ввода/вывода, расположенного по адресу А пространства ввода/вывода. Эта команда применима только к младшим 32 регистрам (адреса 0…31)
Пример:cbi $12,7 ;cбросить 7-ой разряд порта D
2. Установить разряд РВВ- SBIA, b
Операция:A.b = 1
Описание:Устанавливает разряд b регистра ввода/вывода, расположенного по адресу А пространства ввода/вывода. Эта команда применима только к младшим 32 регистрам (адреса 0…31)
Пример:out $1E,R0 ;задать адрес ячейки EEPROM
sbi $1C,0 ;установить запрос на чтение
inR1,$1D ;считать данные из EEPROM
3. Пересылка флага Т в разряд РОН- BLDRd,b
Операция:Rd.b = T
Описание:Копирует флаг Т регистраSPEG в разряд b регистра Rd
Пример:bstR1,2 ;сохранить 2-ой разряд регистра R1 в T
BldR0,4 ;записать флаг Т в 4-й разряд регистра R0
4. Запись разряда РОН в флаг Т- BSTRd,b
Операция:T=Rd.b
Описание:Копирует разряд b регистра Rd в флаг Т регистра SPEG
Пример:bstR1,2 ;сохранить 2-й разряд регистра R1 вТ
bldR0,4 ;записать флаг Т в 4-й разряд регистра R0
5. Общее запрещение прерываний- CLI
Операция:I=0
Описание:Сбрасывает в «0» флаг общего разрешения прерываний I регистра SPEG. Эквивалентна команде BCLR 7
Пример:cli ;запретить прерывания
inR11,$16 ;прочитать состояние порта В
sei ;разрешить прерывания
6. Общее разрешение прерываний- SEI
Операция: I=1
Описание:Устанавливает в «1» флаг общего разрешения прерываний I регистра SPEG. Эквивалентна команде BSET 7
Пример:cli ;запретить прерывания
inR13,$16 ;прочитать состояние порта В
sei ;разрешить прерывания
7. Cброс флага Т- CLT
Операция: T=0
Описание:Сбрасывает в «0» флаг Т регистра SPEG. Эквивалентна команде BCLR 6
Пример:clt ;сбросить флаг Т
8. Установка флага Т- SET
Операция:T=1
Описание:Устанавливает в «1» флаг Т регистра SPEG.Эквивалентна команде BSET 6
Пример:set ;установить флаг Т
Таблица 2.3.Команды операций с разрядами
Мнемоника | Описание | Операция | Циклы | Флаги |
CBR Rd,K | Сброс разряда(ов) РОН | Rd=Rd*($FF-K) | Z,N,V | |
SBR Rd,K | Установка разряда(ов) РОН | Rd=RdÚK | Z,N,V | |
CBI A,b | Сброс разряда РВВ | A.b = 0 | - | |
SBI A,b | Установка разряда РВВ | A.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=Rd.b | T | |
CLC | Сброс флага переноса | C=0 | C | |
SEC | Установка флага переноса | C=1 | C | |
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=1 | V | |
CLT | Сброс флага Т | T=0 | T | |
SET | Установка флага Т | T=1 | T | |
CLH | Сброс флага половинного переноса | H=0 | H | |
SEH | Установка флага половинного переноса | H=1 | H |
2.3.4. Команды пересылки данных
Команды этой группы (Таблица 2.4) предназначены для пересылки содержимого ячеек, находящихся в адресном пространстве памяти данных. Разделение адресного пространства на три части (РОН, РВВ, ОЗУ) предопределило разнообразие команд данной группы. Пересылка данных, выполняемая командами группы, может производиться в следующих направлениях:
· РОНÛРОН;
· РОНÛРВВ;
· РОНÛ память данных.
Также к данной группе можно отнести стековые команды PUSH и POP (отсутствуют вAT90S1200), позволяющие сохранять в стеке и восстанавливать из стека содержимое РОН.
На выполнение команд данной группы требуется от одного до трех машинных циклов в зависимости от команды.
Рассмотрим наиболее часто используемые команды пересылки данных с примерами:
1. Пересылка между РОН- MOVRd, Rr
Операция:Rd=Rr
Описание:Копирует содержимое регистра Rr в регистр Rd. Регистр-источник (Rr) не изменяется
Пример:movR16, R0 ;переслать содержимое R0 в R16
callchec ;вызвать подпрограмму
…
chec:
cpiR16, $11 ;сравнить R16 с $11
…
ret ;вернуться из подпрограммы
2. Загрузка константы в РОН- LDIRd, K
Операция:Rd=K
Описание:Загружает 8-разрядное число в регистр общего назначения Rd. Данная команда применима только к старшей половине РОН (адреса 16…31)
Пример: сlrR31 ;очистить ст. байт индексного регистра Z
ldiR30, $F0 ;загрузить адрес в регистр Z
lpm ;загрузить константу из памяти программ
;по адресу $00F0
3. Косвенное чтение памяти данных- LDRd, Y
Операция:Rd=[Y]
Описание:Загружает один байт из адресного пространства памяти данных в регистр общего назначения Rd. Адрес ячейки памяти, к которой производится обращение, содержится в индексном регистре Y
Пример:clrR29 ;очистить ст. байт индексного регистра
ldiR28, $60 ;загрузить мл. байт адреса
ld R1, Y ;R1=[$0060]
4. Непосредственная загрузка из памяти данных- LDSRd, K
Операция:Rd=[k]
Описание:Загружает один байт из адресного пространства памяти данных в регистр общего назначения Rd. Адрес ячейки памяти, к которой производится обращение, задается константой К.
Пример:ldsR2, $FF00 ;R2=[$FF00]
addR2, R1 ;R2=R2+R1
sts $FF000, R2 ;записать результат по тому же адресу
5. Косвенная запись в память данных- STX, Rd
Операция:[X]=Rr
Описание:Сохраняет содержимое регистра общего назначения Rr в памяти данных. Адрес ячейки памяти, к которой производится обращение, содержится в индексном регистре Х
Пример: clrR27 ;очистить ст. байт индексного регистра
ldiR26, $60 ;загрузить мл. байт адреса
stX, R1 ;загрузить R1 по адресу $0060
6. Непосредственная запись в память данных- STSK, Rd
Операция:[k]=Rd
Описание:Сохраняет содержимое регистра общего назначения Rd в памяти данных. Адрес ячейки памяти, к которой производится обращение, задается константой К
Пример:ldsR2, $FF00 ;R2=[$FF00]
addR2, R1 ;R2=R2+R1
sts $FF000,R2 ;записать результат по тому же адресу
Таблица 2.4. Команды пересылки данных
Мнемоника | Описание | Операции | Циклы | Флаги |
MOV Rd,Rr | Пересылка между РОН | Rd=Rr | ||
LDI 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] | ||
LDS Rd,k | Непосредственное чтение из ОЗУ | Rd=[k] | ||
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 | ||
STD Z+q,Rr | Косвенная относительная запись | [Z+q]=Rr | ||
STS k,Rr | Непосредственная запись в ОЗУ | [k]=Rr | ||
LPM | Загрузка данных из памяти программ | R0={Z} | ||
IN Rd,A | Пересылка из РВВ в РОН | Rd=A | ||
OUT A,Rr | Пересылка из РОН в РВВ | A=Rr | ||
PUSH Rr | Сохранение байта в стеке | STACK=Rr | ||
POP Rd | Извлечение байта из стека | Rd=STACK |
2.3.5. Команды передачи управления
В эту группу (Таблица 2.5) входят команды перехода, вызова подпрограмм и возврат из них и команд типа «проверка/пропуск», пропускающие следующую за ними команду при выполнении некоторого условия. Также к этой группе относятся команды сравнения, формирующие флаги регистра SREG и предназначенные, как правило, для работы совместно с командами условного перехода.
Очевидно, что команды передачи управления нарушают нормальное (линейное) выполнение основной программы. Каждый раз, когда выполняется команда из этой группы (кроме команд сравнения), нормальное функционирование конвейера нарушается. Перед загрузкой в конвейер нового адреса производятся остановка и очистка выполняемой последовательности команд. Соответственно реинициализация конвейера приводит к необходимости использования нескольких машинных циклов для выполнения таких команд.
Рассмотрим наиболее часто используемые команды передачи управления с примерами:
1. Относительный безусловный переход- RJMP k
Операция: PC=PC+k+1
Описание:Выполняет переход по адресу, равному сумме содержимого счетчика команд и константы k. На практике вместо числовых значений смещения используются метки
Пример: сpiR16, $42 ;сравнить R16 с числом $42
brneM1 ;перейти к M1, если R16 не равно $42
rjmpok ;безусловный переход
M1:
addR16, R17 ;прибавить R16 к R17
ink R16 ;R16=R16+1
ok:
…
2. Относительный вызов подпрограммы- RCALL k
Операция:PC=PC+k+1
Описание:Выполняет переход к подпрограмме, адрес которой получается сложением содержимого счетчика команд с константой k. Адрес следующей за RCALL командой (2 байта) сохраняется в стеке. На практике вместо числовых значений смещения указываются метки подпрограмм
Пример:rcallroutine ;вызвать подпрограмму
…
routine:
pushR14 ;сохранить содержимое R14
…
popR14 ;восстановить содержимое R14
ret ;возврат из подпрограммы
3. Возврат из подпрограммы- RET
Операция:PC=STACK
Описание:Выполняет возврат в то место, откуда подпрограмма была вызвана
Пример:rcallroutine ;вызвать подпрограмму
…
routine:
pushR14 ;сохранить содержимое R14
…
popR14 ;восстановить содержимое R14
ret ;возврат из подпрограммы
4. Пропуск команды при равенстве двух РОН- CPSERd, Rr
Операция:Если Rd=Rr, то PC=PC+2(3), иначе РС=РС+1
Описание:Сравнивает содержимое двух регистров общего назначения Rd и Rr и пропускает следующую команду, если в регистрах записаны одинаковые значения
Пример:inkR4 ;увеличить R4 (R4=R4+1)
cpseR4, R0;сравнить содержимоеR4 и R0
negR4 ;проинвертировать R4, если R4 не равно R0
…
5. Сравнение РОН- CP Rd, Rr
Операция: Rd-Rr
Описание:Сравнивает содержимое двух РОН путем вычитания содержимого регистра Rr из содержимого регистра Rd. Данная команда влияет только на флаги регистра состояния SPEG, которые устанавливаются в соответствии с результатом вычитания. Содержимое регистров не изменяется. Как правило, данная команда используется совместно с одной из команд условного перехода
Пример:cpR4, R19 ;сравнить R4 с R19 (R=R4-R19)
brnenoteq ;перейти, если R4<>R19
…
noteq:
…
6. Сравнение содержимого РОН с константой- CPIRd, K
Операция:Rd-K
Описание:Сравнивает содержимое РОН Rd с константой К путем вычитания константы из содержимого регистра Rd. Данная команда влияет только на флаги регистра состояния SPEG, которые устанавливаются в соответствии с результатом вычитания. Содержимое регистра Rd не изменяется. Как правило, данная команда используется совместно с одной из команд условного перехода
Пример:cpiR19, 3 ;сравнить R19 с числом 3 (R=R19-3)
brnenoteq ;перейти, если R19<>3
…
noteq:
…
7. Переход по условию «равно»- BREQk
Операция: Если Z=1, то PC=PC+k+1, иначе РС=РС+1
Описание:Условный относительный переход. Проверяет флаг нуля (Z) и выполняет переход, если этот разряд установлен. Величина смещения k представляется числом в дополнительном коде. При выполнении данной команды сразу же после команды CP, CPI, SUB или SUBI переход произойдет только в том случае, если число (со знаком или без знака), находящееся в регистре Rd, будет равно числу (со знаком или без знака), находящемуся в регистре Rr. Эквивалентна команде BRBS 1, k
Пример:cpR1, R0 ;сравнить R1 с R0
breqequal ;перейти, если R1=R2
…
equal:
…
8. Переход по условию «не равно»- BRNEk
Операция: Если Z=0, то PC=PC+k+1, иначе РС=РС+1
Описание:Условный относительный переход. Проверяет флаг нуля (Z) и выполняет переход, если этот разряд сброшен. Величина смещения k представляется числом в дополнительном коде. При выполнении данной команды сразу же после команды CP, CPI, SUB или SUBI переход произойдет только в том случае, если числа (со знаком или без знака), находящиеся в регистрах Rd и Rr, не будут равны. Эквивалентна команде BRBC 1,k
Пример:eorR27, R27 ;очистить R27
loop: incR27 ;R27=R27+1
…
cpiR27, 5 ;сравнить R27 с 5
brneloop ;перейти, если R27 не равно 5
…
9. Переход по условию «выше или равно» (для беззнаковых данных)- BRSHk
Операция:Если C=0, то PC=PC+k+1, иначе РС=РС+1
Описание:Условный относительный переход. Проверяет флаг переноса (С) и выполняет переход, если этот разряд сброшен. Величина смещения k представляется числом в дополнительном коде. При выполнении данной команды сразу же после команды CP, CPI, SUB или SUBI переход произойдет только в том случае, если беззнаковое число, находящееся в регистре Rd, будет больше (или равно) беззнакового числа, находящегося в регистре Rr. Эквивалентна команде BRBC 0,k
Пример:subiR19,4 ;R19=R19-4
brshhgsm ;перейти, если R19 больше или равно 4
…
hgsm:
…
10. Переход по условию «меньше» (для беззнаковых данных)- BRLOk
Операция:Если C=1, то PC=PC+k+1, иначе РС=РС+1
Описание:Условный относительный переход. Проверяет флаг переноса (С) и выполняет переход, если этот разряд установлен. Величина смещения k представляется числом в дополнительном коде. При выполнении данной команды сразу же после команды CP, CPI, SUB или SUBI переход произойдет только в том случае, если беззнаковое число, находящееся в регистре Rd, будет меньше беззнакового числа, находящееся в регистре Rr. Эквивалентна команде BRBS 0,k
Пример:eorR19, R19 ;очистить R19
loop: incR19 ;R19=R19+1
…
cpiR19, $10 ;сравнить R19 с $10
brloloop ;перейти, если R19<$10
…
11. Переход по условию «отрицательное значение»- BRMIk
Операция:Если N=1, то PC=PC+k+1, иначе РС=РС+1
Описание:Условный относительный переход. Проверяет флаг отрицательного значения (N) и выполняет переход, если этот разряд установлен. Величина смещения k представляется числом в дополнительном коде. Эквивалентна команде BRBS 2, k
Пример:subiR18, 4 ;R18=R18-4
brmiminus ;перейти, если результат отрицательный
…
minus:
…
12. Переход по условию «положительное значение»- BRPLk
Операция:Если N=0, то PC=PC+k+1, иначе РС=РС+1
Описание:Условный относительный переход. Проверяет флаг отрицательного значения (N) и выполняет переход, если этот разряд сброшен. Величина смещения k представляется числом в дополнительном коде. Эквивалентна команде BRBC 2, k
Пример:subiR26, $50 ;R26=R26-$50
brplplus ;перейти, если результат положительный
…
plus:
…
Таблица 2.5. Команды передачи управления
Мнемоника | Описание | Операция | Цикл | Флаги |
RJMP k | Относительный безусловный переход | PC=PC+k+1 | - | |
IJMP | Косвенный безусловный переход | PC=Z | - | |
RCALL | Относительный вызов подпрограммы | PC=PC+k+1 | - | |
ICALL | Косвенный вызов подпрограммы | PC=Z | - | |
RET | Возврат из подпрограммы | PC=STACK | - | |
RETI | Возврат из подпрограммы обработки прерывания | PC=STACK | I | |
CP Rd,Rr | Сравнение РОН | Rd-Rr | Z,N,V,C,H | |
CPC 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) | 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 A,b | Пропуск след. команды, если разряд РВВ сброшен | Если A.b=0, то PC=PC+2(3) | 1/2/3 | - |
SBIS A,b | Пропуск след. команды, если разряд РВВ установлен | Если A.b=1, то PC=PC+2(3) | 1/2/3 | - |
BRBC s,k | Переход, если флаг s регистра SREG сброшен | Если SREG.s =0, то PC=PC+k+1 | 1/2 | - |
BRBS s,k | Переход, если флаг s регистра SREG установлен | Если SREG.s =1, то 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 | - |
BREQ k | Переход по условию «равно» | Если Z=1, то PC=PC+k+1 | 1/2 | - |
BRNE k | Переход по условию «не равно» | Если Z=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 | Переход по условию «отрицательное значение» | Если N=1, то PC=PC+k+1 | 1/2 | - |
BRPL | Переход по условию «положительное значение» | Если N=0, то PC=PC+k+1 | 1/2 | - |
BRGE | Переход по условию «больше или равно» (числа со знаком) | Если (NÅV)=0, то PC=PC+k+1 | 1/2 | - |
BRLT | Переход по условию «меньше нуля» (числа со знаком) | Если (NÅV)=1, то PC=PC+k+1 | 1/2 | - |
BRHS | Переход по половинному переносу | Если H=1, то PC=PC+k+1 | 1/2 | - |
BRHC | Переход, если нет половинного переноса | Если H=0, то PC=PC+k+1 | 1/2 | - |
BRTS | Переход, если флаг T установлен | Если T=1, то PC=PC+k+1 | 1/2 | - |
BRTC | Переход, если флаг T сброшен | Если T=0, то PC=PC+k+1 | 1/2 | - |
BRVS | Переход по переполнению доп. кода | Если V=1, то PC=PC+k+1 | 1/2 | - |
BRVC | Переход, если нет переполнения доп. кода | Если V=0, то PC=PC+k+1 | 1/2 | - |
BRID | Переход, если прерывания запрещены | Если I=0, то PC=PC+k+1 | 1/2 | - |
BRIE | Переход, если прерывания разрешены | Если I=1, то PC=PC+k+1 | 1/2 | - |
2.3.6. Команды управления системой
В эту группу входят всего 3 команды:
· NOP – пустая команда;
· SLEEP – перевод микроконтроллера в режим пониженного энергопотребления;
· WDR – сброс сторожевого таймера.
Команды NOP и WDR выполняются за один машинный цикл, а команда SLEEP – за четыре машинных цикла.