我想在随机输入上测试我的程序,但每次重置时,所有寄存器和数据都会重置。
是否可以在没有每次重置寄存器和数据的情况下再次运行程序?
答案 0 :(得分:1)
如果没有其他办法,我发现的最佳选择就是添加一段代码,在运行实际程序之前将值添加到所有寄存器/数据中。
答案 1 :(得分:1)
我认为您要检查您的代码是否依赖于某些寄存器或内存为零。这是检查在C等高级语言中使用未初始化变量的低级版本。
这是工业强度版本的Valgrind,它support MIPS。 IDK,如果你可以建立它在SPIM内运行,但;它设计用于在Linux(MIPS)等真实操作系统上运行。它只跟踪内存,而不是未初始化的寄存器(因为大多数人在编译器生成的asm上使用它,通常没有这个问题)。请参阅示例pinpointing "conditional jump or move depends on uninitialized value(s)" valgrind message。
出于您的目的,您最好的选择是手动将"poison" values放入所有寄存器中,并根据需要添加内存。在最后一次运行结束时出现的值不太可能是好的选择;如果初始零或后面写的值都发生在写入之前读取它的某些代码上,那么就不会出现问题。
例如,0xDEADBEEF
是一个很好的常量,如果您在调试时或在程序的输出中看到它,就可以识别它。它也不太可能是有效的指针或索引。请参阅该链接,了解有关什么是好毒药的更多信息。
e.g。
li $t0, 0xDEADBEEF
move $t1, $t0
move $t2, $t0
...
你可以编写一个宏来重复除了堆栈指针之外的所有寄存器,特别是如果你使用" raw"注册$1
,$2
等数字(mapping table from semantic names to raw names。可能您的宏应该初始化除$29
($sp
)之外的所有内容,包括$1
($at
)和内核临时regs)。要编写类似这样的宏,请在将常量放入$1
和$28
之后使用文本替换来创建$30
.. $31
。