1

これが私の宿題です。

次のMIPSコードが何を達成するかをできるだけ簡潔に説明してください。レジスタ$8が配列Aのベースアドレスを保持していると仮定します。

addi $10, $0, 0
L1:
lw $16, 0($8)
slt $9, $0, $16
beq $9, $0, L2
addi $10, $10, 1
addi $8, $8, 4
j L1
L2:

今私が思いついた答えは、

A [0]に0以下の値が含まれている場合、ループは無限に実行され続けます。間違っている場合は、ガイドしてください。

前もって感謝します。

4

3 に答える 3

1

これが元の質問に対する完全で直接的な答えです-「コードは何をしますか?」:

  • r8は、符号付き32ビット整数の配列の先頭を指していると想定しています。
  • コードは配列内で正ではない要素を前方に検索し、そのような要素が見つかった場合にのみ停止します。停止した場合、次のプロパティが保持されます。
    • r10は、見つかった要素の配列インデックスと同じです。(0、1、2など)
    • r8は、見つかった要素のアドレスと同じです。(これは、r8に4 * r10を加えた元の値です。)
    • r16は、見つかった要素の値(ゼロまたは負)に等しくなります。
    • r9は0に等しい。(条件コード)

(説明は私の他の回答投稿にあります。)

于 2011-08-10T16:22:56.290 に答える
1

これをもう少し見てください。7行目で何が起こっているかが重要です。何してるのaddi $8, $8, 4?これはあなたの答えに役立ちます。あなたの現在の答えは十分ではないと思います。

于 2011-08-09T18:53:41.857 に答える
1

MIPS命令セットリファレンスを使用して、アセンブリコードをわかりやすい形式に変換してみましょう。

    Compute r0 + 0 and store to r10.
L1:
    Load word at address r8 + 0 to r16.
    If r0 is less than r16, then set r9 to 1, else set r9 to 0.
    If r9 equals r0 then goto L2.
    Compute r10 + 1 and store to r10.
    Compute r8 + 4 and store to r8.
    Goto L1.
L2:

r0の値は常にゼロであることに注意してください。

それをさらに翻訳しましょう:

r10 = 0
while true:
    r16 = memory[r8]
    r9 = if r16 > 0 then 1 else 0
    if r9 == 0:
        break
    r10 += 1
    r8 += 4
于 2011-08-09T19:07:09.143 に答える