1. ホーム
  2. assembly

[解決済み] この状況でのlwとbneは何を意味するのか?

2022-03-04 22:40:24

質問

私はプログラミングの初心者なのですが、この問題でlw (both times)とbneは具体的に何をしているのでしょうか?英語に翻訳したため、質問に間違いがあったらすみません。

ここからが問題です。

データメモリの一部には、以下の値が含まれています。

アドレス値

100-1

104-2

108-4

112-8

116-16

以下のコードが与えられたとき、このコードを実行した後のレジスタ r1 の値はどうなりますか?

addi    r2,r0,104
lw  r1,-4(r2)
addi    r3,r0,116
label:  addi    r2,r2,4
lw  r4,-4(r2)
add r4,r4,r4
add r1,r4,r1
bne r2,r3,label

解決方法は?

マイケルが言ったように、命令の内容を読み、各行の後にコメントを付けると、コードを理解するのに役立ちます。

addi    r2,r0,104       ;r2 = 0d104
lw      r1,-4(r2)       ;r1 = (0d100)
addi    r3,r0,116       ;r3 = 0d116
label:addi    r2,r2,4   ;r2 += 4
lw      r4,-4(r2)       ;r4 = (r2-4)
add     r4,r4,r4        ;r4 *= 2
add     r1,r4,r1        ;r1 += r4
bne     r2,r3,label     ;if(r2 ≠ r3), branch to label
nop

LW というのは ロードワード . 指定されたアドレスからレジスタにワードをロードします。

ビーエヌイー というのは 非等価で分岐 . これは、その後に続く命令を遅延なく実行し(これがあなたのコードの後にnopを付けた理由です)、パラメータとして提出された2つのレジスタが等しくない場合に指定されたアドレスに分岐します。

つまり、r1が(0d100)の値、つまり1で初期化され、r3が0d116に設定されるわけです。

r2は4インクリメントされ、r4は(0d104)の値に等しく、2倍された後、r1に加算されます。そして、r2 = 0d116になるまでループします。つまり、0d116の値は決して読み込まれないということです。

r1 = 1 + 2×2 + 4×2 + 8×2 = 29