在 MIPS 架构中,在调用时保留和不保留的寄存器有什么区别?

问题描述 投票:0回答:1

我知道一旦函数结束,保留的调用寄存器会自动恢复到原来的值。

我试图理解保存的呼叫寄存器是如何工作的。在循环中使用 $s0-$s7 来存储中间结果和内存地址是有意义的。但是说到$ra,我就懵了……

mips
1个回答
0
投票

调用保留寄存器不会在函数返回时自动恢复——它们是由修改它们的任何函数的退出代码(称为尾声)手动恢复的。这种恢复是由调用约定强制执行的,每个函数都遵循调用约定规定的规则(否则程序有问题,可能会工作或可能会崩溃)。

preserved 和 scratch 寄存器在硬件上没有区别——任何差异都是由于它支持的约定和寄存器使用模型。

$ra
是调用者提供的参数,函数用于返回正确的调用站点,因为可以从不同的调用站点调用函数。

如果您的函数进行调用,则必然会为该调用重新调整

$ra
寄存器的用途。这种重新利用将清除该寄存器中保存的先前值,这是返回给调用者所必需的,因此进行函数调用的函数必须考虑其自己的返回地址,并为了自己的利益和使用而保存和恢复该地址.来电者不依赖
$ra
被恢复。

相比之下,

$s
寄存器是为了某些调用者的利益而保留的。

© www.soinside.com 2019 - 2024. All rights reserved.