Косвенная адресация

 

Косвенным образом могут адресоваться ячейки памяти данных или памяти программ.

 

· Операции с памятью данных

 

Операнд содержится в ячейке памяти данных. Адрес операнда находится в одном из регистров косвенной адресации X, Y или Z.

 

Например,

ld Rd, X load indirect Rd <- (X)

ld Rd, Y load indirect Rd <- (Y)

ld Rd, Z load indirect Rd <- (Z) В 16-битном формате команды адрес ячейки памяти не фигурирует (рис. 3.14).

 
 

 


Рис.3.14. Косвенная адресация памяти данных

 

· Адресация памяти данных с постинкрементом

 

Операнд содержится в ячейке памяти данных. Адрес операнда находится в одном из регистров косвенной адресации X, Y или Z. После выполнения операции регистр косвенной адресации (X, Y или Z) инкрементируется (рис. 3.15).

Например:

ld Rd, X+ load indirect and post-increment Rd <- (X), X <- X + 1 ld Rd, Y+ load indirect and post-increment Rd <- (Y), Y <- Y + 1

 

 
 

 


Рис. 3.15. Косвенная адресация памяти данных с постинкрементом

 

· Адресация памяти данных с преддеккрементом

 

Операнд содержится в ячейке памяти данных. Адрес операнда находится в одном из регистров косвенной адресации X, Y или Z. Перед выполнением операции регистр косвенной адресации (X, Y или Z) декрементируется (рис. 3.16).

Например: ld Rd, - X load indirect and pre-decrement X <- X -1, Rd <- (X)

 
 

 

 


Рис.3.16. Косвенная адресация памяти данных с преддекрементом

· Адресация памяти данных со смещением

 

Операнд содержится в ячейке памяти данных. Адрес операнда вычисляется суммированием содержимого регистра Y или Z с 6 битами адреса, содержащимися в инструкции (рис. 3.17). Например,

ldd Rd,Y+q load indirect with displacement Rd <- (Y + q) ldd Rd, Z+q load indirect with displacement Rd <- (Z + q)

 
 

 


Рис.3.17. Косвенная адресация памяти данных со смещением

 

· Косвенная адресация памяти программ

 

Адрес константы в памяти программ определяется содержимым регистра Z или выполнение программы продолжается с адреса, записанного в регистре Z (программный счетчик загружается содержимым регистра Z).

Например, команды, обращающиеся за данными к памяти программ: lpm load program memory Ri:R0<r(Z) spm store program memory (Z) <- R1 :R0

Инструкция SPM, модифицирующая программу может быть использована только в разделе Boot Program Section памяти программ (рис.2.1). Команды переходов

ijmp indirect jump to (z) PC <- Z

 
 

 

 


Рис. 3.18. Косвенная адресация памяти программ

 

4. Относительная адресация

 

Относительная адресация используется при обращении к памяти программ. В инструкциях перехода с помощью относительной адресации модифицируется содержимое программного счетчика.

Например,

rjmp k relative jump PC <- PC + k + 1

rcall k relative subroutine call PC <- PC + k + 1

При этом Выполнение программы продолжается с адреса PC + k + 1. Значение относительного адреса может быть от -2048 до 2047 (рис. 3.19).

 
 

 

 


Рис.3.19. Относительная адресация памяти программ