盘锦市网站建设_网站建设公司_Bootstrap_seo优化
2026/1/18 21:05:20 网站建设 项目流程

AArch64和X86下的函数调用

最近在研究llvm-bolt的indirect-call-promotion优化,借着这个机会一并总结下函数调用的概念以及底层的一些相关实现,鉴于知识局限性,部分细节描述可能不到位,欢迎纠正。
函数调用在 CPU层面的实现,并不像高级语言的实现中看起来那么简单,即使是汇编指令也是隐藏了大量细节的一层封装。

不同架构下的通用寄存器

AArch64架构下的通用寄存器

  • AArch64架构下有31个64bit通用寄存器,还有几个特殊寄存器。
X0 ~ X30: 通用寄存器
XZR: 零寄存器
SP:栈指针注:SP和XZR共享同一个寄存器编码(X31的编码),但不是同一个物理寄存器;SP对应真实物理寄存器,但是XZR是一种0的硬编码,不对应物理寄存器
  • 各寄存器一般作用
寄存器 别名/特殊用途 典型作用 调用约定
X0–X7 函数参数寄存器 用于传递前 8 个函数参数;返回值也放在 X0(必要时 X1) caller-saved
X8 Indirect result location register 用于返回结构体地址(ABI 规定) caller-saved
X9–X15 临时寄存器(caller-saved) 调用者保存,函数内部可随意使用 caller-saved
X16–X17 IP0/IP1(内部用途寄存器) 链接器、PLT、跳转表等使用;也可作 scratch caller-saved
X18 平台寄存器(Platform register) 某些 OS 保留(如 Windows),Linux 通常可用 N/A
X19–X28 被调用者保存(callee-saved) 函数必须在使用前保存并在返回前恢复 callee-saved
X29 FP(Frame Pointer) 帧指针,指向当前栈帧 N/A
X30 LR(Link Register) 返回地址寄存器 N/A
X31 SP 或 XZR 编码上是同一个,但语义不同:作为 SP 时是栈指针;作为 XZR 时是零寄存器 N/A

X86架构下的通用寄存器

TODO

不同架构下的函数调用实现

AArch64架构下的实现

参数传递

函数调用传递参数时一般优先通过寄存器传递。
在AArch64架构下,X0~X7共计8个寄存器用于传递函数参数,如果函数参数超过8个,则需要调用者将后续参数按照16字节对齐放到栈上。

返回值传递

  • 整型、指针:使用X0寄存器
  • 较大返回值,如128位值:X0、X1
  • 大型结构体:调用者需要先分配一个内存空间,把地址放到X8,被调用者向该地址写入返回值。

函数调用现场

调用时
  1. 调用者:如果调用者要在函数调用后继续使用caller-saved寄存器(X0~X17)的值,则需要显式保存需要使用的寄存器。
  2. 被调函数:开辟一块栈空间
  3. 被调函数:保存FP和LR寄存器
  4. 被调函数:更新FP为当前SP
  5. 被调函数:保存需要使用到的callee-saved寄存器(X19~X28)
返回时
  1. 被调函数:返回值放到X0(超长返回值还需要X1),或者X8所指向的内存空间
  2. 从栈空间恢复调用开始时保存的callee-saved寄存器。
  3. 从栈空间恢复FP、LR寄存器
    注:
  • 如果函数是叶子函数,则不需要保存X30寄存器,因为叶子函数内不会存在BL/BLR指令,X30寄存器不会被修改。
  • 如果不使用FP指针,那么也不需要保存X29寄存器。(编译器参数-fomit-frame-pointer可以强制不使用FP指针)
典型栈帧
高地址
+---------------------+
|    FP和LR寄存器      |
+---------------------+
|  被调函数保存的寄存器  |
+---------------------+
|  局部变量 align16    |
+---------------------+
低地址(SP)

函数调用指令

AArch64架构下真正用于函数调用的指令有两条:BLBLR,另外,对于尾调用优化场景,还可以使用BBR指令。
BLBLR指令是带返回的,会自动将下一条指令地址保存到LR寄存器中;ret指令根据LR寄存器存放的地址决定返回到哪里继续执行程序。如果是B或者BL指令,则不会有存储下一条指令地址的行为。

X86架构下的实现

TODO

参考

https://zhuanlan.zhihu.com/p/394009663
https://zhuanlan.zhihu.com/p/394106095
https://my.oschina.net/emacs_8494641/blog/16516699
https://false-mask.github.io/计算机基础/assembly/arm-aapcs.html

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询