批量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中常用的数据进栈与出栈方式分别为STMFDLDMFD

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指向的地址是从高到低的。堆栈是先进后出的,进栈顺序决定了出栈顺序!

原文地址:https://www.cnblogs.com/getyoulove/p/3674168.html