30

一部の CPU が持つ回転命令 (たとえば、x86 の ROL、RCL) の目的は何なのか、いつも疑問に思っていました。これらの命令を利用するソフトウェアはどのようなものですか?

最初は暗号化/ハッシュ コードの計算に使用できると考えていましたが、これらのライブラリは通常 C で記述されており、これらの命令に対応する演算子はありません。(編集者注:回転命令にコンパイルされる C または C++ の記述方法については、C++ での循環シフト (回転) 操作のベスト プラクティスを参照してください。また、最適化された暗号ライブラリには、特定のプラットフォーム用の asm が含まれていることがよくあります。)

誰かがそれらの用途を見つけましたか? なぜ彼らは指示セットにどこに追加したのですか?

4

6 に答える 6

29

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

                      ハイワードローワードCF
初期011010011011 1001 1100 0010 0000 1101?
SHLローワード011010011011 1001 1000 0100 0001 1010 1
RCLハイワード110100110111 0011 1000 0100 0001 1010 0

ROLとRORは、(最終的には)非破壊的な方法で値をビットごとに調べるのに役立ちます。また、ガベージビットを持ち込むことなくビットマスクをシャントするために使用することもできます。

于 2011-02-12T06:45:46.573 に答える
17

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

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

ROLとSHLの違いは、ROLが上位ビットを取得し、それを下位ビット位置にロールアラウンドすることです。SHLは上位ビットを破棄し、下位ビット位置をゼロで埋めます。

于 2011-02-12T06:44:02.563 に答える
9

ROR ROLは「歴史的」ですが、それでも多くの点で役立ちます。

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

また、スコープ外にシフトされたビットを失うことなく、一方の方向にシフトしてからもう一方の方向にシフトする場合は、SHR/SHLの代わりにROR/ROLを使用します。

于 2011-02-12T06:53:13.937 に答える
4

私があなたを正しく理解していれば、あなたの質問は次のとおりです。

「回転命令は非常に特殊な目的であり、コンパイラによって発行されないように見えるという事実を考えると、それらは実際にいつ使用され、なぜ CPU に含まれているのですか?」.

答えは 2 つあります。

  1. CPU は、C プログラムを実行するために特別に設計されたわけではありません。むしろ、それらは汎用マシンとして設計されており、さまざまなツールや言語を使用してさまざまな問題を解決することを目的としています。

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

ビット演算子 (および C プログラミングとの関係) の詳細については、http: //en.wikipedia.org/wiki/Bitwise_operationを参照してください。

于 2011-02-12T06:34:32.013 に答える
3

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

グラフィックスと暗号化の多くのアルゴリズムは回転を使用し、CPUにそれらを含めることで、アセンブリで非常に高速なアルゴリズムを記述できます。

于 2011-02-12T06:46:33.607 に答える
1

ここでの多くの回答は、現在受け入れられているものを含め、やや後退したと思います。最大のアプリケーションは、バイト/ワード境界を越えてデータをシフトすることです。

  • ビットパターンの抽出と挿入
    • プロトコル (ビット 6 から始まる 5 ビットを挿入)
    • 圧縮方式 (LZW77 など)
    • データ転送 (300 ボー モデム誰か? 7 ビット データ + パリティ)
  • 任意精度演算
    • 2 による乗算/除算はローテーション スルー キャリーを利用します
    • 他の 2 のべき乗による乗算/除算には、ROL (または ROR) が必要です。
    • 1 ビット グラフィックスの水平スクロール

そしてニッチなアプリケーション:

  • crc16/32
  • 暗号
  • ビットを符号化するため、またはテストのために運ぶための非破壊的な移動ビット

歴史的な観点から、シフトは高価だったということです: 8 ビットのチャンクで 16 ビットを左に 3 シフトする必要がある場合 (または 64 ビットのチャンクで左に 128 ビット)、ROL は 1 つのコストで 2 つの高価なシフトを実行します。

rotate all bits left by 3
      hi       lo
src = fedcba98|76543210
dst = cba98765|43210---

ビット「765」は 5 だけ右にシフトする必要があり、ビット「43210」は 3 だけ左にシフトする必要があることに注意してください。それらに間違ったビットが付随している場合、これらは安価な操作であるマスキングによって再結合されます。

dst_lo = ((src_lo ROL 3) & 0b11111000)
dst_hi = ((src_lo ROL 3) & 0b00000111) | (src_hi << 3)

これは、bignum シフト、またはモノクロ グラフィックス プレーンを任意のピクセル数だけ水平方向にスクロールすることに拡張されます。

このアルゴリズムは非常に重要であるため、80386 にはそのための double-rotate 命令が含まれています。

于 2022-01-11T17:25:43.643 に答える