我是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”。
为什么会这样?我如何解决它?我怀疑我做的事情非常愚蠢,但无法弄明白。
答案 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
行。试着看看它们是如何相同的。