ARM:什么是满减栈?为何选择满减栈?

栈的4种方式(以下以满减为主)

1. 满减栈的定义

  • 满(Full) :栈指针SP始终指向最后一个压入栈的有效数据(即栈顶元素)。

  • 减(Descending) :栈向内存低地址方向增长(栈空间从高地址向低地址扩展)。


2. 压栈操作

当数据被压入栈时:

  1. 先递减SP:SP的值先减去操作所需的内存大小(例如,32位系统每次减4字节)。

  2. 再存储数据:将数据写入SP指向的新地址。


3. 弹栈操作

当数据从栈中弹出时:

  1. 先读取数据:从SP当前指向的地址加载数据。

  2. 再递增SP:SP的值加上相应的内存大小。


4. 硬件指令的支持

ARM通过以下两类指令显式支持满减栈:

a. 多寄存器操作指令
  • 压栈STMDB SP!(Store Multiple Decrement Before)

    复制代码

    STMDB SP!, {R0-R3} ; SP -= 16 → 依次存储R3, R2, R1, R0到新地址

    • STMDB(递减存储)会在存储前递减SP,符合"满减"规则。

    • !表示更新SP的值。

  • 弹栈LDMIA SP!(Load Multiple Increment After)

    复制代码

    LDMIA SP!, {R0-R3} ; 依次加载R0, R1, R2, R3 → SP += 16

    • LDMIA(递增加载)在加载后递增SP,符合"先读后增"逻辑。
b. 专用栈指令(Thumb模式)

在Thumb-2指令集中,PUSHPOP指令进一步简化操作:

复制代码

PUSH {R0, R1} ; SP -= 8 → 存储R1, R0到[SP]和[SP+4] POP {R0, R1} ; 加载[SP]到R0, [SP+4]到R1 → SP += 8


5. 为何选择满减栈?

  • ARM ABI规范 :AAPCS(ARM Architecture Procedure Call Standard)规定使用满减栈作为标准调用约定。

  • 硬件效率:递减存储(STMDB)和递增加载(LDMIA)的组合可以高效处理连续内存操作,且与CPU流水线优化兼容。

  • 自然向下扩展:栈从高地址向低地址增长,与堆(Heap)从低地址向高地址扩展形成互补,避免内存区域重叠。

  • 调试友好:栈溢出时,SP指向低地址的非法区域,便于调试工具检测(如MMU异常)。


6. 实际内存变化示例

假设初始时 SP = 0x2000_1000

  1. 压栈R0(值=0x1234)

    1. SP -= 4SP = 0x2000_0FFC

    2. 存储 0x1234 到地址 0x2000_0FFC

  2. 再次压栈R1(值=0x5678)

    1. SP -= 4SP = 0x2000_0FF8

    2. 存储 0x5678 到地址 0x2000_0FF8

  3. 弹栈到R2

    1. 读取 0x2000_0FF8R2 = 0x5678

    2. SP += 4SP = 0x2000_0FFC


总结

ARM通过硬件指令的寻址模式 (如STMDB/LDMIASTMFD/LDMFD)强制SP在压栈时先减后存 、弹栈时先取后增,从而实现了"满减"栈。这种机制由架构直接支持,确保了栈操作的原子性和高效性,同时符合ARM标准调用约定(AAPCS)。


额外注意:

一般来说栈(stack)从高地址向低地址延申,堆(heap)从低地址向高地址延申,他们从两端向中间生长。

相关推荐
zlinear数据采集卡8 小时前
数据采集卡从入门到精通(10):采样率与分辨率的核心关系——反比律、架构分布与过采样
arm开发·嵌入式硬件·算法·fpga开发·架构·开源
CIAS11 小时前
uniontechos-server-20 1050 u2a pxe Server -x86 arm loongarch
arm开发
振南的单片机世界11 小时前
推挽vs开漏:一个“强拉硬灌”,一个“只拉不管”
arm开发·stm32·单片机·嵌入式硬件
zlinear数据采集卡14 小时前
数据采集卡从入门到精通(7):流水线型ADC——级级接力,高速与高精的平衡术
开发语言·arm开发·嵌入式硬件·fpga开发·c#
硅农程序猿1 天前
从需求到硅片| 一文讲清数字芯片设计流程
arm开发·硬件架构·risc-v
秋田君2 天前
QT_网络编程体系
网络·arm开发·qt
zlinear数据采集卡2 天前
D223上位机C#开发实战:从帧解析到波形显示的完整实现
开发语言·arm开发·嵌入式硬件·fpga开发·开源·c#
振南的单片机世界2 天前
SysTick硬核拆解:既是HAL_Delay的“心跳”,也是RTOS的“节拍器”
arm开发·stm32·单片机·嵌入式硬件
北京盛世宏博2 天前
以太网温湿度传感器星型组网三种供电布线技术对比文档
arm开发·以太网·原理·传感器·温湿度·原来
zlinear数据采集卡2 天前
D223 ADC数据处理流水线:从原始采样值到工程单位的完整转换链
开发语言·arm开发·嵌入式硬件·fpga开发·开源·c#