ARM Architecture Procedure Call Standard(ARM架构过程调用标准)

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 组合来传递。

  • 堆栈使用:规定了栈的增长方向(通常是向低地址增长)以及如何在函数调用期间保存和恢复寄存器状态。

相关推荐
神仙别闹5 小时前
基于C语言+SQLite 实现(控制台+图形界面)图书管理系统
c语言·开发语言·sqlite
水饺编程5 小时前
第5章,[Win32 章节] :绘制填充区域
c语言·c++·windows·visual studio
从零开始的嵌入式之旅6 小时前
day31
linux·c语言·经验分享·笔记·嵌入式硬件
Horn Still Sounds6 小时前
Linux系统编程进阶:进程回收、程序替换与多线程并发模型
linux·运维·服务器·c语言
xu_wenming14 小时前
嵌入式软件架构中的6种解耦艺术
c语言·驱动开发·嵌入式硬件·架构
DevHub18 小时前
CANopen 教程:STM32 实现 CANopen 从站,3 个回调替代手写对象字典
c语言·驱动开发·stm32·单片机·嵌入式硬件·mcu
不灭的黄金瞳12320 小时前
C语言手写顺序表
c语言·开发语言·数据结构
老当益壮梁奶奶1 天前
Linux 软件编程学习笔记(六):线程编程入门与实践
linux·c语言·c++·笔记·学习
水饺编程1 天前
第5章,[Win32 章节] :创建、选择和删除画笔
c语言·c++·windows·visual studio