2012-04-16 58 views
2

我是MIPS的新手& MARS。作为我的程序的一部分,我想从用户那里读取一个字符串。MARS上的MIPS系统调用:“地址超出范围”

我有一个简单的代码如下

.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”。

为什么会发生这种情况?我如何解决它?我怀疑我做的事很愚蠢,但无法弄清楚。

回答

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 

我也用行代替了sim卡PLER。试着看看它们是如何相等的。