0

beq命令が機械語でどのようにコード化されているかを教えなければならないというこの試験の質問を見つけました。

これはコードです:

loop:  addu    $8, $9, $10
    addiu   $8, $8, 0x00FF7A01
    beq    $8, $0, loop

私の最初の質問は0x1100FFFD正解ですが、です0x1100FFFB。これは0x00FF7A01、16ビットよりも大きく、addiu $8, $8, 0x00FF7A01複数の命令で「逆コンパイル」する必要があるためだと思います。

これが私の質問です。

Q1-分解されたものはaddiu $8, $8, 0x00FF7A01何ですか?

Q2-そして、beq命令のイミディエートフィールドが16ビットより大きい場合はどうなりますか?使用する必要がありますjumpsか?

4

2 に答える 2

1

Q1)

最初の質問では、逆コンパイルではなく、アセンブルを意味します。

 addiu   $8, $8, 0x00FF7A01

あなたの評価は正しかった。当面の値は単一の命令に保存できる値よりも大きかったので、複数の命令を使用する必要があるだろう。アセンブラは、そのために$ at(Assembler Temporary、つまり$ 1)レジスタを使用します。

lui    $at, 0x00FF
ori    $at, $at, 0x7A01
addu   $t0, $t0, $at

Q2)

分岐命令は、いわゆるPC相対アドレス指定を使用します。即値には、オフセットという単語ではなく、実際のアドレスが含まれていません。命令はワード(2 ^ 2)で整列する必要があることがわかっているため、下位2ビットは常にゼロです。実際のアドレスは、オフセットを2だけ左にシフトし、分岐に続く命令のアドレスに追加することにより、その場で計算されます。最終的な値は、PCに相対的な実効アドレスになります。したがって、実際には17ビットで遊ぶことができます(技術的には18ビットですが、オフセットは署名されています)。

オフセットがその範囲を超えると、アセンブラはファーブランチを使用します。ブランチの後にジャンプが続きます。

beq $x, $y, label

となります

      beq   $x, $y, temp
      # ...
      j tskip
temp:
      j tlabel
      # ...
      # ...
tskip:
于 2012-06-26T15:36:48.993 に答える
0

ここでアセンブラがどのように機能するかはわかりませんが、addiu $8, $8, 0x00FF7A01正しくアセンブルできるようにするには、予想どおり、複数の命令が必要です。通常、addiuは16ビット整数のみを受け取る有効な命令です。

命令addiu $8, $8, 0x00FF7A01は、次の3つの命令として最小限に書き直されます。

addiu $8, $8, 0x7A01
lui $11, 0x00FF // Assume nothing significant is stored in $11
addiu $8, $8, $11

現在、分岐命令と5命令の違いがあるため、beq0xFFFBであるの直接のフィールドに-5を入力する必要があります(詳細な説明はこちら)。

宛先が-217〜2 17 -1バイトの範囲外(または命令数で15の累乗)の場合は、ジャンプ命令を使用する必要があります。

于 2012-06-26T08:17:44.670 に答える