シフト命令と回転命令とは何ですか?
シフト命令は、レジスタのビットを左または右に移動します。これは、次のようなさまざまな目的に役立ちます。
* 2 の乗算または除算
* レジスタからの特定のビットの抽出または挿入
* レジスタ内のビットの順序を逆にする
シフト命令には、論理シフトと算術シフトの 2 つの主なタイプがあります。
* 論理的なシフト 符号ビットを含むレジスタ内のすべてのビットをシフトします。これは、レジスタの値が論理シフト後に変更される可能性があることを意味します。
* 算術シフト レジスタ内のデータ ビットのみをシフトし、符号ビットはシフトしません。これは、レジスタの値が算術シフト後に変化しないことを意味します。
次の表は、ほとんどのプロセッサで使用できるさまざまなシフト命令を示しています。
|指示 |説明 |
|---|---|
| `SHL` |論理左シフト |
| `SHR` |論理右シフト |
| `SAR` |右シフト演算 |
| 「ロール」 |左に回転 |
| `ROR` |右に回転 |
回転命令
回転命令はシフト命令と似ていますが、レジスタのビットをシフトするのではなく回転する点が異なります。これは、レジスタの一端のビットがもう一方の端に移動することを意味します。
回転命令は、次のようなさまざまな目的に役立ちます。
* 循環バッファの生成
* 2 つのレジスタの内容を交換する
* 特定の暗号化アルゴリズムの実装
次の表は、ほとんどのプロセッサで使用できるさまざまな回転命令を示しています。
|指示 |説明 |
|---|---|
| 「ロール」 |左に回転 |
| `ROR` |右に回転 |
例
シフト命令と回転命令の使用方法の例をいくつか示します。
※数値を2倍するには左シフト命令を使用します。たとえば、次のコードはレジスタ `EAX` の値を 2 で乗算します。
「」
shl eax、1
「」
* 数値を 2 で割るには、右シフト命令を使用できます。たとえば、次のコードはレジスタ `EAX` の値を 2 で除算します。
「」
シュアックス、1
「」
* レジスタから最下位バイトを抽出するには、右シフト命令を使用できます。たとえば、次のコードはレジスタ `EAX` から最下位バイトを抽出し、それをレジスタ `AL` に格納します。
「」
シュアックス、8
ムーバブル、イーエックス
「」
* 特定のバイトをレジスタに挿入するには、左シフト命令を使用できます。たとえば、次のコードは値 0x12 をレジスタ `EAX` の最下位バイトに挿入します。
「」
移動、0x12
shl eax、8
「」
* レジスタ内のビットの順序を逆にするには、左回転命令を使用できます。たとえば、次のコードはレジスタ `EAX` のビットの順序を逆にします。
「」
ロールエクス、8
「」