t5 / x30 调用后会保持吗?
不会。t0-t6 是临时寄存器,调用后不保持。
psABI 将 t0-t6 标记为临时寄存器。它们不是 callee-saved;调用者如果需要跨调用保留其中的值,必须自己保存。
t5 / x30 属于 t0-t6 临时寄存器组。psABI 规定它调用后不保持;调用者如果需要跨调用保留其中的值,必须自己保存。
t5 属于 caller-saved temporary register,callee 可以覆盖。
如果 caller 在 call 后还需要 t5 的值,caller 必须提前保存。
跨调用存活的值优先放入 s* 或栈上。
addi t5, a0, 1
# 如果 call 后还要用 t5,caller 必须先保存到 ABI 合法的位置
call foo
# call 返回后再从该保存位置恢复 t5不会。t0-t6 是临时寄存器,调用后不保持。
caller 必须在调用前把它保存到栈或其他合适位置,并在调用后恢复。