寄存器指南

RISC-V a0 / x10 寄存器:参数、返回值与调用约定

a0 是 RISC-V psABI 的参数寄存器之一;psABI 也将 a0 用于返回值。它调用后不保持,因此不能假定调用后的值仍是调用前的参数。

psABI:a0-a7 是参数寄存器,a0-a1 也用于返回值。
psABI:a0 调用后不保持。
新手规则:如果旧 a0 的值调用后还要用,调用前先保存。
物理编号 x10ABI 名 a0保存责任 调用后不保持
角色
参数/返回值
调用约定
调用后不保持
先记一句
a0-a7 在 psABI 中标记为调用后不保持。
psABI 规范依据

参数/返回值寄存器

标准 psABI 将 a0-a7 用作参数寄存器,其中仅 a0-a1 也用于返回值;它们调用后不保持。

调用后保持:否
RISC-V psABI integer register convention
快速理解与检索要点

a0 / x10 属于 a0-a7 参数寄存器组。psABI 规定 a0-a7 用于传参,a0-a1 也用于返回值;这些寄存器调用后不保持。

a0-a7 是参数寄存器,a0-a1 也用于返回值。
a0 调用后不保持,callee 可以覆盖。

适合什么时候用

  • - a0 属于 psABI 的 a0-a7 整数参数寄存器组。
  • - a0 是 psABI 也用于返回值的前两个参数寄存器之一。
  • - 按 psABI 把 a0-a7 先理解为函数参数寄存器。

什么时候不要这样用

  • - 不要默认 a* 在函数调用后仍保持原值。
  • - 若调用后仍需原 a* 值,不能把它留在 a* 中等待调用返回。

调用前后会发生什么

1

a0-a7 在 psABI 中标记为调用后不保持。

2

a0 / a1 是 psABI 也用于返回值的前两个参数寄存器;调用后不能假定它们仍保留原参数。

3

对于不超过 XLEN 位的标量,若没有可用参数寄存器,psABI 按值通过栈传递。

参数传递与返回值

示例用于理解规则,不替代完整程序
addi a0, zero, 3  # 写入 a0
# psABI 也将 a0 用于返回值

常见问题

a0 / x10 调用后还能保持原参数吗?

不能假设。a0-a7 调用后不保持,callee 可以覆盖。

哪些 a 寄存器用于返回值?

psABI 规定 a0-a1 也用于返回值。