You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何了解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-r2
  • e=5会被调用者先压入栈,再执行函数调用

3. 查看GCC内置帮助信息

执行以下命令,能直接获取arm-linux-gnueabihf-gcc针对目标架构的调用约定相关说明:

arm-linux-gnueabihf-gcc --target-help

或者通过info gcc进入GCC的文档系统,定位到「ARM Options」下的「Calling Conventions」章节,获取更详细的实现细节。

内容的提问来源于stack exchange,提问作者Xshell

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 02:32:21