复习函数调用的过程(附“精美”草图)

函数调用的步骤:

  1. 参数准备

    • 在x86-64架构中,前六个整数或指针参数通常通过寄存器传递,分别是:RDIRSIRDXRCXR8R9
    • 浮点参数通常通过 XMM0 至 XMM7 寄存器传递。
    • 如果有更多参数,或者参数是复杂的数据结构,它们通常会被放在调用者堆栈上。
  2. 调用指令

    call 指令用于实际调用函数。这条指令会将下一条指令的地址(返回地址)推入堆栈,然后跳转到函数的起始地址执行。
  3. 进入被调用函数(被调用者)

    • 被调用的函数首先需要保存调用者寄存器的状态,这通常通过将这些寄存器的值推入堆栈来完成。
    • 接着,它会为局部变量分配空间,这是通过调整栈指针 RSP 来实现的。
    • 在这个阶段,被调用函数也可能会创建一个新的栈帧,通过更新基指针 RBP,使其指向当前的栈顶。
  4. 函数执行

    函数执行它的操作,可能会进一步调用其他函数,或者访问/修改它的参数和局部变量。
  5. 设置返回值

    函数执行完成后,任何返回值通常会放在 RAX(对于整数和指针)或 XMM0(对于浮点数)寄存器中。
  6. 恢复调用者环境

    函数在返回之前需要恢复调用者的栈帧,这通常包括释放局部变量占用的栈空间和恢复任何保存的寄存器。
  7. 返回指令

    ret 指令用于从函数返回。这条指令从堆栈中弹出返回地址并跳转到那里,这样控制权就回到了调用者。
  • 5
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值