如何清空所有已使用的寄存器,以重新启动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
我是 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