AArch64和X86下的函数调用 - Polaris

news/2026/1/18 21:08:38/文章来源:https://www.cnblogs.com/polaris-J/p/19499129

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/1179405.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MCU单总线通信

文章目录 一、核心原理详解 1. 整体硬件原理 (1)硬件架构核心 (2)STM32 GPIO 配置核心(开漏输出) 2. 忙状态判定原理 (1)核心定义 (2)空闲状态双重侦听规则 (3)STM32 忙状态实现细节 3. 发送实现原理 (1)发送前准备 (2)逐位发送核心逻辑 (3)发送关键注意事项…

三维动态避障路径规划:基于部落竞争与成员合作算法(CTCM)融合动态窗口法DWA的无人机三维动态避障方法研究附MATLAB代码

✅作者简介:热爱科研的Matlab仿真开发者,擅长数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。🍎 往期回顾关注个人主页:Matlab科研工作室👇 关注我领取海量matlab电子书和数学建模资料 &#x1f34…

诺特定理:世界是二阶导的吗?

让我们回到诺特定理,真正的奥妙就在于此。我们现在有了工具:拉格朗日函数、欧拉-拉格朗日定理,让我们看看它们能构建出什么。 假设你的拉格朗日函数 \(L(q, \dot{q}, t)\) 具有连续对称性。这意味着存在某种变换 \(…

GESP认证C++编程真题解析 | 202306 四级

​欢迎大家订阅我的专栏:算法题解:C++与Python实现! 本专栏旨在帮助大家从基础到进阶 ,逐步提升编程能力,助力信息学竞赛备战! 专栏特色 1.经典算法练习:根据信息学竞赛大纲,精心挑选经典算法题目,提供清晰的…

洛谷 P11606 [PA 2016] 构树 / Reorganizacja - Rye

洛谷 P11606 [PA 2016] 构树 / Reorganizacja构造好题题目传送门 题目大意 有 \(n\) 个节点和 \(m\) 条限制,每条限制形如 \(x,y,T\) 或 \(x,y,N\) 分别表示 \(y\) 一定是 \(x\) 的祖先和 \(y\) 一定不是 \(x\) 的祖先…

CPU占用高排查

top命令,查看占用高的进程id top -p <进程id> -H -H参数显示进程内的线程列表,查看是哪个线程id jstack -p <进程id> | grep <线程id> -C 30 线程id在jdk8可能是16进制需要改下 查看对应线程的堆栈…

GESP认证C++编程真题解析 | 202303 二级

​欢迎大家订阅我的专栏:算法题解:C++与Python实现! 本专栏旨在帮助大家从基础到进阶 ,逐步提升编程能力,助力信息学竞赛备战! 专栏特色 1.经典算法练习:根据信息学竞赛大纲,精心挑选经典算法题目,提供清晰的…

智能风控平台 scalability 设计:AI应用架构师的经验分享

智能风控平台Scalability设计实战&#xff1a;AI应用架构师的5个核心策略 一、引言&#xff1a;为什么智能风控平台必须重视Scalability&#xff1f; 1. 痛点引入&#xff1a;你是否遇到过这些“崩溃瞬间”&#xff1f; 作为AI应用架构师&#xff0c;我曾亲历某电商平台大促期间…

[豪の算法奇妙冒险] 代码随想录算法训练营第三十一天 | 56-合并区间、738-单调递增的数字

LeetCode56 合并区间、LeetCode738 单调递增的数字代码随想录算法训练营第三十一天 | 56-合并区间、738-单调递增的数字LeetCode56 合并区间题目链接:https://leetcode.cn/problems/merge-intervals/description/ 文章…

MATLAB表格数据处理的项目落地经验(避坑+效率提升)

在科研数据分析、工程测试数据处理、工业报表生成等实际项目中,MATLAB的`readtable()`/`writetable()`及`table`对象操作是高频核心技能。我结合近5年的项目经验(如车载传感器数据解析、光伏实验数据处理、工业Excel…

最新论文 | EarthVL: 武大钟燕飞团队提出渐进式理解/生成框架, 从识别到深度理解遥感地物, 提供专业决策建议 - MKT

最新论文 | EarthVL: 武大钟燕飞团队提出渐进式理解/生成框架, 从识别到深度理解遥感地物, 提供专业决策建议https://mp.weixin.qq.com/s/6gVsTTZ7OT_VT5VcGsiDLA

《卷一》人形机器人导论:从机械设计到系统集成

第1篇 人形机器人的发展与基础认知第1章 人形机器人的发展历史、趋势与应用场景1.1 人形机器人的发展历程1.1.1 早期仿人研究到现代机器人1.1.2 ASIMO等标志性里程碑1.1.3 特斯拉、Figure、Unitree的商业化推动1.2 未来趋势与行业需求1.2.1 具身智能推动的产业变革1.2.2…

Flutter × OpenHarmony 跨端开发之汇率转换与汇率卡片展示

文章目录Flutter OpenHarmony 跨端开发之汇率转换与汇率卡片展示前言背景Flutter Harmony OpenHarmony 跨端开发介绍开发核心代码代码解析&#xff1a;心得总结Flutter OpenHarmony 跨端开发之汇率转换与汇率卡片展示 前言 随着全球化经济的发展&#xff0c;汇率的实时查询…

(1-1)人形机器人的发展历史、趋势与应用场景:人形机器人的发展历程

本章首先系统介绍了人形机器人的发展脉络&#xff0c;从早期仿人研究到ASIMO等里程碑事件&#xff0c;再到特斯拉、Figure、宇树等企业推动的商业化进程&#xff0c;勾勒出人形机器人产业的演进全景。然后进一步分析了具身智能、大模型融合背景下的人形机器人发展趋势及其在劳动…

优雅汇率:Flutter × OpenHarmony 跨端汇率转换计算器实现

文章目录优雅汇率&#xff1a;Flutter OpenHarmony 跨端汇率转换计算器实现前言背景Flutter Harmony OpenHarmony 跨端开发介绍开发核心代码构建转换计算器 Widget核心逻辑解析心得总结优雅汇率&#xff1a;Flutter OpenHarmony 跨端汇率转换计算器实现 前言 随着全球经济…

(1-2)人形机器人的发展历史、趋势与应用场景:未来趋势与行业需求

1.2 未来趋势与行业需求随着具身智能、大模型与机器人核心硬件的快速发展&#xff0c;人形机器人正从技术验证阶段迈向面向真实场景的规模化应用阶段。未来的发展趋势不仅体现在智能水平的持续提升&#xff0c;更体现在对劳动力结构、生产方式与服务形态的深刻重塑。在制造业、…

Flutter × OpenHarmony 汇率转换应用中的智能货币选择器实现

文章目录Flutter OpenHarmony 汇率转换应用中的智能货币选择器实现前言背景Flutter OpenHarmony 跨端开发介绍开发核心代码代码解析心得总结Flutter OpenHarmony 汇率转换应用中的智能货币选择器实现 前言 在现代移动应用中&#xff0c;货币转换功能是出境旅游、跨境电商及…

提示工程质量保证体系:如何保证Prompt的一致性?

提示工程质量保证&#xff1a;构建Prompt一致性的系统方法论 元数据框架 标题&#xff1a;提示工程质量保证&#xff1a;构建Prompt一致性的系统方法论 关键词&#xff1a;提示工程, Prompt一致性, 质量保证体系, 语义对齐, 模型输出稳定性, 反馈迭代, 大模型应用 摘要&#xf…

综述北航基于视觉的无人机定位与导航方法研究 - MKT

综述北航基于视觉的无人机定位与导航方法研究主要贡献全面总结了基于视觉的无人机定位与导航技术,包括图像检索和图像匹配两大类定位方法,以及障碍物检测与规避、路径规划两类导航方法,揭示了现有技术的优势和局限。…

AI原生应用持续学习框架对比:TensorFlow vs PyTorch

AI原生应用持续学习框架对比:TensorFlow vs PyTorch 一、引言 (Introduction) 钩子 (The Hook) 你是否遇到过这样的困境? 花费数周训练的图像分类模型,上线3个月后准确率从92%暴跌至75%——原因是用户上传的图片中出现了新的类别(比如原本识别“猫/狗”,现在多了“仓鼠…