AVR汇编(三):寻址方式
AVR汇编(三):寻址方式
AVR具有多种寻址方式,在介绍具体的汇编指令之前,有必要对它们做一定了解。
前面介绍过,AVR将内存空间分为多个部分:寄存器堆、I/O空间、数据空间、程序空间。这些空间支持的指令和寻址方式都各不相同。
寄存器堆的寻址方式
AVR中寄存器堆的寻址方式分为3种:立即寻址、单寄存器寻址、双寄存器寻址。
立即寻址
所谓立即寻址,就是指操作数直接编码在指令中。需要注意的是,只有 R16
~ R31
寄存器支持立即寻址。
例如:
ANDI R16, 0x01 ; R16 <- R16 & 0x01
单寄存器寻址
在单寄存器寻址方式下,操作数存放在目的寄存器 Rd
中。
例如:
INC R16 ; R16 <- R16 + 1
双寄存器寻址
在双寄存器寻址方式下,操作数分别存放在源寄存器 Rr
和目的寄存器 Rd
中。
例如:
ADD R16, R17 ; R16 <- R16 + R17
I/O空间的寻址方式
AVR中I/O空间具有独立的地址,范围为0x00~0x3F,支持直接寻址和位寻址。
直接寻址
在直接寻址方式下,操作数地址 A
直接编码在指令中。
例如:
OUT PORTB, R16 ; PORTB <- R16
位寻址
I/O空间中地址为0x00~0x1F的区域支持按位访问。
例如:
SBI PORTB, 2 ; PORTB.2 <- 1
数据空间的寻址方式
AVR中数据空间具有5种寻址方式:直接寻址、间接寻址、带前缀自减的间接寻址、带后缀自增的间接寻址、带偏移量的间接寻址。
直接寻址
在直接寻址方式下,操作数地址直接编码在指令中, Rd
/ Rr
指定目的寄存器/源寄存器。
例如:
LDS R16, 0X0100 ; R16 <- (0X0100)
间接寻址
在间接寻址方式下,操作数地址存放在 X
/ Y
/ Z
寄存器中。
例如:
LD R16, X ; R16 <- (X)
带前缀自减的间接寻址
在带前缀自减的间接寻址方式下,操作数地址存放在 X
/ Y
/ Z
寄存器中,并且在操作之前 X
/ Y
/ Z
先自减一。
例如:
LD R16, -X ; X <- X - 1, R16 <- (X)
带后缀自增的间接寻址
在带后缀自增的间接寻址方式下,操作数地址存放在 X
/ Y
/ Z
寄存器中,并且在操作之后 X
/ Y
/ Z
再自增一。
例如:
LD R16, X+ ; R16 <- (X), X <- X + 1
带偏移量的间接寻址
在带偏移量的间接寻址方式下,操作数地址由 Y
/ Z
寄存器和编码在指令中的偏移量 q
相加得出。
例如:
LDD R16, Y+2 ; R16 <- (Y + 2)
程序空间的寻址方式
AVR中程序空间具有5种寻址方式:常量寻址、带后缀自增的常量寻址、直接寻址、间接寻址、相对寻址,前两种寻址方式用于访问位于程序空间的常量,后三种用于程序跳转。
常量寻址
在常量寻址方式下,操作数地址(字节地址)存放在 Z
寄存器中, Z
寄存器中高15位指定字地址,最低位为0表示访问的是字的低位字节,1表示访问的是字的高位字节。
例如:
LPM R16, Z ; R16 <- (Z)
带后缀自增的常量寻址
在带后缀自增的常量寻址方式下,操作数地址(字节地址)存放在 Z
寄存器中,并且在操作之后 Z
寄存器自增一。
例如:
LPM R16, Z+ ; R16 <- (Z), Z <- Z + 1
直接寻址
在直接寻址方式下,程序接下来的执行地址(字地址) k
直接编码在指令中。
例如:
JMP FUNC ; PC <- FUNC
...
FUNC:
...
间接寻址
在间接寻址方式下,程序接下来的执行地址(字地址)存放在 Z
寄存器中。
例如:
IJMP ; PC <- Z
相对寻址
在相对寻址方式下,程序接下来的执行地址(字地址)为 PC
+ k
+ 1, k
的范围为-2048~2047。
例如:
RJMP FUNC ; PC <- FUNC 汇编器会自动计算k的值
...
FUNC: ; FUNC与RJMP指令的距离不能超过-2048~2047
...
参考资料
本文来自博客园,作者:chinjinyu,转载请注明原文链接:https://www.cnblogs.com/chinjinyu/p/17620399.html