【问题标题】:Rerunning program on MARS-simulator without resetting memory在 MARS 模拟器上重新运行程序而不重置内存
【发布时间】:2017-12-04 17:05:40
【问题描述】:

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

是否可以再次运行程序而无需每次都重置寄存器和数据?

【问题讨论】:

  • 有一个倒带按钮,它确实撤消了大部分事情,但内存内容保持修改 IIRC(如果它像这样工作,您可以在最后将寄存器存储到内存中,并在开始时重新加载它们) ...但通常人们想要完全相反,在重置机器的清洁状态后拥有。 - 这是一个黑客建议。在真正的 SW 中,您必须存储应该保存到某些存储设备(磁盘)或 SRAM 的状态。
  • 快退按钮显示“重置 MIPS 内存和寄存器”。它可以让你再次运行程序,但正如它所说,内存也被重置了。

标签: assembly mips mars-simulator


【解决方案1】:

如果没有其他办法,我发现的最佳选择就是添加一段代码,在运行实际程序之前将值添加到所有寄存器/数据。

【讨论】:

  • 顺便说一句,这是公认的标准方法,在测试之前“设置”环境,使测试结果也可重现(如果使用固定值,或者随机值是测试结果的一部分,所以他们需要时可以重新申请)。所以你至少和大多数人一样好。
【解决方案2】:

我认为您想检查您的代码是否不依赖于某些寄存器或内存为零。这是在 C 等高级语言中检查未初始化变量使用的低级版本。

这个的工业级版本是 Valgrind,它做support MIPS。但是,如果您可以构建它以在 SPIM 中运行,则 IDK;它旨在在 Linux 等真实操作系统上运行(在 MIPS 上)。不过,它只跟踪内存,而不是未初始化的寄存器(因为大多数人在编译器生成的 asm 上使用它,而编译器通常没有这个问题)。参见例如pinpointing "conditional jump or move depends on uninitialized value(s)" valgrind message


出于您的目的,最好的办法是手动将"poison" values 放入您的所有寄存器中,并尽可能多地使用内存。上次运行结束时出现的值不太可能是好的选择;这不会发现初始零或您稍后写入的值都恰好适用于在写入之前读取它的某些代码的问题。

例如,0xDEADBEEF 是一个很好的常量,如果您在调试时或在程序输出中看到它,您可以识别它。它也不太可能是有效的指针或索引。请参阅该链接,了解更多关于什么是好的毒药。

例如

li  $t0,  0xDEADBEEF
move $t1, $t0
move $t2, $t0
...

您可能可以编写一个宏来对除堆栈指针之外的所有寄存器重复它,特别是如果您使用“原始”寄存器编号,如$1$2 等(mapping table from semantic names to raw names。也许您的宏应该初始化除$29 ($sp) 以外的所有内容,包括$1 ($at) 和内核临时注册表)。要编写这样的宏,请在将常量放入 $30$31 之后,使用文本替换创建 $1..$28

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-07-30
    • 1970-01-01
    • 2020-02-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多