我们为什么push ebp
作为汇编函数的被调用者中的第一个操作?
我明白了,那么我们使用mov edi, [ebp+8]
获取传入的变量,但是我们的 esp
已经指向调用者函数的返回地址。我们可以使用 mov edi, [esp+4]
轻松访问传入的变量或者如果我们压入被调用者寄存器,则 mov edi, [esp+16]
.
那么,为什么 CPU 中有额外的寄存器( ebp
),您稍后必须在函数中管理它?即
push ebp
mov ebp, esp
...
mov esp, ebp
pop ebp
最佳答案
它正在建立一个新的stack frame在被调用者内部,同时保留调用者的堆栈帧。堆栈帧允许使用相对于函数中任何位置的 EBP
的固定偏移量来一致地访问传递的参数和局部变量,而 ESP
可以在函数运行时根据需要自由地继续修改在跑。 ESP
是一个移动目标,因此使用相对于 ESP
的动态偏移量访问参数和变量可能会很棘手(如果不是不可能的话),具体取决于函数如何使用堆栈。创建堆栈帧通常更安全,但代价是使用几个字节的堆栈空间来保存指向调用者堆栈帧的指针。
关于assembly - 为什么我们在汇编的CALLEE中出现 "PUSH EBP"和 "MOV EBP, ESP"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36046201/