t0 / x5 调用后会保持吗?
不会。t0-t6 是临时寄存器,调用后不保持。
t0 是 psABI 的临时寄存器,调用后不保持;需要跨调用保留的值不能只放在 t0。RISC-V ISA 还说明,标准调用约定使用 x1 保存返回地址,同时 x5 可作为备用链接寄存器。
t0 标记为 Caller-saved。把 x5 用作备用链接寄存器不会改变这个保存责任;需要跨调用保留时,caller 必须自己保存。
psABI 将 t0-t6 标记为临时寄存器。它们不是 callee-saved;调用者如果需要跨调用保留其中的值,必须自己保存。
t0 / x5 属于 t0-t6 临时寄存器组。psABI 规定它调用后不保持;调用者如果需要跨调用保留其中的值,必须自己保存。
psABI 将 t0 标记为 temporary register,调用后不保持。
标准调用约定中,未作为返回值或调用后保持寄存器指定的内容在过程退出时未指定。
ISA 指出 x5 可用作备用链接寄存器,但这不改变 t0 的 ABI 保存责任。
# x5/t0:调用后不保持的临时寄存器
# x5:标准软件调用约定中的备用链接寄存器RISC-V ISA 说明,标准调用约定使用 x1 作为返回地址寄存器,x5 可作为 alternate link register。psABI 同时把 x1/ra 标记为返回地址寄存器,把 x5/t0 标记为 temporary register;两者都不是调用后保持寄存器。实际写汇编时,后续返回序列会读取哪个寄存器,必须由调用序列明确决定。
虽然 ISA 说明 x5 可作为备用链接寄存器,但 psABI 仍把 t0 归为调用后不保持的临时寄存器。只要后续代码还需要 t0 中的值,caller 就必须在调用前保存;如果把它用于返回地址,更要确认返回序列读取的是 t0 还是 ra。
不会。t0-t6 是临时寄存器,调用后不保持。