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

RISC-V 32平台下64位函数参数的寄存器分配规则是什么?

RISC-V RV32 64位参数传递的矛盾点解答

核心规则回顾

RV32(32位RISC-V)平台的ILP32 ABI中,整数参数传递的核心规则:

  • 32位标量(如int32_t)按顺序占用单个参数寄存器(a0-a7)。
  • 64位标量(如int64_t)占用连续的一对参数寄存器,且必须从偶数编号的寄存器(a0/a2/a4/a6)开始:低32位存入偶数寄存器,高32位存入紧随其后的奇数寄存器。如果前一个参数结束在奇数寄存器,下一个64位参数会跳过该奇数寄存器,从下一个偶数寄存器开始分配。

比如你提到的例子:先传int32_t再传int64_t,int32_t存入a0,int64_t的低32位存入a2、高32位存入a3(跳过a1以满足偶数对齐要求),这是完全符合ABI规则的。

矛盾点分析

你遇到的书中汇编示例与规则矛盾,可能的原因有三种:

  1. 参数列表描述错误:实际参数列表可能并非交替int32_t和int64_t,比如参数顺序或类型定义有误,导致寄存器分配逻辑和你理解的不一致。
  2. 汇编注释错误:比如代码中的注释Add low order arg2 (int64) to arg1可能写错了,实际a1对应的是一个int32_t参数(而非int64_t的低32位),修正后代码逻辑就符合规则了。
  3. 示例未遵循标准ABI:部分教学示例为了简化演示,刻意忽略了ABI的对齐要求,但这是不规范的——实际编译器生成的代码会严格遵循ABI规则,否则会出现函数调用错误。

规则验证依据

你在RISC-V非ISA规范页面看到的描述是准确的:64位标量参数占用一对连续寄存器,低XLEN位存入编号较小的寄存器,高XLEN位存入编号较大的寄存器。同时RV32 ILP32 ABI强制要求64位参数对齐到偶数寄存器对,这是为了保证寄存器参数和栈上参数的对齐一致性,避免内存访问错误。

内容的提问来源于stack exchange,提问作者ass-embler

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 06:53:29