如何了解arm-linux-gnueabihf-gcc的AAPCS参数传递实现细节?
了解arm-linux-gnueabihf-gcc的参数传递实现
要明确arm-linux-gnueabihf-gcc遵循的C参数与寄存器映射、栈参数入栈顺序,有以下几种直接方法:
1. 查阅GCC ARM后端的调用约定文档
GCC对ARM架构的ABI实现细节,在其官方的ARM-specific文档中有明确说明,核心规则包括:
- 整数/指针参数:优先按顺序分配到
r0-r3,64位整数(如long long)会占用连续两个寄存器(比如r0-r1);当参数数量超过寄存器容量时,剩余参数按从右到左的顺序压入满递减栈(即最右侧的参数先入栈)。 - 浮点参数:因为
gnueabihf是硬浮点ABI,float类型优先分配到s0-s15,double类型占用连续两个VFP寄存器(如s0-s1);混合类型参数会按照参数列表的顺序,依次为每个参数分配对应类型的可用寄存器,寄存器耗尽后剩余参数入栈。
2. 编译生成汇编代码直接观察
写包含不同参数类型、数量的测试代码,通过编译生成汇编来直观查看参数分配逻辑:
比如创建test.c:
#include <stdio.h> void func(int a, float b, double c, long long d, int e) { printf("%d %f %lf %lld %d\n", a, b, c, d, e); } int main() { func(1, 2.0f, 3.0, 4LL, 5); return 0; }
用以下命令生成汇编:
arm-linux-gnueabihf-gcc -S -O0 test.c -o test.s
查看生成的test.s,能清晰看到:
a=1存入r0,b=2.0f存入s0,c=3.0存入s1-s2,d=4LL存入r1-r2e=5会被调用者先压入栈,再执行函数调用
3. 查看GCC内置帮助信息
执行以下命令,能直接获取arm-linux-gnueabihf-gcc针对目标架构的调用约定相关说明:
arm-linux-gnueabihf-gcc --target-help
或者通过info gcc进入GCC的文档系统,定位到「ARM Options」下的「Calling Conventions」章节,获取更详细的实现细节。
内容的提问来源于stack exchange,提问作者Xshell
相关产品推荐
相关产品推荐

