根据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