前言
STM/LDM是一种批量加载/存储的指令,常用于入栈和出栈。
一、STM
STM翻译为Store Multiple registers.
STM 将寄存器列表中寄存器的值,存储到一块内存
格式
STM{条件}{s}<MODE>基址寄存器{!},{Reglist}^
代码如下(示例):
mov r3, #0x40000012
mov r0, #4
mov r1, #5
mov r2, #6
stmda r3!, {r0-r2}
二、LDM
LDM翻译为Load Multiple registers.
LDM 是将一 块内存中的数据, 加载到寄存器列表的寄存器中。
格式
LDM{条件}{s}<MODE>基址寄存器{!},{Reglist}^
代码如下(示例):
mov r0, #0
mov r1, #0
mov r2, #0
ldmia r3!, {r0-r2}
三、寻址模式(mode)
mode决定了基址寄存器是在执行指令前地址增减还是指令执行后增减.
-
I为Increment(递增)
-
D为Decrement (递减)
-
B为Before
-
A为After
1.IA IB DA DB
2."!"
在传输数据完成后,更新基址寄存器中的值
3."^"
在数据传输完成后,将SPSR的值复制到CPSR中,常用于异常模式下的返回.
4.ATPCS
ATPCS即ARM-THUMB procedure call standard(ARM-Thumb过程调用标准)的简称。
PCS规定了应用程序的函数可以如何分开地写,分开地编译,最后将它们连接在一起,所以它实际上定义了一套有关过程(函数)调用者与被调用者之间的协议。
ATPCS是arm公司为arm平台编译器设计的一种规范,默认为慢递减堆栈。
FD 慢递减堆栈
FA 满递增堆栈
ED 空递减堆栈
EA 空递增堆栈
这四种也是寻址模式,但是他们更加标准、规范化,用法其他四种基本相同.
PS:其实LDM/LDMIA/LDMFD 是同一条指令,STM (STMIA, STMEA) 是同一条指令