Система команд микроконтроллера ATmega 128

advertisement
1
Система команд микроконтроллера ATmega 128
Целью данного раздела является классификация команд по функциональному
назначению и описанию характерных команд. Полный перечень команд с кратким описанием приводится в приложении.
1. Команды пересылок
Команды данной группы не влияют на флаги (биты регистра SREG)
1.1 Общие пересылки
Команды осуществляют следующие варианты пересылок данных:
регистр – регистр;
регистр – память;
память – регистр.
LDI Rd, K, где Rd=R16..R31 – регистры процессора, К=00(Н)..FF(Н) – константа.
Команда заносит константу К в регистр Rd (К→ Rd).
Константа может представляться в десятичной, двоичной или шестнадцатеричной
системах счисления.
Пример:
К=10 – десятичная;
К=0в00001010 – двоичная;
К=0х0А – шестнадцатеричная.
MOV Rd, Rr, где Rd= Rr=R0..R31 – регистры процессора.
Команда копирует содержимое регистра Rr в регистр Rd (Rr→ Rd)
Команды работы с ОЗУ данных:
LD Rd, mem, где mem – адрес ячейки ОЗУ, содержащейся в регистрах X, Y или Z;
Rd=R0..R31 – регистр процессора.
Команда загружает содержимое ячейки ОЗУ с адресом mem в регистр Rd
((mem)→Rd)
ST mem, Rr, где mem – адрес содержащейся в регистрах X, Y или Z; Rr=R0..R31 регистр общего назначения (РОН).
Команда сохраняет содержимое регистра Rr в ячейку ОЗУ с адресом, хранящемся в
регистрах X, Y или Z.
Пример: загрузить содержимое ячейки ОЗУ с адресом 0100(Н) в регистр R0.
LDI R26, 0x00 ; младший байт Х
LDI R27, 0x01 ; старший байт Х
LD R0, X
1.2 Команды ввода-вывода
IN Rd, P
Команда вводит данные из порта с адресом Р в регистр Rd ((P)→ Rd)
В программе, вместо физических адресов Р можно использовать символическое
имя PIN*, где * - имя канала ввода.
Пример: ввести данные из порта А в регистр R16.
IN R16, PINA
OUT P, Rr
Команда выводит данные из регистра Rr в порт с адресом Р (Rr→(P)).
Вместо адреса Р, в программе, можно использовать имя PORT*, где * - имя канала
вывода.
2
Пример: вывести содержимое регистра R16 в порт В.
OUT PORTB, R16
1.3 Обмен со стеком
PUSH Rr, где Rr=R0..R31
Команда уменьшает содержимое регистра SP на единицу (SP-1→SP); по полученному в SP адресу, записывает в стек (стековую память в ОЗУ) содержимое регистра Rr
(Rr→STACK).
РОР Rd, где Rd=R0..R31
Команда читает данные с верхушки стека в регистр Rd (STACK→Rd); увеличивает
содержимое указателя стека SP на единицу (SP+1→SP).
Команды чаще всего используются в начале и в конце подпрограмм для сохранения
в стек и восстановления из стека содержимого регистров процессора.
Пример:
CALL rout ; вызов подпрограммы rout
..
rout ; подпрограмма rout
PUSH R13
PUSH R14
..
POP R14
POP R13
RET
2. Команды обработки данных
Существенным отличием команд этой группы является то, что только они могут
изменять биты регистра SREG, отвечающие за признаки результата операции в АЛУ (так
называемые флаги).
Большая часть команд обработки данных имеет формат:
ХХХ Ор1, Ор2, где ХХХ – команда (или так называемая мнемоника); Ор1 - источник первого операнда и приемника результата операции; Ор2 – источник второго операнда.
Команды работают по схеме: (Ор1 операция Ор2→Ор1, и модификация флагов по
результату операции). Например, разность в случае вычитания, из первого операнда вычитается второй, а разность помещается на место первого операнда. Результат может быть
либо нулевым, либо иметь знак, это два основных признака результата (или флага в регистр SREG).
2.1 Логические операции
В состав команд контроллера входят команды реализующие базовые логические
операции И, ИЛИ, исключающие ИЛИ, НЕ.
Команды логического умножения (И):
ANDI Rd, K, где Rd=R16.. R31 – РОН; К=00(Н)..FF(Н) – константа.
Действие команды: (RdK→Rd, и изменение флагов).
AND Rd, Rr, где Rd=Rr=R0..R31.
Действие команды: (RdRr→Rd, и изменение флагов).
Команды логического сложения (ИЛИ):
ORI Rd, K Действие: (RdK→Rd, и изменение флагов).
OR Rd, Rr Действие: (RdRr→Rd, и изменение флагов).
3
Команда исключающее ИЛИ (XOR):
EOR Rd, Rr Действие: (RdRr→Rd, и изменение флагов).
Команды инверсии (NOT)
COM Rd, где Rd=R0..R31-РОН.
Команда осуществляет поразрядную инверсию содержимого регистра Rd и изменение флагов.
2.2 Арифметические операции
Операции сравнения:
CPI Rd, K, где Rd=R16..R31-РОН; К=00(Н)..FF(Н) – константа.
Сравнение происходит при помощи операции вычитания, то есть команда вычитает
из содержимого регистра Rd значение константы К, результат не сохраняет, но по результату операции модифицирует биты регистра флагов SREG.
CP Rd, Rr, Действие: (Rd-Rr, и изменение флагов).
Операции инкремента-декремента:
Инкрементов называется увеличение на единицу содержимого регистра или ячейки
памяти, а декременты – уменьшение.
INC Rd – инкремент Rd (Rd+1→ Rd, и изменение флагов).
DEC Rd – декремент Rd (Rd-1→ Rd, и изменение флагов).
Арифметические действия:
Сложение:
ADD Rd, Rr. Действие: (Rd+Rr→Rd, и изменение флагов).
ADC Rd, Rr. Команда прибавляет к сумме Rd и Rr значение бита переноса С регистра флагов SREG (Rd+Rr+С→Rd, и изменение флагов). Используется при сложении 64-х и
32-х разрядных операндов.
Вычитание:
SUBI Rd, K, Действие: (Rd-К→Rd, и изменение флагов).
SUB Rd, Rr, Действие: (Rd-Rr→Rd, и изменение флагов).
Умножение:
MUL Rd, Rr, Команда перемножает два 8-разрядных беззнаковых числа из регистров Rd и Rr, получая 16-разрядное произведение без знака старший байт которого находится в регистре R1, а младший в R0 (Rd* Rr→ R1(ст.б): R0(мл.б), и изменение флагов).
2.3 Сдвиги
Команды сдвига подразделяются на сдвиги циклические (по кольцу) и не циклические (с выдвижением и потерей битов). Последние, в свою очередь, делятся на арифметические и логические.
Циклические сдвиги:
Сдвиги вправо-влево через бит переноса:
ROL Rd – сдвиг влево. Действие: (Rd(7)→C, Rd(n)→Rd(n+1), C→Rd(0)).
ROR Rd – сдвиг вправо. Действие: (Rd(0)→C, Rd(n+1)→Rd(n), C→Rd(7)).
Команды осуществляют циклический сдвиг на один бит по кольцу образованному
регистром Rd и битом переноса С регистра SREG (рисунок 1).
4
ROL
ROR
7
0
Rd
C
Рисунок 1. Кольцо, образуемое командами ROL и ROR.
Логические сдвиги:
LSL Rd – сдвиг влево. Действие: (0→Rd(0), Rd(n)→Rd(n+1), Rd(7)→C, и изменение
флагов).
Работу команды поясняет рисунок 2.
LSL
0
7
С
Rd
0
Рисунок 2. Действие команды LSL
Команда производит сдвиг содержимого Rd на один разряд в сторону старших разрядов. Младшие биты заполняются нулями. Старшие биты – теряются.
LSR Rd – сдвиг вправо. Действие: (0→Rd(7), Rd(n+1)→Rd(n), Rd(0)→C, и изменение
флагов).
Работу команды поясняет рисунок 3.
LSR
0
7
Rd
С
0
Рисунок 3. Действие команды LSR
Арифметический сдвиг вправо:
ASR Ld Действие: (Rd(n+1)→Rd(n), n=0..6, Rd(0)→C, изменение флагов).
Работу команды поясняет рисунок 4.
АSR
0
7
Rd
С
Рисунок 4. Действие команды ASR
Команда сдвигает содержимое Rd на один байт вправо. Бит D7 не изменяется (тиражируется).
2.4 Операции с битами
Команды установки-сброса бита в регистре ввода-вывода:
SBI P, b, где Р=0..31 – адрес порта; b=0..7 – номер бита.
Команда устанавливает в единицу бит «b» в порте с адресом «Р» (1→I/O(P,b)). В
программе, вместо адресов, можно использовать символические имена PORT* и PIN*.
Пример: установить единицу в бите 0 порта А настроенного на вывод.
SBI PORTA, 0
(Замечание: адрес «Р» не может превышать значение 31 или FF(Н)).
5
СBI P, b
Команда сбрасывает в ноль бит «b» в порте с адресом «Р» (0→I/O(P,b)).
Команда установки-сброса бита в регистрах R16..R31 процессора:
SBR Rd, K, где Rd= R16..R31–РОН; К=00(Н)..FF(Н) – константа-маска.
Команда выполняет логическое сложение содержимого регистра Rd с маской К, в
результате, единица в разряде двоичного эквивалента числа К задает устанавливаемый
бит (RdК→ Rd).
Пример: установить в единицу младшую тетраду (нибл) регистра R16. Исходное
значение R16=0в10000010.
SBR R16, 0в00001111
Результат:
10000001
 00001111
