1

割り当てでは、32 ビットの 2 進数を 44 シフトすることになっていますが、これは最も重要な場所が無関係になることを意味しますか? つまり、最も重要でない場所に最も近い 32 ビットだけを気にしますか? 例えば:

 $t0 = 0xBBBBBBBB
 #10111011101110111011101110111011
 sll  $t2,  $t0,  44
4

3 に答える 3

3

あなたの課題にはタイプミスがあると思います。MIPSsll命令は、5 ビット分のシフトのみをサポートします。つまり、命令エンコーディングのフィールドは 5 ビット長のみであるため、[0,31] のシフト値のみが有効です。実際、この単純なプログラムをアセンブルしようとすると、次のようになります。

    .globl f
    .text
f:
    sll $t2, $t0, 44

gcc から次のような警告が表示されます。

example.s: Assembler messages:
example.s:3: Warning: Improper shift amount (44)

出力オブジェクトを逆アセンブルすると、次のようになります。

Disassembly of section .text:

00000000 <f>:
   0:   00085300    sll t2,t0,0xc

ご覧のとおり、実際には 12 だけシフトします。32 を法としてシフト量が減っただけです。この結果が意味するのは、課題で提供されたような命令は単に合法ではないということです。

あなたの質問に対する別の可能な答えは、0任意の数値をそのサイズを超えて左シフトすると、間違いなく論理的にレジスタがゼロでいっぱいになる可能性があるためです。同様の引数は右シフトにも機能しますが、符号拡張の動作と開始時のビット 31 の内容に応じて、最終的に0またはになります。0xffffffff

于 2013-01-31T18:14:55.970 に答える
2

はい、割り当てにタイプミスがあることが確認されました。この問題については、おそらく次の記事で話しているでしょう: Computer Organization and Design: ここに画像の説明を入力

その答えが次のようにリストされている場所:
ここに画像の説明を入力

sll $t2, $t0, 4 と仮定すると、答えは完全に理にかなっています。

t0 = 1010 1010 1010 1010 1010 1010 1010 1010
t2 = 1010 1010 1010 1010 1010 1010 1010 0000

4 シフトした後。

于 2016-06-04T19:27:17.027 に答える
1

MIPS では、0 ~ 31 (両端を含む) のビット位置をシフトできます。シフト命令では、シフト カウントの最下位 5 ビットのみが使用されます。MIPS のドキュメントを確認してください。

31 ポジションを超えてシフトしたい場合は、シフトを一連の小さなシフトに分割する必要があります。それぞれのシフトは 31 ポジション以下です。

于 2013-01-31T06:15:11.307 に答える