寄存器指南

RISC-V t4 / x29 临时变量寄存器

临时寄存器4(x29)。psABI 将 t4 归为 temporary register,适合调用者自行管理的短生命周期临时值;函数调用后不保证保留其值。

ABI 名称:t4;物理寄存器:x29。
保存责任:调用者。
先按 psABI 角色理解它,再看具体指令如何读写。
物理编号 x29ABI 名 t4保存责任 调用者
角色
临时变量
调用约定
调用者保存
先记一句
t4 属于 caller-saved temporary register,callee 可以覆盖。
psABI 规范依据

临时寄存器

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

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

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

t0-t6 是临时寄存器,调用后不保持。
跨调用仍需使用 t4 的值时,caller 必须自行保存。

适合什么时候用

  • - 保存短生命周期临时计算结果。
  • - 在不会跨函数调用存活的局部计算里使用。
  • - 作为 caller 明确管理的 scratch register。

什么时候不要这样用

  • - 不要把它用来保存 call 之后还要用的值,除非调用前自己保存。
  • - 不要把它当成 callee 会帮你恢复的寄存器。

调用前后会发生什么

1

t4 属于 caller-saved temporary register,callee 可以覆盖。

2

如果 caller 在 call 后还需要 t4 的值,caller 必须提前保存。

3

跨调用存活的值优先放入 s* 或栈上。

t4 临时值跨 call 前先保存

示例用于理解规则,不替代完整程序
addi t4, a0, 1
# 如果 call 后还要用 t4,caller 必须先保存到 ABI 合法的位置
call foo
# call 返回后再从该保存位置恢复 t4

常见问题

t4 / x29 调用后会保持吗?

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

跨 call 还需要 t4 的值怎么办?

caller 必须在调用前把它保存到栈或其他合适位置,并在调用后恢复。