10001111
(Замечание: сброс разрядов изначально равных единице не происходит (разряд D7
регистра R16)).
CBR Rd, K
Команда сбрасывает в ноль разряды регистра Rd заданные единицей в двоичном
эквиваленте константы К (Rd(FF(H)-K)→Rd).
Пример6 сбросить в ноль разряд D7 регистра R16, исходное значение
R16=0в10001111.
CBR R16, 0в10000000
Результат:
- 11111111 =FF(H)
10000000 =K
 01111111
10001111 =R16
00001111
Команды установки-сброса регистра:
SER Rd, где Rd= R16..R31.
Команда заносит значение FF(Н) в регистр Rd, то есть устанавливает все разряды Rd
в единицу (FF(Н)→Rd).
CLR Rd
Команда сбрасывает в ноль все разряды регистра Rd (RdRd→Rd).
3. Команды передачи управления
Команды передачи управления скачком изменяют содержимое счетчика команд
PC.
3.1. Безусловные переходы
Относительный - безусловный переход:
RJMP K, где К=-2*210.. 2*210 слов – относительное изменение (смещение) адреса.
Команда прибавляет к текущему содержимому счетчика команд РС смещение К, то
есть передает управление команде по адресу PC+1+К (РС+1+К→РС).
В программе на ассемблере смещение адреса К заменяется меткой.
6
Пример: организовать циклическое выполнение кода программы
М:
.
.
код
.
.
RJMP M ; переход на метку М:
(Замечание: программист должен следить, чтобы количество команд в цикле не
превышало допустимый диапазон «К», то есть ±2К=±2048 16-битных слов).
Абсолютный безусловный переход:
JMP K, где К=0..4*220 слов – адрес перехода.
Команда помещает в счетчик команд РС адрес «К», осуществляя переход к команде
с адресом «К» (К→РС).
В программе на ассемблере адрес «К» заменяется меткой (см. пример для команды
RJMP).
3.2 Условные переходы
Формат команды условного перехода имеет вид:
BRCC K, где СС – условие перехода; К=-64..63 – относительное изменение (смещение) адреса.
В программе на ассемблере «К» заменяется меткой.
Если условие «СС» - истинно, команда передает управление на метку
(РС+1+К→РС), иначе выполняется следующая по порядку команда (РС+1→РС).
В качестве условия перехода «СС» используются флаги (т.е. биты регистра SREG,
отвечающие за признаки результата операции в АЛУ).
Например: Z – флаг нулевого результата и N – флаг знака. На каждый флаг имеется
по две взаимно обратные команды условного перехода.
Например:
Таблица 1. Команды условных переходов
Значение флага
Z=1
Z=0
N=1
N=0
Команда
BREQ K
BRNE K
BRMI K
BRPL K
Комментарий
Переход, если ноль
Переход, если не ноль
Переход, если минус
Переход, если плюс
Так как проверяемый командой условного перехода флаг должен быть предварительно модифицирован, команде условного перехода всегда должна предшествовать команда обработки данных, влияющая на флаги. Чаще всего, для этой цели используют команды ANDI или CPI.
3.3 Организация подпрограмм
Относительный вызов подпрограммы:
RCALL K, где К=-2*210..2*210 слов – относительное изменение (смещение) адреса
вызываемой подпрограммы.
Команда:
сохраняет в стек адрес возврата из подпрограммы (РС+1→STACK);
уменьшает содержимое указателя стека на два (SP-2→ SP);
вызывает подпрограмму, начинающуюся с адреса РС+1+К (РС+1+К→РС).
В программе на ассемблере «К» заменяется меткой – названием подпрограммы.
7
Пример: организовать вызов подпрограммы задержки времени TIME.
; основная программа
.
.
RCALL TIME ; вызов n/n TIME
.
.
подпрограмма TIME
TIME: LDI R16, 0xFF ; инициализация счетчика циклов числом FF(H)
M: DEC R16 ; уменьшение счетчика на 1
BRNE M ; переход на метку М, если счетчик не обнуляется
RET ; возврат в основную программу
Абсолютный вызов подпрограммы:
CALL K, где К=0..4*220 слов – адрес подпрограммы.
Команда:
сохраняет в стек адрес возврата из подпрограммы (РС+2→STACK) (команда занимает 2 ячейки по 16-разрядов));
уменьшает содержимое указателя стека на два (SP-2→SP);
вызывает подпрограмму начинающуюся с адрес «К» (К
Возврат из подпрограммы:
RET
Команда извлекает из стека два верхних байта и помещает их в счетчик команд РС
(STACK(15..0) →РС).
Команда RET завершает любую подпрограмму (см. пример для команды RCALL).
Если в подпрограмме количество обращений к стеку на запись и чтение равны,
верхушка стека перед выходом из подпрограммы содержит адрес возврата в основную
программу, помещенный туда командами вызова подпрограммы RCALL или CALL. Таким образом, для корректного выхода из подпрограммы необходимо строго следить, чтобы количество обращений на запись к стеку (PUSH) в начале подпрограммы равнялось
количеству обращений к стеку на чтение (РОР) в конце подпрограммы перед выполнением команды RET.
3.4 Организация прерываний
Разрешение глобальных прерываний:
SEI
Команд устанавливает в единицу флаг I в регистре SREG, разрешая обработку прерываний.
Запрещение глобальных прерываний:
CLI
Команда сбрасывает в ноль флаг I в регистре SREG, запрещая обработку прерываний.
Выход из подпрограммы обработки прерывания:
RETI
Команда:
извлекает из стека два верхних байта и помещает их в счетчик команд РС
(STACK(15..0)→РС);
увеличивает на два содержимое указателя стека SP (SP+2→SP);
устанавливает в единицу флаг разрешения глобальных прерываний I в регистре
SREG (I(SREG)=1).
Download