我知道一旦函数结束,保留的调用寄存器会自动恢复到原来的值。
我试图理解保存的呼叫寄存器是如何工作的。在循环中使用 $s0-$s7 来存储中间结果和内存地址是有意义的。但是说到$ra,我就懵了……
调用保留寄存器不会在函数返回时自动恢复——它们是由修改它们的任何函数的退出代码(称为尾声)手动恢复的。这种恢复是由调用约定强制执行的,每个函数都遵循调用约定规定的规则(否则程序有问题,可能会工作或可能会崩溃)。
preserved 和 scratch 寄存器在硬件上没有区别——任何差异都是由于它支持的约定和寄存器使用模型。
$ra
是调用者提供的参数,函数用于返回正确的调用站点,因为可以从不同的调用站点调用函数。
如果您的函数进行调用,则必然会为该调用重新调整
$ra
寄存器的用途。这种重新利用将清除该寄存器中保存的先前值,这是返回给调用者所必需的,因此进行函数调用的函数必须考虑其自己的返回地址,并为了自己的利益和使用而保存和恢复该地址.来电者不依赖$ra
被恢复。
相比之下,
$s
寄存器是为了某些调用者的利益而保留的。