在没有重置内存的情况下在MARS模拟器上重新运行程序

时间:2017-12-04 17:05:40

标签: assembly mips mars-simulator

我想在随机输入上测试我的程序,但每次重置时,所有寄存器和数据都会重置。

是否可以在没有每次重置寄存器和数据的情况下再次运行程序?

2 个答案:

答案 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