論理左シフトが 1 ~ 31 ビットのシフトを実行できることを確認しました。算術右シフトと論理右シフトは、シフト量として 1 ~ 32 を使用します。右シフトと左シフトの違いはなぜですか?
2 に答える
これは、特定のシフト操作の特別な意味に関係しています。DDI 0029E
(ARM7TDMIデータシート)から:
LSL #0 は特殊なケースで、シフターが実行するのは CPSR C フラグの古い値です。Rm の内容は、第 2 オペランドとして直接使用されます。
....
LSR #0 に対応すると予想されるシフト フィールドの形式は、キャリー出力として Rm のビット 31 でゼロの結果を持つ LSR #32 をエンコードするために使用されます。論理右シフト ゼロは論理左シフト ゼロと同じであるため冗長であるため、アセンブラは LSR #0 (および ASR #0 と ROR #0) を LSL #0 に変換し、LSR #32 を指定できるようにします。
つまり、プロセッサの設計者は に特別な意味を割り当てました。これは、1..31 のシフト量がそのまま解釈され、0 に特別な意味がある
LSL #0
ため、 のエンコードが不可能であることも意味します。とは同じ意味を持つため、アセンブラによってに変換されます。つまり、 と のマシン コード エンコーディングは、他の何かに自由に使用できます。そのため、シフト量ゼロが 32 として解釈されるようにしました。LSL #32
LSR #0
ASR #0
LSL #0
LSR #0
ASR #0
LSR/ASR