目录

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