函数调用过程
调用过程
- call f :将当前指令(call)的下一条指令地址压栈,然后跳转到 f 函数。
- f 函数初始化:将 rbp 压栈(保存调用者的 rbp),为了返回 main 函数时 rbp 寄存器指向正确的位置。将 rsp 赋值给 rbp,这是 f 函数的栈底。
返回过程
f 过程完了之后。
- pop rbp,将调用者的 rbp 赋值给 rbp 寄存器。
- ret(pop cs ip):返回调用者的调用位置的下一个位置
传入函数的参数在寄存器里(或者寄存器不够时放在上个函数(caller)的栈里,通过 rbp+offset 来访问),函数的局部变量放在 rbp-offset 里,如果这个函数后边不再调用函数,则rsp不用预留空间,否则 rsp-offset 以便call下层函数。