Art*_*gio 8 x86 assembly x86-64 cpu-registers
为什么我们push ebp
作为装配函的Callee中的第一个动作?
我知道然后我们mov edi, [ebp+8]
用来获取传入的变量,但是我们esp
已经指向了调用函数的返回地址.我们可以轻松访问传入的变量,mov edi, [esp+4]
或者如果我们按下Callee寄存器,那么mov edi, [esp+16]
.
那么,为什么在cpu(the ebp
)中有额外的寄存器,以后你必须在函数中管理?即
push ebp
mov ebp, esp
...
mov esp, ebp
pop ebp
Run Code Online (Sandbox Code Playgroud)
它在被调用者中建立一个新的堆栈帧,同时保留调用者的堆栈帧.堆栈帧允许使用相对于EBP
函数中任何位置的固定偏移量对传递的参数和局部变量进行一致访问,同时ESP
可以在函数运行时根据需要继续进行修改.ESP
是一个移动目标,因此使用动态偏移相对于访问参数和变量ESP
可能是棘手的,如果不是不可能的话,取决于函数如何使用堆栈.创建堆栈帧通常更安全,代价是使用几个字节的堆栈空间来保留指向调用者堆栈帧的指针.