MIPS地址超出范围(MARS);初学者

时间:2019-12-22 18:32:00

标签: assembly mips runtimeexception mars-simulator outofrangeexception

我正在尝试理解一些代码。我仍处于MIPS的起步阶段。我试图让它在火星上运行,以逐步了解发生了什么。但是,它在第​​6行停止:运行时异常在0x0040000c(指第6行):地址超出范围0x000003ec。

我试图通过在此处查找其他帖子来找到解决方案,但是无法确定问题所在。

add  $t6, $t0, $t0
addi $t4, $t0, 0x7
andi $t3, $t4, 0x4
loop:
lw   $t2, 0x3e8($t3)
add  $t6, $t3, $t6
addi $t5, $t4, 1
sub  $t1, $t2, $t6
bne  $t5, $t6, loop
sw   $t6, 0x400($t1)

如果您能帮助我,我将不胜感激!

1 个答案:

答案 0 :(得分:0)

此奇怪的代码将从0x3e8或0x3ec加载,具体取决于$t0中的内容。

这两个都是异常低的内存位置,它们不存储任何有意义的内容,并且通常受到保护以检测程序错误。

通常来说,我们希望看到分配给各种内容的特定范围内的内存地址。尽管一点也不全面,但以下内容应能使人们对MARS中的一个简单程序有一些期望:

  • 代码在0x00400000到0x004FFFFF范围内,
  • 0x10010000到0x1003FFFF范围内的全局数据,
  • 堆数据在0x10040000到0x1FFFFFFF范围内,
  • 堆栈数据范围为0x70000000到0x7FFFFFFF

在有效内容指定范围之外的地址通常会(但并非总是)导致错误,因为这些地址无效,因此程序中出现了问题–程序正在尝试访问不属于内存的内存有效的数据或指令(例如全局,堆,堆栈或代码)

您将不得不调试较大的代码,以了解其尝试执行的操作,并查看错误的出处,以及为什么可能发生此错误。