【发布时间】:2013-06-18 20:28:11
【问题描述】:
在我看到的大多数 x86 汇编(特别是 NASM)代码示例中(即使是 GCC 生成的代码示例),我看到了所谓的“堆栈框架设置”。像这样:
main:
/*setting the stack frame*/
push ebp
mov ebp,esp
...
code goes here
...
/*removing the stack frame*/
mov esp, ebp
pop ebp
我对这种做法有 3 个问题:
如果我的代码没有触及堆栈,那么如上所述设置/删除堆栈框架是完全没用的,对吧?
即使我的代码使用堆栈,只要弹出我推送的所有内容(本质上保持堆栈不变)然后再次设置堆栈帧完全没用,对吧?
在我看来,这样做的唯一目的是保存 ESP 的值,这样我就可以在我的代码中使用它而不必担心搞砸了,一旦我完成了,我只需恢复它原值。这是堆栈框架设置的目的还是我遗漏了什么?
谢谢
【问题讨论】:
-
如果要调试程序并查看堆栈跟踪,堆栈帧也是必要的。
-
栈帧并不是真正需要的。如你看到的。在 X86-64 中,我们没有堆栈帧和 ebp 寄存器。所以你是对的,堆栈框架只是为了方便。
-
-fomit-frame-pointer在 Linuxgcc -m32中默认开启,当启用优化时。 2013 年可能不是这种情况,或者如果您使用的是更旧的编译器,但多年来(2018 年)一直是这种情况。-fomit-frame-pointer在 x86-64 模式下一直默认开启。