寄存器指南

RISC-V a5 / x15 参数寄存器

函数参数寄存器5。传递第六个参数。

ABI 名称:a5;物理寄存器:x15。
保存责任:调用者。
先按 psABI 角色理解它,再看具体指令如何读写。
物理编号 x15ABI 名 a5保存责任 调用者
角色
参数
调用约定
调用者保存
先记一句
a* 属于 caller-saved,callee 可以覆盖它们。
psABI 规范依据

参数/返回值寄存器

psABI 将 a0-a7 用作参数寄存器,其中 a0-a1 也用于返回值。它们不是 callee-saved,调用后可被覆盖。

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

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

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

适合什么时候用

  • - 函数调用前放置参数,a5 是 第六个 参数寄存器。
  • - a5 不是 psABI 表中的返回值寄存器;返回值应优先看 a0/a1。
  • - 按 psABI 把 a0-a7 先理解为函数参数寄存器。

什么时候不要这样用

  • - 不要默认 a* 在函数调用后仍保持原值。
  • - 跨 call 还要使用的 a* 值,应在调用前保存到 s* 或栈上。

调用前后会发生什么

1

a* 属于 caller-saved,callee 可以覆盖它们。

2

调用返回后,不能假设旧 a5 参数值仍然存在;callee 可以覆盖它。

3

如果参数超过 a0-a7,额外参数会通过栈传递。

参数传递与返回值

示例用于理解规则,不替代完整程序
addi a0, zero, 3  # 第一个参数
addi a1, zero, 4  # 第二个参数
call add2
# 返回后 a0 保存返回值

常见问题

a5 / x15 调用后还能保持原参数吗?

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

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

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