3

論理左シフトが 1 ~ 31 ビットのシフトを実行できることを確認しました。算術右シフトと論理右シフトは、シフト量として 1 ~ 32 を使用します。右シフトと左シフトの違いはなぜですか?

4

2 に答える 2

3

これは、特定のシフト操作の特別な意味に関係しています。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 #32LSR #0ASR #0LSL #0LSR #0ASR #0LSR/ASR

于 2013-06-25T09:58:03.167 に答える