LDR R0,[R1] ,#4 ;R0←[R1]、R1←R1+4
LDR R0,[R1,R2] ;R0←[R1+R2]
在第一条指令中,将寄存器 R1 的内容加上 4 形成操作数的有效地址,从
而取得操作数存入寄存器 R0 中。
在第二条指令中,将寄存器 R1 的内容加上 4 形成操作数的有效地址,从
而取得操作数存入寄存器 R0 中,然后,R1 的内容自增 4 个字节。
在第三条指令中,以寄存器 R1 的内容作为操作数的有效地址,从而取得
操作数存入寄存器 R0 中,然后,R1 的内容自增 4 个字节。
在第四条指令中,将寄存器 R1 的内容加上寄存器 R2 的内容形成操作数的
有效地址,从而取得操作数存入寄存器 R0 中。
3.2.4 多寄存器寻址
采用多寄存器寻址方式,一条指令可以完成多个寄存器值的传送。这种寻址方
式可以用一条指令完成传送最多 16 个通用寄存器的值。以下指令:
LDMIA R0,{R1,R2,R3,R4} ;R1←[R0]
;R2←[R0+4]
;R3←[R0+8]
;R4←[R0+12]
该指令的后缀 IA 表示在每次执行完加载/存储操作后,R0 按字长度增加,
因此,指令可将连续存储单元的值传送到 R1~R4。
3.2.5 相对寻址
与基址变址寻址方式相类似,相对寻址以程序计数器 PC 的当前值为基地址,
指令中的地址标号作为偏移量,将两者相加之后得到操作数的有效地址。以下
程序段完成子程序的调用和返回,跳转指令 BL 采用了相对寻址方式:
BL NEXT ;跳转到子程序 NEXT 处执行
……
NEXT
……
MOV PC,LR ;从子程序返回
3.2.6 堆栈寻址
堆栈是一种数据结构,按先进后出(First In Last Out,FILO)的方式工
作,使用一个称作堆栈指针的专用寄存器指示当前的操作位置,堆栈指针总是
指向栈顶。
当堆栈指针指向最后压入堆栈的数据时,称为满堆栈(Full Stack),而当
堆栈指针指向下一个将要放入数据的空位置时,称为空堆栈(Empty
Stack)。
同时,根据堆栈的生成方式,又可以分为递增堆栈(Ascending Stack)
和递减堆栈(Decending Stack),当堆栈由低地址向高地址生成时,称为递
增堆栈,当堆栈由高地址向低地址生成时,称为递减堆栈。这样就有四种类型
的堆栈工作方式,ARM 微处理器支持这四种类型的堆栈工作方式,即:
-5555满递增堆栈:堆栈指针指向最后压入的数据,且由低地址向高地址生
成。
-5555满递减堆栈:堆栈指针指向最后压入的数据,且由高地址向低地址生
成。