x86汇编:为什么我需要堆栈帧?

Dan*_*cco 5 x86 assembly nasm

在大多数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个问题:

  1. 如果我的代码没有触及堆栈,那么如上所述设置/移除堆栈帧是完全没用的,对吧?

  2. 即使我的代码使用了堆栈,只要弹出我推送的所有东西(基本上就是堆栈)然后再次设置堆栈帧是完全没用的,对吧?

  3. 我认为这样做的唯一目的就是节省ESP的价值,以便我可以在我的代码中使用它而不用担心搞乱事情,一旦完成,我只需恢复其原始值.这是堆栈框架设置的目的还是我遗漏了什么?

谢谢

nul*_*ptr 6

嗯,事实上,你不需要堆栈帧.

保存寄存器并将局部变量存储在堆栈中时,堆栈帧很方便 - 使编写和调试更容易:只需设置ebp堆栈中的固定点并使用即可处理所有堆栈数据ebp.并且esp最终还原更容易.

此外,调试器通常期望存在堆栈帧,否则您可能会获得不准确的堆栈调用.

所以,1的答案是肯定的,2和3的答案在上面.