s8 / x24 为什么适合保存跨调用值?
s0-s11 调用后保持;callee 修改它们时必须恢复,所以 caller 可以依赖其返回后不变。
psABI 将 s0-s11 标记为调用后保持。被调用函数如果修改这些寄存器,必须在返回前恢复原值;s0 也可作为 frame pointer。
s8 / x24 属于 s0-s11 保存寄存器组。psABI 规定它调用后保持;被调用函数如果修改它,返回前必须恢复。
s* 属于 callee-saved:函数借用了就必须在返回前恢复。
caller 可以假设调用返回后 s* 保持原值。
修改 s* 通常意味着函数入口保存、出口恢复。
addi sp, sp, -16
sd s8, 0(sp)
addi s8, a0, 0
call foo
# s8 仍保存调用前需要的值
ld s8, 0(sp)
addi sp, sp, 16
rets0-s11 调用后保持;callee 修改它们时必须恢复,所以 caller 可以依赖其返回后不变。
被调用函数负责恢复。