2

我是 MIPS 和 MARS 的新手。作为我程序的一部分,我想从用户那里读取一个字符串。

我有一个简单的代码如下

.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

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

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

4

1 回答 1

4

我认为您与寻址混淆了。您已在 0x10020000 处定义了缓冲区空间,但您使用 0x1002 的地址进行系统调用。与对话框字符串相同。

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

la $a0, foo

你的缓冲区应该是in

la $a1, in

编辑:这些是adds 的替代品,所以最后它应该看起来像:

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

我也用$a2更简单的东西替换了这条线。试着看看它们是如何等价的。

于 2012-04-16T19:25:18.700 回答