如何清空所有已使用的寄存器,以重新启动MIPS 中的程序?

how to empty all the registers already used, to restart the program in MIPS?

我是 MIPS 的新手,我有一个 uni 作业。 我在 Mips 中有一个程序(游戏),我正在尝试编写一个函数以在完成后重新启动游戏。 我已经有了重启功能,但问题是我必须清除之前使用过的所有寄存器。 有谁知道我怎样才能用最快最简单的方式清算?(我有740行代码,所以我要求最简单最快。)

寄存器不能为“空”,它们总是在 32 位中保存一些值。它们之外的任何地方都没有元数据指示哪些寄存器已/未写入。

您不需要做任何特别的事情。 Non-buggy 程序其余部分的代码应该已经假设任何寄存器都包含垃圾(不一定是零),如果它没有写入它的话。 (或者完成类似系统调用的操作,这将使模拟器将有用的值放入寄存器中。)

将寄存器视为 C 中的局部变量。例如 int a0, a1, t0, t1; not int a0=0, a1=0 等。这就是为什么要编写 [=13 这样的循环=],其中第一次访问是写入(将 5 分配给变量/寄存器)。在 asm 中,这意味着循环之前的 li $t0, 5 。如果您不这样做,您的循环将 运行 一些未知的迭代次数,具体取决于 $t0 中剩余的任何先前代码。 (在 C 中,读取未初始化的局部变量是未定义的行为或至少是未指定的值。实际上,您会从某个地方得到一些垃圾,因为 C 编译为 asm,而在真正的 CPU 的 asm 中,每个寄存器和内存位置总是有一个价值。)

(在某种意义上,全局变量是一个更好的类比,因为所有代码在不同的时间出于不同的目的使用相同的寄存器。但是由于您不想读取以前的函数留在其中的任何垃圾,这使得将单独的 life-times 视为单独的局部变量具有同等意义。)


如果你确实想将一些寄存器清零,显然你只需编写像

这样的指令
li  $a0, 0
li  $t0, 0        # work-around for buggy code that assumes registers are zeroed
...
j  main