根据ATPCS规则,我们一般使用FD(FullDescending)类型的数据栈!所以经常使用的指令就有STMFD和LDMFD。这两个指令一般用于进行程序搬移等大规模操作前的cpu现场保护和操作结束后的现场恢复,属于非单一连续的压栈和出栈。

进栈举例:

STMFD SP!, {R0-R7,LR}

其意义是:

;假设当前刚进栈时,SP指向地址: 0x4000 045C
;先递减堆栈指针SP: 
;9*4: 因为每个寄存器为32位,所以占4B, 而{R0-R7,LR}一共为9个寄存器,所以其按字节编址的情况下,一共占用的地址数为:9*4
;那么SP - 9*4运算后的地址为: 0x4000 043C
SP = SP - 9*4

;取SP当前指向的地址: 0x4000 043C
address = SP

;先对逗号,前的一组通用寄存器进行压栈,从R0~R7,一共8个寄存器,开始遍历:
for  i=0 to 7
{
    ;i=0时,先将R0压入0x4000 043C
    ;i=1时,再将R1压入0x4000 0440
    ;i=2时,再将R2压入0x4000 0444
    ;i=3时,再将R3压入0x4000 0448
    ;i=4时,再将R4压入0x4000 044C
    ;i=5时,再将R5压入0x4000 0450
    ;i=6时,再将R6压入0x4000 0454
    ;i=7时,再将R7压入0x4000 0458
    memory[address] = Ri
    ;然后递增address的地址,同理因为每个寄存器为32位,占用4B,所以每次递增4个地址:
    address =address+4
}

;最后将R14表示的LR返回寄存器的地址压入SP指向的地址0x4000 045C
memory[address] = LR

其进栈效果:

出栈举例:

LDMFD SP!, {R0-R7,LR}

其出栈过程算是STMFD的逆过程,请自行分析。
其出栈效果:


作者:weiwei_xiaoyu ,来源:https://blog.csdn.net/weiwei_xiaoyu