在大多数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
Run Code Online (Sandbox Code Playgroud)
关于这种做法我有3个问题:
如果我的代码没有触及堆栈,那么如上所述设置/移除堆栈帧是完全没用的,对吧?
即使我的代码使用了堆栈,只要弹出我推送的所有东西(基本上就是堆栈)然后再次设置堆栈帧是完全没用的,对吧?
我认为这样做的唯一目的就是节省ESP的价值,以便我可以在我的代码中使用它而不用担心搞乱事情,一旦完成,我只需恢复其原始值.这是堆栈框架设置的目的还是我遗漏了什么?
谢谢
嗯,事实上,你不需要堆栈帧.
保存寄存器并将局部变量存储在堆栈中时,堆栈帧很方便 - 使编写和调试更容易:只需设置ebp堆栈中的固定点并使用即可处理所有堆栈数据ebp.并且esp最终还原更容易.
此外,调试器通常期望存在堆栈帧,否则您可能会获得不准确的堆栈调用.
所以,1的答案是肯定的,2和3的答案在上面.