Система команд микроконтроллера
Поможем в ✍️ написании учебной работы
Поможем с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой

Система команд микроконтроллера A Tmega 8535 весьма развита и насчитывает 130 различных инструкций. Большинство команд занимает только 1 ячейку памяти (16 бит) и выполняется за 1 такт [4].

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

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

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

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

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

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

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

Управление периферийными устройствами осуществляется через адресное пространство данных. Для удобства существуют «сокращённые команды» IN/OUT.

В системе команд микроконтроллера A Tmega 8535 используется обозначения, приведенные в таблице 1

Таблица 1. Обозначения

Обозначение Описание

Регистры и операнды

Rd Регистр назначения (и источник) в регистровом файле Rr Регистр источник в регистровом файле R Результат выполнения команды K Литерал или байт данных (8 бит) k Данные адреса константы для счетчика программ b Бит в регистровом файле или I/O регистр (3 бита) s Бит в регистре статуса (3 бита) X, Y, Z Регистр косвенной адресации (X=R27:R26, Y=R29:R28, Z=R31:R30) P Адрес I/O порта q Смещение при прямой адресации (6 бит)

Стек

STACK : Стек для адреса возврата и опущенных в стек регистров SP : Указатель стека

Регистр статуса (SREG)

SREG : Регистр статуса C : Флаг переноса Z : Флаг нулевого значения N : Флаг отрицательного значения V : Флаг-указатель переполнения дополнения до двух S : Флаг знака H : Флаг полупереноса T : Флаг пересылки, используемый командами BLD и BST I : Флаг разрешения/запрещения глобального прерывания

I/O регистры

RAMPX, RAMPY, RAMPZ : Регистры связанные с X, Y и Z регистрами, обеспечивающие косвенную адресацию всей области СОЗУ микроконтроллера с объемом СОЗУ более 64 Кбайт

 

Полный список и описание всех арифметических, логических команд, команд пересылки данных и команды переходов приведены в приложении 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.