寄存器指南

RISC-V t0 / x5 寄存器:临时值、调用覆盖与备用链接寄存器

t0 是 psABI 的临时寄存器,调用后不保持;需要跨调用保留的值不能只放在 t0。RISC-V ISA 还说明,标准调用约定使用 x1 保存返回地址,同时 x5 可作为备用链接寄存器。

psABI:x5-x7 / t0-t2 是 temporary registers,调用后不保持。
ISA:x5 可作为 alternate link register。
新手规则:普通代码中把 t0 当短生命周期临时值,跨 call 前主动保存。
物理编号 x5ABI 名 t0保存责任 调用后不保持

t0 标记为 Caller-saved。把 x5 用作备用链接寄存器不会改变这个保存责任;需要跨调用保留时,caller 必须自己保存。

角色
临时变量/备用链接寄存器
调用约定
调用后不保持
先记一句
psABI 将 t0 标记为 temporary register,调用后不保持。
psABI 规范依据

临时寄存器

psABI 将 t0-t6 标记为临时寄存器。它们不是 callee-saved;调用者如果需要跨调用保留其中的值,必须自己保存。

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

t0 / x5 属于 t0-t6 临时寄存器组。psABI 规定它调用后不保持;调用者如果需要跨调用保留其中的值,必须自己保存。

t0-t6 是临时寄存器,调用后不保持。
ISA 说明 x5 可作为备用链接寄存器,但 psABI 仍把 t0 归为临时寄存器。

适合什么时候用

  • - 按标准 psABI 将 x5/t0 识别为调用后不保持的临时寄存器。
  • - 理解标准软件调用约定使用 x1 作为返回地址,而 x5 可作为备用链接寄存器。
  • - 理解 ISA 中的备用链接寄存器说明:x5 可作为 alternate link register。

什么时候不要这样用

  • - 不要假定 t0 的调用前值在调用后仍可用。
  • - 不要把 x5 是备用链接寄存器的 ISA 说明误读成 psABI 保存规则。

调用前后会发生什么

1

psABI 将 t0 标记为 temporary register,调用后不保持。

2

标准调用约定中,未作为返回值或调用后保持寄存器指定的内容在过程退出时未指定。

3

ISA 指出 x5 可用作备用链接寄存器,但这不改变 t0 的 ABI 保存责任。

t0 的规范边界

示例用于理解规则,不替代完整程序
# x5/t0:调用后不保持的临时寄存器
# x5:标准软件调用约定中的备用链接寄存器

与其他寄存器的关系

t0 vs ra (备用链接寄存器 vs 主链接寄存器)

RISC-V ISA 说明,标准调用约定使用 x1 作为返回地址寄存器,x5 可作为 alternate link register。psABI 同时把 x1/ra 标记为返回地址寄存器,把 x5/t0 标记为 temporary register;两者都不是调用后保持寄存器。实际写汇编时,后续返回序列会读取哪个寄存器,必须由调用序列明确决定。

跨调用保存责任

虽然 ISA 说明 x5 可作为备用链接寄存器,但 psABI 仍把 t0 归为调用后不保持的临时寄存器。只要后续代码还需要 t0 中的值,caller 就必须在调用前保存;如果把它用于返回地址,更要确认返回序列读取的是 t0 还是 ra。

常见问题

t0 / x5 调用后会保持吗?

不会。t0-t6 是临时寄存器,调用后不保持。