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



我是MIPS的新手,我有一个uni的任务。我在Mips中有一个程序(游戏(,我正在尝试编写一个函数,以便在完成后重新启动游戏。我已经有了重启功能,但问题是我必须清除以前使用过的所有寄存器。有人知道我该如何以最快、最简单的方式结算吗?(我有740行代码,这就是为什么我要求最简单、最快的。(

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

你不需要做任何特别的事情。程序其余部分的无错误代码应该已经假设任何寄存器都包含垃圾(不一定是零(,如果它没有写入的话

把寄存器想象成C中的局部变量。像int a0, a1, t0, t1;而不是int a0=0, a1=0等。这就是为什么要写像for(t0=5 ; t0!=0 ; t0--)这样的循环,其中第一次访问是写(为变量/寄存器分配5(。在asm中,这意味着循环之前的li $t0, 5。如果不这样做,循环将运行一些未知数量的迭代,这取决于$t0中剩下的任何先前代码。(在C中,读取未初始化的局部变量是未定义的行为,或者至少是未指定的值。在实践中,你会从某个地方得到一些垃圾,因为C编译到asm,而在实际CPU的asm中,每个寄存器和内存位置都有一个值。(

(在某些意义上,全局变量是一个更好的类比,因为所有代码在不同的时间使用相同的寄存器用于不同的目的。但由于你不想读取它们中留下的任何垃圾,因此将单独的生存时间视为单独的局部变量也是有意义的。(


如果你确实想将一些寄存器归零,显然你只需要编写类似的指令

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

最新更新