Assembly 为什么在转到下一个堆栈帧时存储旧的帧指针

Assembly 为什么在转到下一个堆栈帧时存储旧的帧指针,assembly,x86,Assembly,X86,我最近研究了x86程序集,不明白为什么我们要推动ebp 当输入新函数时 从调查中,我可以看出ebp的必要性是因为它可以轻松访问函数调用的参数和这个新被调用方中的局部变量 但我不知道为什么我们必须在转到新堆栈帧时存储旧的帧指针 这是因为这样做会使堆栈跟踪更容易调试吗 以下是我的测试代码: foobar: .LFB0: .cfi_startproc push ebp #Why do this here?? .... .... m

我最近研究了x86程序集,不明白为什么我们要推动ebp 当输入新函数时

从调查中,我可以看出ebp的必要性是因为它可以轻松访问函数调用的参数和这个新被调用方中的局部变量

但我不知道为什么我们必须在转到新堆栈帧时存储旧的帧指针

这是因为这样做会使堆栈跟踪更容易调试吗

以下是我的测试代码:

foobar:
.LFB0:
    .cfi_startproc
    push ebp                 #Why do this here??
    ....
    ....
    mov ebp, esp

提前感谢

您甚至不必使用帧指针,调用约定并不要求这样做,优化代码通常也不要求这样做。然而,调用约定规定的是一些寄存器是被调用方保存的,也就是说,它们必须为调用方保留。这通常包括
ebp
。可通过推动/弹出来满足此要求


作为一个副作用,如果您确实使用帧指针,并且您确实知道调用者的结构,那么您可以使用它来访问其帧。但是,这通常不被使用。

您甚至不必使用帧指针,调用约定并不要求使用帧指针,而优化代码通常不要求使用帧指针。然而,调用约定规定的是一些寄存器是被调用方保存的,也就是说,它们必须为调用方保留。这通常包括
ebp
。可通过推动/弹出来满足此要求

作为一个副作用,如果您确实使用帧指针,并且您确实知道调用者的结构,那么您可以使用它来访问其帧。然而,这通常不被使用