八个保存寄存器的功能(MIPS)

时间:2011-02-27 00:15:13

标签: mips cpu-registers

我在计算机组织与设计(Patterson& Hennessy)的书中看到了这句话:

  

$ s0- $ s7:八个已保存的寄存器必须在过程调用中保留(如果使用,被调用者保存并恢复它们)

我不明白“程序调用中保留的内容”是什么意思。

3 个答案:

答案 0 :(得分:2)

这意味着如果您正在实现子例程(例如被调用者),则需要保留这些寄存器的内容。

这意味着:你要么不在你的子程序中使用它们,要么就是这样,你先保存它们并在返回给调用者之前恢复它们。

答案 1 :(得分:0)

通常我们在这些寄存器上存储局部变量。假设您使用以下算法计算一个数字因子:

int f(int a){ int t = a-1; return a*f(t); }

在这种情况下,您会看到此处有局部变量at。由于a是一个参数,因此在此过程中它将存储在$a0-$a3中。但是,您很可能会将这些参数存储在$s0-$s7$t0-$t7中。此过程以递归方式调用自身,因此您应将局部变量的值保存到堆栈中。 (阅读“激活记录”或“调用堆栈”)您应该将这些值推送到堆栈$sp,然后在停止案例返回时弹出它们。

基本上,您可以在过程或主程序中保存此堆栈上的值。这只是一个约定,您可以将您的值放入$v$t$a寄存器中,它们也会起作用,但在程序复杂之后可能会出现问题。< / p>

如果您的过程使用$s寄存器,则在调用此过程之前,必须将这些寄存器保存到堆栈中,以便在程序用完$t寄存器时“保留”它们。

如果你正在考虑这个问题,现在就不要担心,你以后会学到更多。

答案 2 :(得分:0)

寄存器s0-s7(软寄存器)(又名$ 16- $ 20物理寄存器)是临时寄存器,使用C / C ++时会保留这些寄存器。

除非您正在编写程序集,否则您根本不必担心它,因为这是正常的abi(应用程序二进制接口)

如果您需要阅读或无法入睡,我的收藏中的一些书签可能有所帮助: - )

[MIPS上的维基百科] [1]

[ABI Notes] [2]