我最近研究了x86程序集,并不明白为什么我们要做 push ebp 进入新功能时。
从调查中我可以看出对ebp的需求是因为它可以轻松访问函数调用的参数和这个新被调用者中的局部变量。
但是我不知道为什么在转到新的堆栈帧时我们必须存储旧的帧指针?
这是因为这样做会使堆栈跟踪更容易进行调试吗?
以下是我的测试代码:
foobar:
.LFB0:
.cfi_startproc
push ebp #Why do this here??
....
....
mov ebp, esp
提前致谢
答案 0 :(得分:4)
您甚至不必使用帧指针,调用约定并不强制要求,优化代码通常不会。调用约定所规定的是,某些寄存器是被调用者保存的,即必须为调用者保留它们。这通常包括ebp
。这个要求可以通过推/弹来实现。
作为副作用,如果您确实使用了帧指针,并且您确实知道调用者的结构,则可以使用它来访问其帧。但是通常不使用它。