assembly - 为什么我们在汇编的CALLEE中出现 "PUSH EBP"和 "MOV EBP, ESP"?

标签 assembly x86 x86-64 cpu-registers

我们为什么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/

相关文章:

assembly - IRQ 编号冲突

c - 我如何找到我正在运行的 CPU/内核?

macos - 如何在asm中使用malloc

assembly - 使用 CALL 读取 RIP 避免 shellcode 中的 0xFF 字节?

c - 通过arm c内联汇编器操作内存中的数组

assembly - 在 MASM32 程序集中打印 unicode 字符

通过在寄存器中传递函数地址从 asm 文件调用 C 函数

performance - 计算数组中“小于x”的元素

performance - “retired”是什么意思?

c++ - 什么时候会在编译过程中删除琐碎的(没有效果的代码)代码?