Косвенным образом могут адресоваться ячейки памяти данных или памяти программ.
· Операции с памятью данных
Операнд содержится в ячейке памяти данных. Адрес операнда находится в одном из регистров косвенной адресации 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. Относительная адресация памяти программ