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 に定義しましたが、syscall に 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 に答える