堆栈基础概念

1.栈(堆栈)是进程虚拟内存里一块专属内存区域,程序加载时由操作系统自动划分分配;每个 32 位进程独享 4GB 虚拟地址空间,栈是其中固定分区
2.普通堆内存需要程序员手动调用 API(如 malloc、VirtualAlloc)向系统申请释放;栈无需手动申请,系统预先分配好直接使用
3.栈专门存放运行时临时数据:函数局部变量、函数返回地址、寄存器现场、函数参数、临时运算值

栈和普通内存核心差异

1.分配方式:栈自动分配;堆 / 普通内存手动申请释放
2.读写规则:栈遵循先进后出 (FILO);普通内存随机读写无顺序限制
3.增长方向:栈高地址向低地址扩张(从后往前用);堆一般低地址向高地址增长
4.大小固定:栈容量预设上限,空间很小;堆空间大,可动态扩容

堆栈内存特征

1.地址走向:初始栈顶是高地址,每压入数据,地址变小(向低地址延伸)
2.空间消耗:PUSH 压栈→ESP 减小,占用栈空间;POP 出栈→ESP 增大,释放栈空间
3.栈溢出风险:不断大量 PUSH、深层递归无限调用,栈空间用尽,发生栈溢出,程序崩溃报错

ESP 栈指针寄存器

1.ESP = 栈顶指针,永远标记当前栈最顶端空闲位置,是栈的唯一管理核心
2.所有栈操作自动修改 ESP,CPU 硬件自动计算偏移,不用手动加减地址
3.EBP 作为栈基址,用来稳定寻址局部变量与函数参数,ESP 会频繁浮动变化

栈操作指令 PUSH / POP

1.PUSH 压栈(存入数据)
操作逻辑(32 位,压入双字):
ESP = ESP - 4 栈顶向下移动 4 字节
把数据写入 SS:[ESP] 新栈顶位置
支持操作:寄存器、立即数、内存数据
push eax
push 0x123456
push dword ptr [0x402000]
2. POP 出栈(取出数据)
操作逻辑(32 位):
读取 SS:[ESP] 栈顶数据送入目标寄存器 / 内存
ESP = ESP + 4 栈顶向上回收 4 字节空间
pop ebx
pop dword ptr [esi]

Logo

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构

更多推荐