ARM汇编-栈操作指令

ARM中栈种类

在ARM中有4种栈,分别是:减栈、增栈、满栈、空栈

  • 减栈:向内存地址减小的方向发生变化
  • 增栈:向内存地址增加的方向发生变化
  • 满栈:栈指针(sp)指向的栈顶有有效数据
  • 空栈:栈指针(sp)指向的栈顶没有有效数据

在学习ARM的三级流水线时,执行取指、解码、执行三步操作时对PC进行偏移,每一步都偏移PC-4。

上述偏移之所以是PC-4,原因就是在ARM种默认的栈种类就是减栈。

上述4种栈也可以进行组合,再次区分为: 满减栈、满增栈、空减栈、空增栈。ARM中默认使用的栈的形式是满减栈。

栈指令

LDMXX sp!, {r1, r2, r3, r5, r8}

sp指向的栈空间中的数据加载到 r1, r2, r3, r5, r8 寄存器中

STMXX sp!, {r1, r2, r3, r5, r8}

将 r1, r2, r3, r5, r8 寄存器中的值存放到sp指向的栈空间中

1
2
3
4
5
其中xx:
fd 满减 ldmfd sp!, {r1, r2, r3, r5, r8}
fa 满增
ed 空减
ea 空增

往栈空间中放数据时,如果需要先改变sp的值,则为满栈,如果可以直接放数据则为空栈。

1
2
stmfd sp!, {r0-r5, r8}    === push {r0-r5, r8} 压栈操作 
ldmfd sp!, {r0-r5, r8} === pop {r0-r5, r8} 弹栈操作

按满减栈进行压栈, 也按满减栈进行弹栈, 就能恢复寄存器的内容

局部变量在栈空间中的分布

image-20230204181304805