2012-04-16 6 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 

また、私は$a2行をsimと置き換えましたpler。それらがどのように同等であるかを見てみてください。

関連する問題