一、栈操作指令
关于栈操作的基本定义:
减栈 向内存地址减小的方向发生变化
增栈 向内存地址增栈的方向发生变化
满栈 栈顶有有效数据
空栈 栈顶没有有效数据
注意: 所谓的满栈和空栈,并不是栈空间是满的还是空的!而是看栈顶中是否存在有效数据
接下来往栈空间中放数据时, 如果需要先改变SP的值, 则为满栈, 如果可以直接放数据, 则为空栈!(sp 即r13寄存器,又名栈指针(stack pointer) )
两两组合有下列4种栈:
满减栈 Full Descending ARM中默认使用的栈的形式是满减栈
满增栈
空减栈
空增栈
STMFD (Push) Full Descending stack
LDMFD (Pop) Full Descending stack
STMXX sp!, {r1, r2, r3, r5, r8}
@ 将r1, r2, r3, r5, r8 寄存器中的值存放到sp指向的栈空间中
LDMXX sp!, {r1, r2, r3, r5, r8}
@ 将sp 指向的栈空间中的数据加载到 r1, r2, r3, r5, r8 寄存器中
xx:
fd 满减 ldmfd sp!, {r1, r2, r3, r5, r8}
fa 满增
ed 空减
ea 空增
实际操作:
stmfd sp!, {r0-r5, r8} === push {r0-r5, r8} 压栈操作
ldmfd sp!, {r0-r5, r8} === pop {r0-r5, r8} 弹栈操作
按满减栈进行压栈, 也按满减栈进行弹栈, 就能恢复寄存器的内容