ARM汇编编程(AArch64架构)课程 - 第5章函数调用规范

目录

AAPCS64调用约定

ARM Architecture Procedure Call Standard for 64-bit (AAPCS64)

参数传递规则

参数位置 寄存器分配 特殊规则
参数1-8 X0-X7 (64-bit) / W0-W7 (32-bit) 浮点数使用 V0-V7
参数>8 栈传递(按顺序右→左压栈) 要求8字节对齐
可变参数 所有浮点参数必须通过寄存器传递 需预留相应寄存器空间

示例代码:

assembly 复制代码
// 函数调用示例
mov x0, #1       // 第一个整型参数
mov x1, #2       // 第二个整型参数
fmov d0, 3.14    // 第一个浮点参数
bl my_function

返回值规则

  • 整型返回值:X0(64-bit)/W0(32-bit)
  • 浮点返回值:V0(128-bit)/D0(64-bit)/S0(32-bit)
  • 大结构体:通过X8间接返回(调用者分配内存)

栈帧管理

SP寄存器

  • Stack Pointer:始终指向栈顶
  • 操作要求
    • 必须保持16字节对齐
    • 函数退出时必须恢复原始值

FP寄存器 (X29)

  • Frame Pointer:指向当前栈帧基址

  • 典型布局

    复制代码
    High Address
    +---------------+
    |  Caller's FP  | ← FP
    +---------------+
    |   LR (X30)    |
    +---------------+
    |  Local Vars   |
    +---------------+
    |  Callee-save  |
    +---------------+
    | 参数区域(>8)   | ← SP
    Low Address

栈帧布局示例

assembly 复制代码
my_function:
    // 序言
    stp x29, x30, [sp, #-32]!  // 保存FP/LR并分配栈空间
    mov x29, sp                 // 建立新栈帧

    // 函数体
    str x0, [x29, #16]          // 保存参数到栈

    // 尾声
    ldp x29, x30, [sp], #32     // 恢复FP/LR并释放栈空间
    ret
相关推荐
herosunly7 小时前
60ms 不是启动快,而是不用重新启动:CubeSandbox 极速冷启动架构拆解
架构·cube sandbox
zlinear数据采集卡8 小时前
从气动比例阀到任意波形:硬核拆解ZLinear采集卡的DAC输出架构与工业闭环控制实战
arm开发·架构
2601_9619460810 小时前
AI API 网关实战:从单 Key 管理到企业级多租户架构
大数据·人工智能·金融·架构·api·个人开发
XUHUOJUN12 小时前
Windows 2025架构深度分析之Stretch Cluster 延迟工程现实
windows·microsoft·架构·azure local
Web极客码12 小时前
突破并发瓶颈:云端高性能架构如何赋能海外 AI Agent 矩阵的高效产出
服务器·人工智能·架构
laoli_coding14 小时前
系统部署之框架选型方案
微服务·云原生·架构
掘金_答案14 小时前
上线那天,一个 ConcurrentHashMap 差点送走我的 AI 客服——3 天排查 JVM 血泪史
java·后端·架构
秦任之14 小时前
Gliding Horse 整体架构拼图:当 AI Agent 有了自己的操作系统
人工智能·架构
微三云 - 廖会灵 (私域系统开发)15 小时前
电商推荐系统从0到1:协同过滤+深度学习双塔模型的架构演进与实时排序实践
人工智能·深度学习·架构
CaffeinePro16 小时前
SOLID五大设计原则:重构优雅代码与架构的底层规范
设计模式·架构