本文探讨了在ARM架构下遵循AAPCS(Advanced Arm Architecture Procedure Call Standard)的函数调用规则,深入解析其参数传递、堆栈使用及返回值处理机制。
# ARM架构程序调用规则(AAPCS)解析
## 概述
《ARM架构程序调用标准》(Procedure Call Standard for the Arm Architecture, 简称AAPCS)是一份重要的技术文档,它定义了在ARM架构上应用程序二进制接口(Application Binary Interface, ABI)中的过程调用标准。这份文档对于确保不同编译器、链接器和工具链之间的一致性和兼容性至关重要。
## 核心内容概览
### 1. 引言与背景
#### 1.1 摘要
AAPCS为ARM架构提供了一个统一的过程调用标准,该标准被广泛应用于ARM处理器的应用二进制接口(ABI)中。它规定了函数调用过程中参数传递、返回值处理、寄存器分配等方面的标准行为,从而确保跨平台、跨编译器的代码兼容性。
#### 1.2 关键词
- **过程调用**(Procedure Call):指函数或子程序的调用。
- **函数调用**(Function Call):在程序中调用一个函数的行为。
- **调用约定**(Calling Conventions):指函数调用时如何传递参数、保存寄存器状态等规范。
- **数据布局**(Data Layout):指在内存中如何存储变量和数据结构。
### 2. 最新版本与缺陷报告
AAPCS的最新版本可以在ARM架构的应用程序二进制接口文档中找到。如发现文档中的错误或不一致之处,请通过GitHub上的问题跟踪页面进行报告。
### 3. 版权声明
- **版权信息**:文档由ARM Limited及其关联公司版权所有,并保留所有权利。
- **许可协议**:本作品采用Creative Commons Attribution-ShareAlike 4.0 International License发布。这意味着您可以自由地复制、传播、修改及分发文档内容,但需遵守以下条件:
- 必须给出适当署名;
- 需要提供许可协议的链接;
- 不得添加任何额外限制。
### 4. 专利授权
AAPCS文档还包含一项专利授权条款,其中规定了在遵守文档许可协议的前提下,各贡献者授予您制造、使用、销售等权利,只要这些权利仅限于因贡献者提交的内容而必须侵犯的专利权。如果发起针对任何实体的专利侵权诉讼,则授予您的许可证将立即终止。
## 详细解析
### 4.1 参数传递规则
AAPCS定义了一套标准的参数传递机制,用于指导函数调用过程中参数的传递方式。通常情况下,前四个整型或指针类型的参数会通过寄存器r0-r3传递,更多的参数则通过堆栈传递。
### 4.2 返回值处理
AAPCS同样规定了函数返回值的处理方式。简单类型(如int、float等)的返回值通常通过寄存器r0或f0传递;复杂类型(如结构体、数组等)则可能需要通过返回地址附近的内存区域来传递。
### 4.3 寄存器分配
AAPCS还详细描述了函数调用过程中各个寄存器的作用和使用规则,例如:
- **r0-r3**:用于传递参数。
- **r4-r11**:用于保存局部变量或其他临时数据。
- **lr**(r14):用于保存返回地址。
- **sp**(r13):用于指向当前栈顶。
### 4.4 其他关键概念
- **调用者清理**(Caller Cleans Up):指调用者负责清理函数调用过程中产生的栈帧。
- **被调用者清理**(Callee Cleans Up):指被调用的函数负责清理栈帧。
- **保存寄存器**(Saved Registers):指在函数调用过程中需要保存的寄存器,以防止其被覆盖。
## 结论
AAPCS作为ARM架构下的过程调用标准,对于实现跨平台、跨编译器的代码兼容性具有重要意义。通过遵循这套标准,开发者可以编写出更加高效、可靠且易于维护的代码。同时,AAPCS也为ARM架构下的软件开发提供了一套统一的框架,有助于提升软件的质量和性能。