web-dev-qa-db-ja.com

回転命令(ROL、x86上のRCL)の目的は何ですか?

いくつかのCPUが持っている回転命令(ROL、RCL、x86など)の目的は何だろうといつも思っていました。どのようなソフトウェアがこれらの指示を利用しますか?私はそれらが暗号化/計算ハッシュコードに使用されるかもしれないと最初に思ったが、これらのライブラリは通常これらの命令にマップする演算子を持たないCで書かれている。
誰かがそれらの用途を見つけましたか?なぜ彼らは命令セットに追加したのですか?

29
Gratian Lup

複数のワードにわたるビットシフトには、回転が必要です。下位ワードをSHLすると、上位ビットがキャリーに流出します。操作を完了するには、キャリーを下位ビットに持ち込みながら、上位ワードをシフトする必要があります。 RCLはこれを実行する命令です。

上位ワード下位ワードCF 
初期0110 1001 1011 1001 1100 0010 0000 1101?
 SHL下位ワード0110 1001 1011 1001 1000 0100 0001 1010 1 
 RCL上位ワード1101 0011 0111 0011 1000 0100 0001 1010 1 

ROLとRORは、(最終的に)非破壊的な方法でビットごとに値を調べるのに役立ちます。それらは、ゴミビットを持ち込むことなくビットマスクを迂回させるためにも使用できます。

24
Nietzche-jou

回転シフトオペコード(ROL、RCL、ROR、RCR)は、ハッシュとCRCの計算にほぼ排他的に使用されます。彼らはかなり難解で非常にまれに使用されます。

シフトオペコード(SHL、SHR)は、2のべき乗による高速乗算、または大きなレジスタの下位バイトを上位バイトに移動するために使用されます。

ROLとSHLの違いは、ROLが上位ビットを取り、下位ビット位置にロールバックすることです。 SHLは上位ビットを破棄し、下位ビット位置をゼロで埋めます。

16
dthorpe

ROR ROLは「歴史的」ですが、いくつかの点でまだ役に立ちます。

80386(およびオペコードBT)以前は、ROLはビットをテストするために頻繁に使用されていました(SHLはキャリーフラグに伝播しません)-実際に8088では、ROR/ROLは一度に1ビットしかシフトしませんでした。 !

また、範囲外にシフトされたビットを失うことなく一方の方向にシフトし、次にもう一方の方向にシフトする場合は、SHR/SHLではなくROR/ROLを使用します。

8
Alain Pannetier

私があなたを正しく理解しているなら、あなたの質問はこれです:

"ローテーション命令は非常に特殊な目的であり、コンパイラーによって発行されないように見えるという事実を考えると、実際にいつ使用され、なぜCPUに含まれるのですか?"

答えは2つあります。

  1. CPUは、Cプログラムを実行するように特別に設計されていません。むしろ、それらは多種多様なツールや言語を使用して幅広い問題を解決することを目的とした汎用マシンとして設計されています。

  2. 言語の設計者は、CPU内のすべてのオペコードを使用する義務はありません。実際、ほとんどの場合、そうではありません。一部のCPU命令は高度に専門化されており、言語設計者はそれらを使用する必要がないためです。

ビット単位演算子(およびそれらがCプログラミングにどのように関連するか)の詳細については、こちらをご覧ください http://en.wikipedia.org/wiki/Bitwise_operation

3
Robert Harvey

マイクロプロセッサが最初に作成されたとき、ほとんどのプログラムはコンパイルではなくアセンブリで作成されていました。 CPU命令の大部分はおそらくコンパイラーによって発行されません(これはRISCを作成するための原動力です)が、ハードウェアでの実装は比較的簡単です。

グラフィックスと暗号化の多くのアルゴリズムはローテーションを使用しており、CPUに含まれているため、アセンブリで非常に高速なアルゴリズムを作成できます。

1
Gabe