Система команд микроконтроллера A Tmega 8535 весьма развита и насчитывает 130 различных инструкций. Большинство команд занимает только 1 ячейку памяти (16 бит) и выполняется за 1 такт [4].
Всё множество команд микроконтроллера можно разбить на несколько групп:
- команды логических операций;
- команды арифметических операций и команды сдвига;
- команды операций с битами;
- команды пересылки данных;
- команды передачи управления;
- команды управления системой.
Управление периферийными устройствами осуществляется через адресное пространство данных. Для удобства существуют «сокращённые команды» IN/OUT.
В системе команд микроконтроллера A Tmega 8535 используется обозначения, приведенные в таблице 1
Таблица 1. Обозначения
Обозначение | Описание |
Регистры и операнды
Стек
Регистр статуса (SREG)
I/O регистры
Полный список и описание всех арифметических, логических команд, команд пересылки данных и команды переходов приведены в приложении 1. Подробно рассмотрим некоторые команды.
Команды пересылки данных
Команда MOV
Синтаксис: MOV Rd,Rr
0 < d < 31, 0 < r < 31.
Команда копирует содержимое регистра Rr в регистр Rd. Исходный регистр Rr остается неизменным, в регистр назначения Rd загружается копия содержимого регистра Rr.
Пример
MOV r1,r2 ; скопировать содержимое r2 в r1
Команда LDI
Синтаксис: LDI Rd, K
16 < d < 31, 0 < K < 255
Команда LDI загружает 8-разрядную константу в регистр Rd.
Пример:
LDI r30,$12 ; загрузить константу $12 в r30
Команда LD
Синтаксис: LD Rd,X
LD Rd ,X+
LDD Rd,-X
0 < d < 31
Загружает косвенно один байт из СОЗУ в регистр. Положение байта в СОЗУ указывается 16-разрядным регистром-указателем X в регистровом файле. Обращение к памяти ограничено текущей страницей объемом 64 Кбайта. Регистр-указатель X может остаться неизменным после выполнения команды, но может быть инкрементирован или декрементирован. Использование регистра-указателя X обеспечивает удобную возможность обращения к матрицам, таблицам, указателю стека.
Пример:
CLR r27 ;Очистить старший байт X
LDI r26, $20 ;Установить $20 в младший байт X
LD r0, X+ ;Загрузить в r0 содержимое SRAM по адресу ;$20 (X постинкрементируется)
LD r1, X ;Загрузить в r1 содержимое SRAM по адресу ;$21
LDI r26, $23 ;Установить $23 в младший байт X
LD r2, X ;Загрузить в r2 содержимое SRAM по адресу ;$23
LD r3, -X ;Загрузить в r3 содержимое SRAM по адресу ;$22 (X преддекрементируется)
Команда LDS
Синтаксис:LDS Rd,k
0 < d < 31,0 < k < 65535
Выполняется загрузка одного байта из СОЗУ в регистр. Можно использовать 16-разрядный адрес. Обращение к памяти ограничено текущей страницей СОЗУ объемом 64 Кбайта. Команда LDS использует для обращения к памяти выше 64 Кбайт регистр RAMPZ.
Пример:
LDS r2, $FF00 ; Загрузить r2 содержимым
;SRAM по адресу $FF00
Команда STS
Синтаксис:STS k,Rr
0 < r < 31, 0 < k < 65535
Команда осуществляет запись одного байта из регистра в СОЗУ. Можно использовать 16- разрядный адрес. Обращение к памяти ограничено текущей страницей СОЗУ объемом 64 Кбайта. Команда STS использует для обращения к памяти выше 64 Кбайт регистр RAMPZ.
Пример:
LDS r2, $1203 ; Загрузить в r2 содержимое
; SRAM по адресу $1203
ADD r2, r1 ; Сложить r1 с r2
STS $1203, r2 ; Записать обратно
Команда ST
Синтаксис : ST X,Rr
ST X+,Rr
ST -X,Rr
0 < d < 31
Команда осуществляет косвенную запись одного байт из регистра в СОЗУ. Положение байта в СОЗУ указывается 16-разрядным регистром-указателем X в регистровом файле. Обращение к памяти ограничено текущей страницей объемом 64 Кбайта. Для обращения к другой странице СОЗУ необходимо изменить регистр RAMPX в I/O области. Регистр-указатель X может остаться неизменным после выполнения команды, но может быть инкрементирован или декрементирован. Эта особенность удобна при использовании регистра-указателя X в качестве указателя стека.
Пример:
CLR r27 ; Очистить старший байт X
LDI r26, $34 ; Установить $34 в младший байт X
ST X+,r0 ; Сохранить в r0 содержимое SRAM
;по адресу $34 (X ;постинкрементируется)
ST X, r1 ; Сохранить в r1 содержимое
;SRAM по адресу $35
LDI r26, $34 ; Установить $34 в младший байт X
ST r2, X ; Сохранить в r2 содержимое SRAM
;по адресу $34
SR r3, -X ; Сохранить в r3 содержимое SRAM
;по адресу $33 (X ;преддекрементируется)
Команда PUSH
Синтаксис: PUSH Rr
0 < r <31
Команда заносит содержимое регистра Rd в стек.
Команда POP
Синтаксис: P OP Rr
0 < r <31
Команда загружает из стека байт в регистр Rd.
Пример:
push r16 ; Сохранить r16 в стеке
push r17 ; Сохранить r17 в стеке
pop r17 ; Восстановить r17
pop r16 ; Восстановить r16
Арифметические команды
Сложение без переноса ADD ( ADD - Add without Carry )
Синтаксис: ADD Rd , Rr
0 < d < 31, 0 < r < 31.
Данная команда реализует сложение двух регистров без добавления содержимого флага переноса (С) и размещает результат в регистре назначения Rd. Устанавливает флаги Z , C , N , V .
Пример
ADD r1,r2 ; Сложить r2 с r1 (r1=r1+r2)
ADD r28,r28 ; Сложить r28 с самим собой
Сложение с переносом ( ADC )
Синтаксис: ADC Rd , Rr
0 < d < 31, 0 < r < 31
Данная команда осуществляет сложение двух регистров и содержимого флага переноса (С), размещает результат в регистре назначения Rd: Rd <- Rd + Rr + C. Устанавливает флаги Z , C , N , V , H.
Пример:
; Сложить R1 : R0 с R3 : R2
ADC r2, r0 ; Сложить младший байт
ADC r3, r1 ; Сложить старший байт с переносом
Команда ADIW (Add Immediate to Word)
Синтаксис: ADIW Rdl,K
dl = {24,26,28,30}, 0 < K<64
Данная команда осуществляет сложение непосредственного значения (0-63) с парой регистров и размещение результата в паре регистров:
Rdh:Rdl <- Rdh:Rdl +К.
Команда работает только с четырьмя верхними парами регистров, удобна для работы с регистрами указателями. Устанавливает флаги Z , C , N , V.
Пример:
adiw r24, $1 ; Сложить $1 с r25:r24
adiw r30, $63 ; Сложить $63 с Z указателем (r31 : r30)
Команда SUB
Синтаксис: SUB Rd,Rr
16 < d < 31, 0 < r < 31
Команда осуществляет вычитание содержимого регистра-источника Rr из содержимого регистра-приемника Rd, результат помещает в регистре назначения: Rd = Rd – Rr. Устанавливает флаги H,V,N,Z,C.
Пример:
sub r13, r12 ; Вычесть r12 из r13
Команда SUBI
Синтаксис: SUB Rd, K
16 < d < 31, 0 < K < 255
Команда SUB производит вычитание константы из содержимого регистра, размещает результата в регистре назначения. Устанавливает флаги H,V,N,Z,C.
Пример:
subi r22, $11 ; Вычесть $11 из r22
Команда SBC
Синтаксис: SBC Rd ,Rr
0 < d < 31, 0 < r < 31
Команда SBC осуществляет вычитание содержимого регистра-источника и содержимого флага переноса (С) из регистра Rd, результат помещает в регистре назначения Rd. Устанавливает флаги H,V,N,Z,C.
Пример:
; Вычесть r1 : r0 из r3 : r2
sub r2, r0 ; Вычесть младший байт
sbc r3, r1 ; Вычесть старший байт с переносом
Команда SBCI
Синтаксис: SBCI Rd,K
0 < d < 31, 0 < K < 255
Команда осуществляет вычитание константы и содержимого флага переноса (С) из содержимого регистра, размещение результата в регистре назначения Rd. Устанавливает флаги H,V,N,Z,C регистра флагов.
Пример
; Вычесть $2567 из r14 : r15
subi r14, $67 ; Вычесть младший байт
sbci r15, $25 ; Вычесть старший байт с переносом
Команда SBIW
Синтаксис: SBIW Rdl,K
dl={24,26,28,30}, 0 < K<63
Команда осуществляет вычитание непосредственного значения (0-63) из пары регистров и размещает результата в паре регистров. Команда работает с четырьмя верхними парами регистров, удобна для работы с регистрами указателями. Устанавливает флаги H,V,N,Z,C регистра флагов.
Пример:
sbiw r24, $3 ; Вычесть $3 из r25:r24
sbiw r28, $A2 ; Вычесть $A2 из Y указателя (r29 : r28)
Команда DEC
Синтаксис: DEC Rd
0 < d < 31
Команда осуществляет вычитание единицы - 1 - из содержимого регистра Rd и размещает результат в регистре назначения Rd. Флаг переноса регистра статуса данной командой не активируется, что позволяет использовать команду DEC использовать при реализации счетчика циклов для вычислений с повышенной точностью. Устанавливает флаги V,N,Z регистра флагов.
Пример:
ldi r16, $09 ; Загрузить константу в r16metka1: add r3, r4 ; Сложить r4 с r3 dec r16 ; Уменьшить на 1 r16 brne metka1 ; Перейти если r16 <> 0 nop ; Продолжать (пустая операция)Команда INC
Синтаксис: INC Rd
0 < d < 31
Команда увеличения на единицу содержимого регистра Rd и размещения результата в регистре назначения Rd. Устанавливает флаги V,N,Z регистра флагов.
Пример:
clr r23 ; Очистить r23
metka2: inc r23 ; Увеличить на 1 r23
. . .
cpi r23, $45 ; Сравнить r23 с $45
brne metka2; Перейти если не равно
nop ; Продолжать (пустая операция)
Команды умножения
Команда MUL
Синтаксис: MUL Rd,Rr
0 < d < 31,0 < r < 31
Команда перемножает две 8-разрядные величины без знаков с получением 16- разрядного результата без знака. Множимое и множитель - два регистра - Rr и Rd, соответственно. Произведение размещается в регистрах R1 (старший байт ) и R0 (младший байт). Следует учесть, что если в качестве множимого и множителя выбрать R0 или R1, то результат заместит прежние значения сразу после выполнения операции. Если в результате команды MUL установлен в единицу бит 15 результата, то флаг C регистра флагов устанавливается в 1.
Пример:
mul r3, r4 ; Перемножить r3 и r4
mov r3, r1 ; Вернуть результат обратно в r3:r4
mov r4, r0 ; Вернуть результат обратно в r3:r4
Команда FMUL
Синтаксис FMUL Rd,Rr
16 ≤d ≤23, 16 ≤ r ≤23
Эта команда выполняет знаковое умножение 2х 8ми битных величин и сдвиг результата на 1 бит влево. 16ти разрядный результат помещается в пару регистров: R01 и R00. Причем старший бит результата находится в регистре R01, а младший – в регистре R00.
Если в результате команды FMUL бит 15 результата до сдвига установлен, то флаг С установлен в 1, иначе флаг С =0. Флаг Z установлен в том случает. если результат равен $0000, иначе флаг Z очищен.
Пример: перемножить 2 величины 15d и 33d:
ldi r16,15
ldi r17,33
fmul r16,r17
Результат: R00=DE h
R01=03 h
Команды сравнения
Команда TST
Синтаксис: TSR Rd
где 0 < d < 31
Команда осуществляет проверку на ноль или минус. При её выполнении производится логическое умножение («И») регистра источника самого на себя и выставляются соответствующие флаги, но сам результат логического умножения никуда не записывается. Устанавливает флаги V,N,Z регистра флагов.
Пример:
tst r2 ; Выставить флаги нулевого или отрицательного значения по содержимому регистра r2
Команда CP
Синтаксис CP Rd,Rr
0 < d < 31,0 < r < 31.
Данная команда выполняет сравнение содержимого двух регистров Rd и Rr путем вычитания Rd-Rr. Содержимое регистров не изменяется. После выполнения данной команды устанавливаются флаги:H,Z,C,V,N,S. Команда CP применяется вместе с командами перехода.
Пример:
cp r4, r19 ; Сравнить r4 с r19 brne noteq ; Перейти если r4 <> r19
Команда CPC
Синтаксис CPC Rd,Rr
0 < d < 31, 0 < r < 31
Команда выполняет сравнение содержимого двух регистров Rd и Rr и учитывает также перенос предшествующей команды. Сравнение выполняется путем вычитания: Rd-Rr-C. Содержимое регистров не изменяется, а после выполнения устанавливаются флаги: H,Z,C,V,N,S. После этой команды можно выполнять любые условные переходы.
Пример: ; Сравнить r3 : r2 с r1 : r0
cp r2, r0 ; Сравнить старший байт
cpc r3, r1 ; Сравнить младший байт
brne noteq ; Перейти, если не равно
Команда CPI
Синтаксис CPI Rd, K
16 ≤ d ≤31, 0 < K <255
Команда выполняет сравнение содержимого регистра Rd с константой путем вычитания содержимого Rd-K. Содержимое регистра не изменяется, устанавливаются флаги: H,Z,C,V,N,S. После этой команды можно выполнять любые условные переходы.
Пример:
cpi r12, 15 ; Сравнить r12 с 15 brne error ; Перейти если r12 <> 15Логические команда
Команда AND
Синтаксис: AND Rd, Rr
где 0 < d < 31, 0 < r < 31
Команда межрегистрового логического «И». Иначе: команда межрегистрового логического умножения, где логическое «да» наступает только в случае единогласного «да», а логическое «нет», соответственно, во всех остальных случаях (см. таблицу 1).
Таблица 1.
Пример:
and r2, r0 ; Логически перемножить содержимое ;регистров r2 и r0
and r20, r30 ; Логически перемножить содержимое ;регистров r20 и r30
Команда ANDI
Синтаксис: ANDI Rd, K
где 0 < d < 31, 0 < K < 255
Команда осуществляет операцию логического «И» (см. таблицу 1) для содержимого регистра и непосредственного значения (константы).
Пример:
andi r30, $50 ; Логически умножить содержимое ;регистра r30 на 80
andi r23, $B5 ; Логически умножить содержимое ;регистра r23 на 181
Команда OR
Синтаксис: OR Rd, Rr
где 0 < d < 31, 0 < r < 31
Команда межрегистрового логического «ИЛИ». Иначе: команда логического сложения, где логическое «нет» наступает только в случае единогласного «нет», в остальных случаях – логическое «да» (см. таблицу 2).
Таблица 2
Пример:
or r4, r8 ; Логически сложить содержимое регистра ;r4 с содержимым регистра r8
or r3, r5 ; Логически сложить содержимое регистра ; ;r3 с содержимым регистра r5
Команда ORI
Синтаксис: ORI Rd, K
где 0 < d < 31, 0 < K < 255
Команда логического «ИЛИ» (см. таблицу 2) для содержимого регистра и непосредственного значения (константы).
Пример:
ori r28, $A0 ; Логически сложить содержимое ;регистра r28 с константой, равной 160
ori r4, $04 ; Логически сложить содержимое ;регистра r4 с константой, равной 4
Команда EOR
Синтаксис: EOR Rd, Rr
где 0 < d < 31, 0 < r < 31
Команда осуществляет операцию исключающего «ИЛИ» над содержимым двух регистров (см. таблицу 3).
Таблица 3
Пример:
eor r6, r9 ; Выполнить логическую операцию ;исключающего ИЛИ над содержимым
; регистра r6 и содержимым регистра r9
eor r17, r21 ; Выполнить логическую операцию ;ислючающего ИЛИ над содержимым
;регистра r17 и содержимым регистра ;r21
Дата: 2018-12-28, просмотров: 350.