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

使用arm-none-eabi-gcc编译裸机ARM时,aapcs与aapcs-linux ABI差异

ARM AAPCS与AAPCS-Linux的完整差异列表
  • 枚举类型大小

    • aapcs:枚举类型大小可变,由枚举中最大值的类型决定(如最大值在char范围内则为1字节,short范围内则为2字节,否则为4字节)。
    • aapcs-linux:强制所有枚举类型固定为4字节大小。
  • 函数调用栈对齐

    • aapcs:要求函数调用前栈必须对齐到8字节边界。
    • aapcs-linux:在8字节对齐基础上,额外要求调用可变参数函数(如printf)前,栈需对齐到16字节边界,以兼容部分SIMD指令对齐需求及x86-64 ABI习惯。
  • 浮点参数传递

    • aapcs:浮点参数优先用FPU寄存器传递,寄存器不足时,栈上的浮点参数以单/双精度自然大小存储。
    • aapcs-linux:栈上传递的浮点参数,无论实际精度,都会被扩展为双精度(8字节)存储,即使原参数是单精度float类型。
  • 结构体/联合体返回处理

    • aapcs:当结构体/联合体大小超过4字节且无法放入寄存器时,通过调用者提供的内存地址(存于r0寄存器)返回数据。
    • aapcs-linux:大小为8字节的结构体/联合体,会使用r0和r1两个寄存器直接返回,而非强制使用内存地址传递,属于对AAPCS的优化。
  • 线程局部存储(TLS)支持

    • aapcs:原生不支持线程局部存储相关调用约定,适配裸机等无操作系统环境。
    • aapcs-linux:包含完整TLS访问约定,支持__thread关键字修饰的变量,定义了tp寄存器访问TLS数据的规则,适配Linux多线程环境。
  • 系统调用接口

    • aapcs:无特定系统调用参数传递约定,面向裸机场景,无需与操作系统交互。
    • aapcs-linux:定义了Linux系统调用参数传递规则,如用r0-r6传递参数、r7存储系统调用号、返回值存于r0中。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 11:27:15