x86 汇编:栈帧与函数调用
函数调用依赖栈保存返回地址、局部变量和部分调用现场。
栈增长方向
x86 栈通常向低地址增长。
rsp 指向当前栈顶,rbp 常被用作栈帧基准。
call 与 ret
call 会把返回地址压栈,然后跳转到目标函数。
ret 会从栈中弹出返回地址并跳回。
典型栈帧
push rbp
mov rbp, rsp
sub rsp, 32
编译器优化后不一定保留传统栈帧,但理解它对调试非常有帮助。
栈帧像函数的临时工作台
函数执行时需要一个地方放局部变量、保存旧寄存器、记录返回地址。这个地方通常就是栈。栈帧不是硬件强制的固定结构,而是编译器和调用约定共同形成的一种组织方式。
典型函数序言:
push rbp
mov rbp, rsp
sub rsp, 32
典型函数尾声:
leave
ret
优化后的变化
开启优化后,编译器可能省略 rbp,直接通过 rsp 访问栈空间;也可能把局部变量完全放在寄存器里,根本不落栈。
所以调试 Release 程序时,看到的栈帧可能和教材里的图不一样。这不是汇编错了,而是编译器做了优化。
评论
...正在读取评论。