Адреса операндов, задействованных в выполнении любой инструкции программы, в явном или в неявном виде должны быть указаны в коде этой инструкции. Операнды могут находиться в ячейках памяти данных, в регистрах общего назначения, в регистрах ввода/вывода и даже в ячейках памяти программ. В системе команд микроконтроллера, как правило, различные способы данных, позволяющие программисту задавать адреса операндов в разнообразных инструкциях. В зависимости от архитектуры код инструкции может занимать одну или несколько ячеек программной памяти. При этом для хранения адресов могут отводиться отдельные биты в ячейке или целые ячейки.
Например, в архитектуре AVR большинство команд занимает только одну ячейку памяти программ. В этой 16-битной ячейке содержится двоичный код операции (OP - Operand) и адрес регистра или ячейки памяти, задействованных при выполнении этой операции. Вместе с тем, ряд инструкций имеют размерность 32бита. В этом случае 16- битный адрес одного из операндов хранится в 16 младших разрядах кода.
1. Непосредственная адресация
При непосредственной адресации одним из операндов команды является числовая константа (К). Она хранится непосредственно в коде инструкции. Вторым операндом инструкции должен быть какой либо один из регистров общего назначения.
Например, команда загрузки регистра Rd константой R (Load Immediate) на языке ассемблера AVR-микроконтроллера записывается в виде: ldi Rd,K
По этой инструкции константа К записывается в указанный регистр Rd. В сокращенном виде эти действия можно представить в виде: Rd <- K.
Формат команды показан на рис. 3.6. В 16-битном коде инструкции номер регистра d занимает 5 бит, константа К- 8 бит, а код операции ldi - 3 бита.
Рис. 3.6. Формат инструкции с непосредственной адресацией данных
2. Прямая адресация
При прямой адресации операндами могут быть 8-битные переменные, хранящиеся в регистрах общего назначения, ячейках памяти данных и памяти программ или в регистрах ввода/вывода, а также отдельные биты этих регистров. Эти операнды указываются прямо в инструкции.
· Операции с одним регистром общего назначения
Операнд инструкции содержится в одном из регистров общего назначения - Rd (регистр-приемник результата; 0 ≤ d ≤ 31). Номер регистра содержится в коде инструкции.
Например,
inc | Rd |
dec | Rd |
clr | Rd |
ser | Rd |
Increment register Rd <- Rd + 1
Decrement register Rd <- Rd-1
Clear register Rd <- $00
Set register Rd <- $FF
Формат инструкции показан на рис. 3.7. В 16-битном коде адрес регистра занимает 5 младших бит.
Рис. 3.7. Формат инструкции с прямой адресацией одного регистра общего назначения
· Операции с двумя регистрами общего назначения
Операнды инструкции содержатся в двух регистрах общего назначения:
0 Rd - регистр-приемник результата ( 0 ≤ d ≤ 31)
0 Rr - регистр-источник.
Например,
add Rd, Rr addition two registers Rd <- Rd + Rr
sub Rd, Rr subtract two registers Rd <- Rd - Rr
and Rd, Rr logical and two registers Rd <- Rd Rr
or Rd, Rr logical or two registers Rd <- Rd v Rr
При выполнении инструкций результат операции записывается в регистр-приемник Rd. Номера регистров содержатся в коде инструкции (рис. 3.8).
Рис. 3.8. Формат инструкции с прямой адресацией двух регистров общего назначения
· Битовые операции с регистром общего назначения
Операндом команды является бит в регистре общего назначения. Номер бита (b) и номер регистра (d или r) задается в коде инструкции. Например, bld Rd, b bit load from T to register Rd(b)<-T bst Rr, b bit store from register to T T<-Rr(b) Вторым операндом в инструкциях является бит сохранения копии Т (Copy Storage) регистра статуса SREG. В 16-битном формате команды (рис. 3.9) номер бита и номер регистра занимают младшие 8 бит.
Рис. 3.9. Формат инструкции с прямой адресацией бита в регистре общего назначения
· Операции с регистром ввода/вывода
Операнды команды содержатся в одном из регистров общего назначения Rd и в одном из регистров ввода/вывода (с номером $P).
Например,
in Rd, P Input port Rd<-P
out P, Rr Output port P<-Rr В 16-битном формате команды номера регистров занимают младшие 11 бит (рис. 3.10).
Рис.3.10. Формат команды с прямой адресацией регистра ввода/вывода
· Битовые операции с регистром ввода/вывода
Операндом команды является бит в ввода/вывода. Побитно адресуемыми регистрами в пространстве ввода вывода являются регистры с номерами $00....$1F.
Например,
sbi P*,b Set Bit in I/O Register I/O(P,b) <- 1 cbi P*,b Clear Bit in I/O Register I/O(P,b) <- 0
Номер бита (b) и номер побитно адресуемого регистра P* задается в коде инструкции (рис. 3.11).
Рис. 3.11. Формат команды с прямой адресацией в регистре ввода/вывода
· Операции с памятью данных
Операнды команды содержатся в одном из регистров общего назначения Rd или Rr и в одной из ячеек памяти данных (с номером $К).
Например,
lds Rd, k load direct from SRAM Rd <- (k) sts k, Rr store direct to SRAM (k) <- Rr
В 32-битном коде инструкции (рис. 3.12) адрес ячейки памяти занимает младшие 16 бит (младшее 16-битное слово), а номер регистра хранится в битах с номерами 16... 19 (четыре младших бита старшего 16-битного слова)
Рис.3.12. Формат команды с прямой адресацией памяти данных
· Операции с памятью программ
В инструкции указывается адрес ячейки памяти программ. Обычно таким образом адресуются различные команды переходов и обращения к подпрограммам.
Например,
jmp k Jump PC <- k
call k Call Subroutine PC <- k
Выполнение программы начинается с адреса, записанного непосредственно в команде
В 32-битном формате команды адрес ячейки памяти программ занимает младшие 16 бит (рис. 3.13).
Рис.3.13. Формат команды с прямой адресацией памяти программ