0、寻址方式
寻址方式就是
处理器根据指令中给出的地址信息来寻找物理地址的方式。
1、立即寻址
立即寻址也叫立即数寻址,这是一种特殊的寻址方式,操作数本身就在指令中给出,只要取出指令也就去到了操作数。这个数被称为立即数,对应的寻址方式也叫做立即寻址。例如:
ADD R0, R0,
#1
;R0<--R0 + 1
ADD R0, R0,
#0x3f
;R0 <--R0 + 0x3f
以上两条指令中,第二个源操作数即立即数,要求以“ # ”位前缀,对于以十六进制表示的立即数,还要求在“ # ”后加上“ 0x ”或“ & ”
2、立即寻址
寄存器寻址就是
利用寄存器中的数值作为操作数
,这种寻址方式是各类微处理器经常采用的一种方式,也是一种执行效率较高的寻址方式。
ADD
R0, R1, R2
; R0 <-- R1 + R2
该指令的执行效果是将寄存器R1和R2的内容相加,其结果存放在R0中。
3、寄存器间接寻址
寄存器间接寻址就是
以寄存器中的值作为操作数的地址,而操作数本身存放在
存储器
中
。
例如以下指令:
ADD R0, R1,
[R2]
; R0 <-- R1 + [R2]
LDR R0,
[R1]
; R0 <-- [R1]
在第一条指令中,以寄存器R2的值作为操作数的地址,在存储器中取得一个操作数后与R1相加,结果存在寄存器R0中。
第二条指令将以R1的值为地址的存储器中的数据传送到R0中。
4、基址变址寻址
基址变址寻址就是
将寄存器(该寄存器一般称作基址寄存器)的内容与指令中给出的地址偏移量相加,从而得到一个操作数的有效地址L
:
LDR R0, [R1, #4] : R0 <-- [R1 + 4]
LDR R0, [R1, #4]
!
: R0 <-- [R1 + 4]、
R1 <-- R1 + 4
LDR R0, [R1], #4 : R0 <-- [R1] 、R1 <-- R1 + 4
LDR R0, [R1, R2] : R0 <-- [R1 + R2]
5、多寄存器寻址
采用多寄存器寻址方式,
一条指令可以完成多个寄存器值的传送
。这寻址方式可以用一条指令完成传送最多16个通用寄存器的值。以下指令:
LDR
IA
R0, {R1, R2, R3, R4} ; R1 <-- [R0]
; R2 <-- [R0 + 4]
; R3 <-- [R0 + 8]
; R4 <-- [R0 + 12]
该指令的后缀
IA
表示在每次执行完加载/存储操作后,R0按字长度增加,因此,指令可将连续存储单元的值传送到R1 ~ R4。
6
、相对寻址
与基址变址寻址方式类似,相对寻址
以程序计数器
PC
的当前值为基地址,指令中的地址标号作为偏移量,将两者相加之后得到操作数的有效地址
。以下程序段完成子程序的调用和返回,跳转指令
BL
采用了相对寻址方式:
BL NEXT ; 跳转到子程序NEXT处执行
......
NEXT
......
MOV PC, LR ;从子程序返回
7、堆栈寻址
堆栈是一种数据结构,按先进后出(
First In Last Out,FILO
)的方式工作,使用一个称作堆栈指针的专用寄存器指示当前的操作位置,堆栈指针总是指向栈顶。
递增
堆栈:向
高地址
方向生长
递减
堆栈:向
低地址
方向生长
满
堆栈:堆栈指针指向
最后压入堆栈的有效数据项
空
堆栈:堆栈指针指向下一个要放入数据的
空位置