STMFD主要用于保存现场,将寄存器中的值push到堆栈中!
LDMFD从堆栈中取中值恢复到寄存器中!
STMFD sp!, {R0-R7,LR}
arm规定,sp始终指向栈顶,且 STM指令把寄存器列表中索引最小的放在最低位置, 所以R0在最低地址,向上依次是R1,R2,…R7,LR。加上是fd(满递减),完成后SP指向保存R0的地址 。所以写在后面的寄存器先入栈。LDMFD写在前面的寄存器先出栈 。arm堆栈中以4个字节为一个单位。
@压栈 STMFD
memory[sp] = lr
for i = 7 to 0
sp = sp - 4
memory[sp] = ri
@出栈 LDMFD
for i = 0 to 7
ri = memory[sp]
sp = sp + 4
lr = memory[sp]
参考文档: