割り当てでは、32 ビットの 2 進数を 44 シフトすることになっていますが、これは最も重要な場所が無関係になることを意味しますか? つまり、最も重要でない場所に最も近い 32 ビットだけを気にしますか? 例えば:
$t0 = 0xBBBBBBBB
#10111011101110111011101110111011
sll $t2, $t0, 44
あなたの課題にはタイプミスがあると思います。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
MIPS では、0 ~ 31 (両端を含む) のビット位置をシフトできます。シフト命令では、シフト カウントの最下位 5 ビットのみが使用されます。MIPS のドキュメントを確認してください。
31 ポジションを超えてシフトしたい場合は、シフトを一連の小さなシフトに分割する必要があります。それぞれのシフトは 31 ポジション以下です。