MARS上的MIPS系统调用:“地址超出范围”

时间:2012-04-16 19:08:32

标签: mips

我是MIPS& amp;的新手火星。作为我程序的一部分,我想从用户那里读取一个字符串。

我有一个简单的代码如下

.globl  test
.data   0x10010000
foo: .asciiz "Input a string"
.data   0x10020000
in: .asciiz "xyz"
.text   0x00400000

test:
li  $v0, 54
add $a0, $zero, 0x1001
add $a1, $zero, 0x1002
add $a2, $zero, 3
syscall

这个想法是在0x1002处读取一条长度为3的字符串到内存中。运行代码给我“运行时异常在0x00400010:地址超出范围0x00001001”。

为什么会这样?我如何解决它?我怀疑我做的事情非常愚蠢,但无法弄明白。

1 个答案:

答案 0 :(得分:4)

我认为你与寻址混在一起了。您已将缓冲区空间定义为0x10020000,但您使用的地址为0x1002用于系统调用。对话框字符串也一样。

您的$a0应该是对话框中显示的字符串的地址;我怀疑这应该是foo

la $a0, foo

您的缓冲区应为in

la $a1, in

修改:这些是add的替代品,所以最后它应该是这样的:

test:
li  $v0, 54
la  $a0, foo
la  $a1, in
li  $a2, 3
syscall

我还用更简单的东西替换了$a2行。试着看看它们是如何相同的。