我在计算机组织与设计(Patterson& Hennessy)的书中看到了这句话:
$ s0- $ s7:八个已保存的寄存器必须在过程调用中保留(如果使用,被调用者保存并恢复它们)
我不明白“程序调用中保留的内容”是什么意思。
答案 0 :(得分:2)
这意味着如果您正在实现子例程(例如被调用者),则需要保留这些寄存器的内容。
这意味着:你要么不在你的子程序中使用它们,要么就是这样,你先保存它们并在返回给调用者之前恢复它们。
答案 1 :(得分:0)
通常我们在这些寄存器上存储局部变量。假设您使用以下算法计算一个数字因子:
int f(int a){ int t = a-1; return a*f(t); }
在这种情况下,您会看到此处有局部变量a
和t
。由于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]