Система команд микроконтроллеров AVR
Формат программ на ассемблере
Программа на ассемблере представляет собой текстовый файл, который состоит из мнемоник – символьных обозначений команд микроконтроллера, меток и директив.
Любая строка может начинаться с метки – строки из символов и (или) цифр, заканчивающейся двоеточием.
Метки используются для обозначения текущей строки некоторым именем для дальнейшего использования в командах условного или безусловного перехода, а также для обозначения участка в памяти для обращения к данным.
Строка исходного текста может иметь один из следующих видов:
1. [метка:] директива [аргументы директивы] [комментарий]
2. [метка:] мнемоника команды [аргументы команды] [комментарий]
3. Комментарий
4. Пустая строка
Комментарии всегда начинаются с символа “;”.
Элементы, заключенные в квадратные скобки, могут отсутствовать. Текст, расположенный после символа “точка с запятой” до конца строки, полностью игнорируется ассемблером. Использование меток, мнемоник команд микроконтроллера и директив ассемблера подробнее будет рассмотрено позже.
Примеры записи строк:
Label1: .EQU var1=100 ;Директива определения символьного
;имени var1, эквивалентного записи «100»
.EQU var2=200 ;Определение имени var2, соответствующего «200»
test: rjmp test ;Бесконечный цикл (мнемоника команды)
;Пустая строка
Расположение меток, команд ассемблера и директив несущественно, важен только их порядок.
Транслятор ассемблера позволяет использовать в тексте программы мнемоники (обозначения команд микроконтроллера), полностью совпадающие с их названием в системе команд микроконтроллера.
Множество команд микроконтроллеров AVR семейства Classic можно представить несколькими группами:
· Команды пересылки данных;
· Команды арифметических операций и команды сдвига;
· Команды логических операций;
· Команды передачи управления;
· Команды операций с битами;
· Команды управления системой.
Рассмотрим каждую группу подробнее.
2.3.1. Команды логических операций
Эти команды позволяют выполнять стандартные логические операции над байтами, такие как «логическое умножение» (И), «логическое сложение» (ИЛИ), операцию «исключающее ИЛИ», а также вычисление обратного и дополнительного кодов числа. К этой группе можно отнести также команды очистки/установки регистров и команд перестановки тетрад. Все операции производятся над регистрами общего назначения, результат сохраняется в одном из РОН. Все логические операции выполняются за один машинный цикл.
Рассмотрим наиболее часто используемые команды логических операций с примерами ( все команды логических операций представлены в таблице 2.1):
1. «Логическое И» двух РОН- AND Rd, Rr
Операция: Rd=Rd AND Rr
Описание:Выполняет операцию «Логическое И» между содержимым регистров Rd и Rr
Пример: ldi R16,1 ;загрузить 1 в R16
and R2,R16 ;произвести операцию «Логическое И»
2. «Логическое И» РОН и константы- ANDI Rd, K
Операция: Rd=Rd AND K
Описание:Выполняет операцию «Логическое И» между содержимым регистра Rd и 8- разрядным числом. Результат помещается в регистр Rd. Команда применима только к 16 старшим РОН (R16…R31)
Пример: andi R17,$0F ; обнулить старший полубайт регистра R17
andi R18,$10 ;выделить 4-ый разряд в регистре R18
3. «Логическое ИЛИ» двух РОН- OR Rd ,Rr
Операция:Rd=RdÚRr
Описание: Выполняет операцию «Логическое ИЛИ» между регистрами Rd и Rr. Результат помещается в регистр Rd
Пример: or R15,R16 ;поразрядное ИЛИ R15 и R16
bst R15,6 ;записать 6-ой разряд регистра R15 в флаг Т
brts ok ;перейти если флаг Т равен «1»
…
ok:
…
4. «Логическое ИЛИ» РОН и константы-ORI Rd, К
Операция:Rd=RdÚK
Описание: Выполняет операцию «Логическое ИЛИ» между регистром Rd и константой К. Результат помещается в регистр Rd. Команда применима только к 16 старшим РОН (R16…R31)
Пример:ori R17,$0F ;установить старший полубайт регистра R17
ori R18,1 ;установить 0-й разряд регистра R18
5. «Исключающее ИЛИ» двух РОН- EOR Rd, Rr
Операция:Rd=RdÅRr
Описание:Выполняет операцию «Исключающее ИЛИ» между регистрами Rd и Rr. Результат помещается в регистр Rd
Пример:eor R2,R2 ;очистка регистра R2
eor R0,R22 ; побитовое «Исключающее ИЛИ» между R0 и R22
6. Очистка РОН- CLR Rd
Операция:Rd= RdÅRd
Описание:Сбрасывает все разряды регистра общего назначения путем выполнения операции «Исключающее ИЛИ» регистра с самим собой
Пример:Организация цикла с заданным числом повторений
clr R18 ;очистить регистр R18
loop:
ink R18 ;R18=R18+1
…
cpi R18,$50 ;завершить цикл?
brne loop
Таблица 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. Сложение двух РОН- ADD Rd, Rr
Операция: Rd=Rd+Rr
Описание:Выполняет операцию сложения между содержимым регистров Rd и Rr
Пример:add R16,R18 ;сложить два регистра
2. Сложение регистровой пары с константой- ADIW Rd, К
Операция:Rd+1:Rd=Rd+1:Rd+K
Описание:Складывает содержимое регистровой пары Rd+1:Rd с 6-разрядным числом. Результат помещается обратно в регистровую пару.
Пример:adiw R24,1 ;прибавить 1 к R25:R24
adiw R30,63 ;прибавить 63 к указателю Z(R31:R30)
3. Вычитание двух РОН- SUB Rd, Rr
Операция:Rd=Rd-Rr
Описание:Вычитает из регистра Rd содержимое регистра Rr. Результат помещается в регистр Rd
Пример:sub R13,R12 ;вычесть R12 из R13 (R13=R13-R12)
brne noteq ;перейти, если R12 не равно R13
…
noteq:
…
4. Вычитание константы из регистра- SUBI Rd, K
Операция: Rd=Rd-K
Описание:Вычитает из регистраRd значение константы К.Результат помещается обратно в регистр. Данная команда применима только к старшей половине регистров общего назначения
Пример:subi R22,$11 ;вычесть $11 из R22
brne noteq ;перейти, если R22 не равно $11
…
noteq:
…
5. Декремент РОН- DEC Rd
Операция:Rd=Rd-1
Описание:Уменьшает содержимое регистра Rd на единицу. Так как эта команда не влияет на флаг переноса С, она идеально подходит для организации счетчика числа интераций цикла при выполнении вычислений над многоразрядными числами. При работе с беззнаковыми числами для выполнения перехода в соответствии с результатом выполнения команды могут использоваться только команды условного перехода BREQ и BRNE. При работе с числами в дополнительном коде могут использоваться все команды условного перехода для знаковых проверок. Флаг V устанавливается в «1» только в том случае, если до выполнения операции в регистре находилось значение $80
Пример:ldi R17,$10 ;записать число16 в регистр R17
loop:
add R1,R2 ;R1=R1+R2
dec R17 ;декрементировать R17
brne loop ;перейти, если R17 не равно 0
…
6. Инкремент РОН- INC Rd
Операция:Rd=Rd+1
Описание:Увеличивает содержимое регистра Rd на единицу. Так как эта команда не влияет на флаг переноса С, она идеально подходит для организации счетчика числа интераций цикла при выполнении вычислений над многоразрядными числами. При работе с беззнаковыми числами для выполнения перехода в соответствии с результатом выполнения команды могут использоваться только команды условного перехода BREQ и BRNE. При работе с числами в дополнительном коде могут использоваться все команды условного перехода для знаковых проверок. Флаг V устанавливается в «1» только в том случае, если до выполнения операции в регистре находилось значение $7F
Пример:clr R22 ;очистить регистр R22
loop:
inc R22 ;R22=R22+1
…
cpi R22,$4F ;
brne loop ;продолжать цикл, если R22 не равно $4F
…
7.Арифметический сдвиг вправо- ASR Rd
Операция:Rd(n)=Rd(n+1),n=0…6
Описание:Сдвигает содержимое регистра Rd на 1 разряд вправо. Состояние 7-го разряда не изменяется. Значение 0-го разряда помещается в флаг С регистра SPEG. Часто используется для деления чисел со знаком на два
Пример:ldi R16,$10 ;записать число 16 в регистр R16
asr R16 ; R16=R16/2
ldi R17,$FC ;записать число -4 в регистр R17
asr R17 ; R17=R17/2
8. Логический сдвиг влево- LSL Rd
Операция: Rd(n+1)=Rd(n),Rd(0)=0
Описание:Сдвигает все разряды регистра Rd влево. Разряд b0 сбрасывается в «0», а разряд b7 загружается в флаг С регистра SPEG. Эквивалентна команде ADD Rd,Rd
Пример:add R0,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.
Пример: add R0,R4 ; R0=R0+R4
lsr R0 ;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. Установить разряд РВВ- SBI A, b
Операция:A.b = 1
Описание:Устанавливает разряд b регистра ввода/вывода, расположенного по адресу А пространства ввода/вывода. Эта команда применима только к младшим 32 регистрам (адреса 0…31)
Пример:out $1E,R0 ;задать адрес ячейки EEPROM
sbi $1C,0 ;установить запрос на чтение
in R1,$1D ;считать данные из EEPROM
3. Пересылка флага Т в разряд РОН- BLD Rd,b
Операция:Rd.b = T
Описание:Копирует флаг Т регистраSPEG в разряд b регистра Rd
Пример:bst R1,2 ;сохранить 2-ой разряд регистра R1 в T
Bld R0,4 ;записать флаг Т в 4-й разряд регистра R0
4. Запись разряда РОН в флаг Т- BST Rd,b
Операция:T=Rd.b
Описание:Копирует разряд b регистра Rd в флаг Т регистра SPEG
Пример:bst R1,2 ;сохранить 2-й разряд регистра R1 вТ
bld R0,4 ;записать флаг Т в 4-й разряд регистра R0
5. Общее запрещение прерываний- CLI
Операция:I=0
Описание:Сбрасывает в «0» флаг общего разрешения прерываний I регистра SPEG. Эквивалентна команде BCLR 7
Пример:cli ;запретить прерывания
in R11,$16 ;прочитать состояние порта В
sei ;разрешить прерывания
6. Общее разрешение прерываний- SEI
Операция: I=1
Описание:Устанавливает в «1» флаг общего разрешения прерываний I регистра SPEG. Эквивалентна команде BSET 7
Пример:cli ;запретить прерывания
in R13,$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. Пересылка между РОН- MOV Rd, Rr
Операция: Rd=Rr
Описание:Копирует содержимое регистра Rr в регистр Rd. Регистр-источник (Rr) не изменяется
Пример: mov R16, R0 ;переслать содержимое R0 в R16
call chec ;вызвать подпрограмму
…
chec:
cpi R16, $11 ;сравнить R16 с $11
…
ret ;вернуться из подпрограммы
2. Загрузка константы в РОН- LDI Rd, K
Операция:Rd=K
Описание:Загружает 8-разрядное число в регистр общего назначения Rd. Данная команда применима только к старшей половине РОН (адреса 16…31)
Пример: сlr R31 ;очистить ст. байт индексного регистра Z
ldi R30, $F0 ;загрузить адрес в регистр Z
lpm ;загрузить константу из памяти программ
;по адресу $00F0
3. Косвенное чтение памяти данных- LD Rd, Y
Операция:Rd=[Y]
Описание:Загружает один байт из адресного пространства памяти данных в регистр общего назначения Rd. Адрес ячейки памяти, к которой производится обращение, содержится в индексном регистре Y
Пример:clr R29 ;очистить ст. байт индексного регистра
ldi R28, $60 ;загрузить мл. байт адреса
ld R1, Y ;R1=[$0060]
4. Непосредственная загрузка из памяти данных- LDS Rd, K
Операция: Rd=[k]
Описание:Загружает один байт из адресного пространства памяти данных в регистр общего назначения Rd. Адрес ячейки памяти, к которой производится обращение, задается константой К.
Пример:lds R2, $FF00 ;R2=[$FF00]
add R2, R1 ;R2=R2+R1
sts $FF000, R2 ;записать результат по тому же адресу
5. Косвенная запись в память данных- ST X, Rd
Операция:[X]=Rr
Описание:Сохраняет содержимое регистра общего назначения Rr в памяти данных. Адрес ячейки памяти, к которой производится обращение, содержится в индексном регистре Х
Пример: clr R27 ;очистить ст. байт индексного регистра
ldi R26, $60 ;загрузить мл. байт адреса
st X, R1 ;загрузить R1 по адресу $0060
6. Непосредственная запись в память данных- STS K, Rd
Операция:[k]=Rd
Описание:Сохраняет содержимое регистра общего назначения Rd в памяти данных. Адрес ячейки памяти, к которой производится обращение, задается константой К
Пример:lds R2, $FF00 ;R2=[$FF00]
add R2, 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. На практике вместо числовых значений смещения используются метки
Пример: сpi R16, $42 ;сравнить R16 с числом $42
brne M1 ;перейти к M1, если R16 не равно $42
rjmp ok ;безусловный переход
M1:
add R16, R17 ;прибавить R16 к R17
ink R16 ;R16=R16+1
ok:
…
2. Относительный вызов подпрограммы- RCALL k
Операция:PC=PC+k+1
Описание:Выполняет переход к подпрограмме, адрес которой получается сложением содержимого счетчика команд с константой k. Адрес следующей за RCALL командой (2 байта) сохраняется в стеке. На практике вместо числовых значений смещения указываются метки подпрограмм
Пример:rcall routine ;вызвать подпрограмму
…
routine:
push R14 ;сохранить содержимое R14
…
pop R14 ;восстановить содержимое R14
ret ;возврат из подпрограммы
3. Возврат из подпрограммы- RET
Операция:PC=STACK
Описание:Выполняет возврат в то место, откуда подпрограмма была вызвана
Пример: rcall routine ;вызвать подпрограмму
…
routine:
push R14 ;сохранить содержимое R14
…
pop R14 ;восстановить содержимое R14
ret ;возврат из подпрограммы
4. Пропуск команды при равенстве двух РОН- CPSE Rd, Rr
Операция:Если Rd=Rr, то PC=PC+2(3), иначе РС=РС+1
Описание:Сравнивает содержимое двух регистров общего назначения Rd и Rr и пропускает следующую команду, если в регистрах записаны одинаковые значения
Пример:ink R4 ;увеличить R4 (R4=R4+1)
cpse R4, R0;сравнить содержимоеR4 и R0
neg R4 ;проинвертировать R4, если R4 не равно R0
…
5. Сравнение РОН- CP Rd, Rr
Операция: Rd-Rr
Описание:Сравнивает содержимое двух РОН путем вычитания содержимого регистра Rr из содержимого регистра Rd. Данная команда влияет только на флаги регистра состояния SPEG, которые устанавливаются в соответствии с результатом вычитания. Содержимое регистров не изменяется. Как правило, данная команда используется совместно с одной из команд условного перехода
Пример:cp R4, R19 ;сравнить R4 с R19 (R=R4-R19)
brne noteq ;перейти, если R4<>R19
…
noteq:
…
6. Сравнение содержимого РОН с константой- CPI Rd, K
Операция: Rd-K
Описание:Сравнивает содержимое РОН Rd с константой К путем вычитания константы из содержимого регистра Rd. Данная команда влияет только на флаги регистра состояния SPEG, которые устанавливаются в соответствии с результатом вычитания. Содержимое регистра Rd не изменяется. Как правило, данная команда используется совместно с одной из команд условного перехода
Пример:cpi R19, 3 ;сравнить R19 с числом 3 (R=R19-3)
brne noteq ;перейти, если R19<>3
…
noteq:
…
7. Переход по условию «равно»- BREQ k
Операция: Если Z=1, то PC=PC+k+1, иначе РС=РС+1
Описание:Условный относительный переход. Проверяет флаг нуля (Z) и выполняет переход, если этот разряд установлен. Величина смещения k представляется числом в дополнительном коде. При выполнении данной команды сразу же после команды CP, CPI, SUB или SUBI переход произойдет только в том случае, если число (со знаком или без знака), находящееся в регистре Rd, будет равно числу (со знаком или без знака), находящемуся в регистре Rr. Эквивалентна команде BRBS 1, k
Пример:cp R1, R0 ;сравнить R1 с R0
breq equal ;перейти, если R1=R2
…
equal:
…
8. Переход по условию «не равно»- BRNE k
Операция: Если Z=0, то PC=PC+k+1, иначе РС=РС+1
Описание:Условный относительный переход. Проверяет флаг нуля (Z) и выполняет переход, если этот разряд сброшен. Величина смещения k представляется числом в дополнительном коде. При выполнении данной команды сразу же после команды CP, CPI, SUB или SUBI переход произойдет только в том случае, если числа (со знаком или без знака), находящиеся в регистрах Rd и Rr, не будут равны. Эквивалентна команде BRBC 1,k
Пример: eor R27, R27 ;очистить R27
loop: inc R27 ;R27=R27+1
…
cpi R27, 5 ;сравнить R27 с 5
brne loop ;перейти, если R27 не равно 5
…
9. Переход по условию «выше или равно» (для беззнаковых данных)- BRSH k
Операция:Если C=0, то PC=PC+k+1, иначе РС=РС+1
Описание:Условный относительный переход. Проверяет флаг переноса (С) и выполняет переход, если этот разряд сброшен. Величина смещения k представляется числом в дополнительном коде. При выполнении данной команды сразу же после команды CP, CPI, SUB или SUBI переход произойдет только в том случае, если беззнаковое число, находящееся в регистре Rd, будет больше (или равно) беззнакового числа, находящегося в регистре Rr. Эквивалентна команде BRBC 0,k
Пример:subi R19,4 ;R19=R19-4
brsh hgsm ;перейти, если R19 больше или равно 4
…
hgsm:
…
10. Переход по условию «меньше» (для беззнаковых данных)- BRLO k
Операция:Если C=1, то PC=PC+k+1, иначе РС=РС+1
Описание:Условный относительный переход. Проверяет флаг переноса (С) и выполняет переход, если этот разряд установлен. Величина смещения k представляется числом в дополнительном коде. При выполнении данной команды сразу же после команды CP, CPI, SUB или SUBI переход произойдет только в том случае, если беззнаковое число, находящееся в регистре Rd, будет меньше беззнакового числа, находящееся в регистре Rr. Эквивалентна команде BRBS 0,k
Пример:eor R19, R19 ;очистить R19
loop: inc R19 ;R19=R19+1
…
cpi R19, $10 ;сравнить R19 с $10
brlo loop ;перейти, если R19<$10
…
11. Переход по условию «отрицательное значение»- BRMI k
Операция:Если N=1, то PC=PC+k+1, иначе РС=РС+1
Описание:Условный относительный переход. Проверяет флаг отрицательного значения (N) и выполняет переход, если этот разряд установлен. Величина смещения k представляется числом в дополнительном коде. Эквивалентна команде BRBS 2, k
Пример:subi R18, 4 ;R18=R18-4
brmi minus ;перейти, если результат отрицательный
…
minus:
…
12. Переход по условию «положительное значение»- BRPL k
Операция:Если N=0, то PC=PC+k+1, иначе РС=РС+1
Описание:Условный относительный переход. Проверяет флаг отрицательного значения (N) и выполняет переход, если этот разряд сброшен. Величина смещения k представляется числом в дополнительном коде. Эквивалентна команде BRBC 2, k
Пример:subi R26, $50 ;R26=R26-$50
brpl plus ;перейти, если результат положительный
厠ਣ …
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 – за четыре машинных цикла.