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

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

相关推荐
学逆向的4 小时前
C 堆区内存管理
c语言·开发语言·网络安全
阿尼卡~7 小时前
VS Code 配置 C 语言开发环境(Windows 10/11):从 GCC 安装到运行、断点调试,一篇搞定
c语言·开发语言·windows
从小白到软工15 小时前
5-2 从查表到控件:造按钮
c语言·开发语言·数据结构·经验分享·ai编程
水饺编程15 小时前
第2章:Linux 基础,解压缩【.tar.gz】压缩包
linux·c语言·汇编
cu14316 小时前
细谈IT6653的具体功能与其应用
c语言·c++·单片机·嵌入式硬件
夏虫不可与之言冰16 小时前
RMT 与 WS2812 灯带:可寻址 RGB 全彩控制
c语言·c++·单片机·物联网·visual studio
羊锦磊16 小时前
嵌入式基础1
c语言·c++·gnu
唐青枫17 小时前
C 语言 calloc() 详解:零初始化、动态数组与内存管理实战
c语言
David猪大卫17 小时前
【C++修炼】STL容器—stack与queue
c语言·开发语言·数据结构·c++·经验分享·笔记·学习
瑶池酒剑仙17 小时前
C++变量初始化五法完全指南:默认/拷贝/直接/列表/值初始化与窄化转换陷阱(青云之志)
c语言·开发语言·数据结构·c++·算法·visual studio