2012-04-16 59 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。試着看看它們是如何相等的。