批量Load/Store指令的寻址方式
批量Load/Store指令用于实现在一组寄存器和一块连续的内存单元之间传输数据。也称为多寄存器寻址方式,即一条指令可以完成多个寄存器值的传送。这种寻址方式可以用一条指令最多完成传送16个通用寄存器的值,其语法格式为:
LDM|STM{<Cond>} <addressing_mode> <Rn>{!},<registers>{^}
其中<addressing_mode> 可以有四种寻址方式:
1.IA(Increment After,事后递增方式)
2.IB(Increment Before,事先递增方式)
3.DA(Decrement After,事后递减方式)
4.DB(Decrement Before,事先递减方式)
在STM、LDM指令中,寄存器列表与内存单元的对应关系:编号低的寄存器对应于内存中低地址单元;编号高的寄存器对应于内存中高地址单元。
在ARM中常用的数据进栈与出栈方式分别为STMFD和LDMFD。
STMFD——ST表示Store;M表示Multiple;F表示Full;D表示Descend。
LDMFD——LD表示Load;M表示Multiple;F表示Full;D表示Descend。
指令STMFD和LDMFD的地址计算方法:
STMFD指令的寻址方式为事前递减方式(DB)(由于在FD增长方式下SP指针指向满栈顶,需要先求址再入栈)
假设当前SP指向的地址为adress;
STMFD SP! {R0-R7,LR} ;adress-4<——[LR];adress-4*2<——[R7];...........;adress-4*9<——[R0].
{!}表示将数据全部压入堆栈中时,SP指向最后的地址。
STMFD SP! {LR,R7,R6,R5,R4,R3,R2,R1,R0} 与STMFD SP! {R0-R7,LR} 的执行结果是一样的,满足寄存器列表与内存单元的对应关系。
LDMFD指令的寻址方式为事后递增方式(IA)(由于在FD增长方式下SP指针指向满栈顶,先出栈,SP指针再指向新的栈顶)
假设当前SP指向的地址为adress;
LDMFD SP! {R0-R7,LR} ;R0<——[adress];R1<——[adress+4];...........,LR<——[adress+4*9].
{!}表示将数据全部出栈时,SP指向最后的地址。
LDMFD SP! {LR,R7,R6,R5,R4,R3,R2,R1,R0} 与LDMFD SP! {R0-R7,LR} 的执行结果是一样的,满足寄存器列表与内存单元的对应关系。
在此,应该注意的是数据出栈时,LDMFD中的FD只是说明为堆栈的生成方向,其与之前的STMFD相对应,并不是指SP指向的地址是从高到低的。堆栈是先进后出的,进栈顺序决定了出栈顺序!