寻址方式是根据指令中给出的地址码来定位真实的地址,ARM中有9种寻址方法:

寄存器寻址

直接用寄存器编号来寻址,最为常用

  MOV R1,R2 ;R2->R1

立即数寻址

即指令中的地址码是操作数本身,可以立即取出使用,立即数前带一个#表示,否则表示一个地址

SUBS R0,R0,#1   ;R0 -1 ->R0

注意与SUBS R0,R0,1区别

寄存器偏移寻址

这是ARM特有的寻址模式,当第2操作数是寄存器,在执行操作之前,可以做一次移位操作

MOV R0,R2,LSL #3 ;R2的逻辑左移3位,结果放入R0,即R0=R2*8
ANDS R1,R1,R2,LSL R3;RS的值左移R3位,然后和R1相与操作,结果放入R1

移位操作有LSL (逻辑左移),LSR(逻辑右移) ,ASR(算术右移),ROR(循环右移)RRX带扩展的循环右移

ARM指令的寻址方式 - 图1

寄存器间接寻址

即寄存器中值是一个地址,用[]来取出定位到地址当中

 LDR R2,[R0] ;把R0的值当成地址,取出相应值,赋给R2

基址寻址

把寄存器的地址值加上一个偏移量

LDR R2,[R3,#0x0F]; R3中的值加上0x0F,从这个地址取出值赋给R@

相对寻址

基址寻址的变形,由PC寄存器提供基准地址,指令中地址段作为偏移量.两者相加即是有效地址,以下是BL采用相对寻址

BL NEXT
…

NEXT
…

MOV PC,LR ;从子程序返回