为什么将我们push ebp
作为Assembly函数的Callee中的第一个动作?
我知道然后我们可以使用mov edi, [ebp+8]
传入的变量,但是我们esp
已经指向了Caller函数的返回地址。我们可以轻松地访问传入的变量,方法是使用mov edi, [esp+4]
或如果我们推送Callee寄存器,则访问mov edi, [esp+16]
。
那么,为什么要在ebp
以后必须在功能中管理的cpu(the )中拥有额外的寄存器呢?IE
push ebp
mov ebp, esp
...
mov esp, ebp
pop ebp
它在被调用方内建立新的堆栈框架,同时保留调用方的堆栈框架。堆栈框架允许使用相对于EBP
函数中任何位置的固定偏移量一致地访问传递的参数和局部变量,同时可以在函数运行时ESP
自由根据需要继续对其进行修改。ESP
是一个移动目标,因此ESP
根据函数使用堆栈的方式,即使不是不可能,使用相对于动态偏移量访问参数和变量也可能很棘手。创建堆栈框架通常更安全,但要花一些字节的堆栈空间来保存指向调用者堆栈框架的指针。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句