函数调用过程

调用过程

  1. call f :将当前指令(call)的下一条指令地址压栈,然后跳转到 f 函数。
  2. f 函数初始化:将 rbp 压栈(保存调用者的 rbp),为了返回 main 函数时 rbp 寄存器指向正确的位置。将 rsp 赋值给 rbp,这是 f 函数的栈底。

返回过程

f 过程完了之后。

  1. pop rbp,将调用者的 rbp 赋值给 rbp 寄存器。
  2. ret(pop cs ip):返回调用者的调用位置的下一个位置

传入函数的参数在寄存器里(或者寄存器不够时放在上个函数(caller)的栈里,通过 rbp+offset 来访问),函数的局部变量放在 rbp-offset 里,如果这个函数后边不再调用函数,则rsp不用预留空间,否则 rsp-offset 以便call下层函数。

posted @ 2024-04-01 20:22  hellozhangjz  阅读(10)  评论(0编辑  收藏  举报