AAPCS的核心是对ARM处理器中16个通用寄存器(R0-R15)的用途进行了严格定义。
| 寄存器 | 别名 | 角色与用途 | 谁负责保存? |
|---|---|---|---|
| R0 - R3 | A1 - A4 | 参数与结果寄存器 :用于传递函数的前4个参数。R0和R1也用于返回结果。 | 调用者 (Caller) |
| R4 - R11 | V1 - V8 | 变量寄存器 :用于存放函数的局部变量。 | 被调用者 (Callee) |
| R12 | IP | 内部过程调用暂存寄存器:用作函数内部的临时存储。 | 调用者 (Caller) |
| R13 | SP | 栈指针 (Stack Pointer):指向当前栈顶。 | - |
| R14 | LR | 链接寄存器 (Link Register) :保存函数的返回地址。 | - |
| R15 | PC | 程序计数器 (Program Counter):指向当前执行的指令。 |
关键机制:参数如何传递?
这是你之前最关心的一点,AAPCS的规则非常明确:
-
参数 ≤ 4个 :直接通过 R0, R1, R2, R3 这四个寄存器传递,效率最高。
-
参数 > 4个 :前4个参数 仍通过 R0-R3 传递,第5个及之后的参数 会被压入堆栈(Stack) 中传递。
此外,AAPCS还规定了:
-
返回值 :通常放在 R0 寄存器中返回。
-
64位参数/返回值 :可能会使用 R0和R1 组合来传递。
-
堆栈使用:规定了栈的增长方向(通常是向低地址增长)以及如何在函数调用期间保存和恢复寄存器状态。