所谓的寻址方式就是根据指令中的操作数的信息来寻找操作数实际物理地址的方式。根据指令中给出操作数的不同格式,ARM指令支持如下几种常见的寻址方式:
1.立即数寻址:
立即数寻址也叫作立即寻址,操作数本身就在指令中直接给出,取出这个指令也就获取到了操作数。该操作数也被成为立即数。
比如:MOV R0,#15
指令分析:将立即数15传入R0寄存器中。立即数用前缀"#"表示,不同的进制也有不同的表示方式默认是十进制。十六进制在"#"后面加上"0x"或者"&",二进制加上"0b"。
2.寄存器寻址
利用寄存器中的数值作为操作数。执行效率比较高。
比如:ADD R0,R1,R2
指令分析:将R1+R2的值存入R0中。如果R1=0X00000001,R2=0X00000002。那么R0的值就是0x00000003
3.寄存器间接寻址
以寄存器中的值作为操作数的地址,而操作数本身存在存储器中。
比如:LDR R0,[R1]
指令分析:将寄存器R1的值作为操作数的地址,在存储器中取得一个操作数存入寄存器R0中。
如图:
4.寄存器移位寻址
操作数由寄存器中的数值做相应的移位得到。
比如:ADD R0,R1,R2,LSL #1
指令分析:将R1+(R2向左移位1)的值存入R0中。
5.基址变址寻址
将基址寄存器的内容和指令中给出的地址偏移量相加,从而得到一个操作数的地址。
比如:LDR R0,[R1,#4]
指令分析:将R1+4的值放入R0寄存器中
6.多寄存器寻址
就是一条指令可以完成多个寄存器值的传送。最多可以传16个寄存器的值。用"-"连接,","分隔。
例如:LDMIA R0!,{R1-R4}
LDMIA R0!,{R1,R3}
7.相对寻址
与基地变址寻址类似,以PC的当前值作为基地址,指令中的地址标号作为偏移量,两者相加。
例如:BL iehshx
....
iehshx ADD R0,#1
8.堆栈寻址
堆栈是数据结构里的。堆先进先出;栈先进后出。使用一个堆栈指针指示当前的操作位置,堆栈指针指向栈顶。ARM分别采用LDMFD 和 STMFD指令进行pop 和 push的操作。R13作为堆栈指针。
例如:STMFD R13!,{R0-R4}
LDMFD R13!,{R0-R4}
总结:在ARM中的常用寻址方式有八种:立即数寻址,寄存器寻址,寄存器间接寻址,寄存器移位寻址,基址变址寻址,多寄存器寻址,相对寻址,堆栈寻址。