0

こんにちは、私はアセンブリ言語を書く練習をしており、この一見単純なコードに取り組んでいます。ユーザーに入力を求めたいので、その入力を取得して配列に入れたいと思います。次に、配列を印刷したいと思います。配列に入れずに印刷できることはわかっていますが、これは私の練習用です。印刷されませんが、何かが正しくありません。

    .data
array:  .space 400
prompt: .asciiz "Enter an integer (0 to quit) :"
text:   .asciiz "After sorting, the list of integers is:"
   .text
   .globl main
main:
    la $a1, array

    li $v0, 4
    la $a0, prompt
    syscall

    li $v0, 5
    syscall

    sw $v0, 0($a1)
    addiu $a1, $a1, 4

    beqz $v0, sort
    j main

sort:
    la $a1, $array

    li $v0, 4
    la $a0, text
    syscall

loop:
    lw $t0, 0($a1)
    addiu $a1, $a1, 4

    beqz $t0, done

    li $v0, 1
    move $a0, $t0
    syscall

    j loop

done:

私が間違っていることを手伝ってください。ああ、ゼロは、入力の終わりを意味するゼロをヒットしたときのセンチメンタル値のようなものです

4

1 に答える 1

1

MIPS の分岐およびジャンプ命令には遅延スロットがあることに注意してください。つまり、分岐またはジャンプ命令の直後の命令は常に実行されます。
アセンブラー (ガス?) が、NOPs命令を挿入または並べ替えることによって、これを処理している可能性があります。objdump を使用してバイナリを逆アセンブルすることで確認できます。アセンブラがこれを修正しないNOP場合、自分で修正する最も簡単な方法は、各ブランチ/ジャンプの後に を挿入することです。

もう 1 つの際立った点は、新しい番号を読み取る前に、常に$a1のアドレスをリロードすることです。arrayこれは、読み取ったすべての数値がarray[0]、終端の 0 を含めて に格納されることを意味します。したがって、印刷ループは、配列の最初の値として 0 を検出し、すぐに終了します。
コードを次のように変更することで、これを修正できます。

main:
la $a1, array
read_numbers:
  # Rest of code omitted for brevity...
  beqz $v0, sort
  j read_numbers
于 2013-03-22T06:27:26.330 に答える