目錄
- AAPCS64調用約定
- 參數傳遞規則
- 返回值規則
- 棧幀管理
- SP寄存器
- FP寄存器 (X29)
- 棧幀布局示例
AAPCS64調用約定
ARM Architecture Procedure Call Standard for 64-bit (AAPCS64)
參數傳遞規則
參數位置 | 寄存器分配 | 特殊規則 |
---|---|---|
參數1-8 | X0-X7 (64-bit) / W0-W7 (32-bit) | 浮點數使用 V0-V7 |
參數>8 | 棧傳遞(按順序右→左壓棧) | 要求8字節對齊 |
可變參數 | 所有浮點參數必須通過寄存器傳遞 | 需預留相應寄存器空間 |
示例代碼:
// 函數調用示例
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
棧幀布局示例
my_function:// 序言stp x29, x30, [sp, #-32]! // 保存FP/LR并分配棧空間mov x29, sp // 建立新棧幀// 函數體str x0, [x29, #16] // 保存參數到棧// 尾聲ldp x29, x30, [sp], #32 // 恢復FP/LR并釋放棧空間ret