Адресация данных

 

Адреса операндов, задействованных в выполнении любой инструкции программы, в явном или в неявном виде должны быть указаны в коде этой инструкции. Операнды могут находиться в ячейках памяти данных, в регистрах общего назначения, в регистрах ввода/вывода и даже в ячейках памяти программ. В системе команд микроконтроллера, как правило, различные способы данных, позволяющие программисту задавать адреса операндов в разнообразных инструкциях. В зависимости от архитектуры код инструкции может занимать одну или несколько ячеек программной памяти. При этом для хранения адресов могут отводиться отдельные биты в ячейке или целые ячейки.

Например, в архитектуре 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. Формат команды с прямой адресацией памяти программ