2

512バイトの長さのデータのバイナリチャンクがあります。一度右にシフトしたい場合、最も効率的な方法は何でしょうか。

今のところ(アセンブリに非常に新しい)私の最も良い推測は、最初にチャンク(おそらくint)をチェックして、それが何をシフトアウトし、シフトし、次に前のintがシフトアウトして運び続けるかを確認する必要があるということです。これにより、データがシフトダウンされます。もっと簡単な方法はありますか?このキャリーテクニックを使用する必要がある場合、シフトできる最大のチャンクは何ですか?DWord?QWord?

4

3 に答える 3

2

1 回だけシフトしたい場合は、rotate-through-carry 命令を使用します。

まず、キャリー フラグがゼロであることを確認します。それで:

  1. レジスタに 4 バイトをプルする
  2. RCR
  3. 書き戻す
  4. 次の 4 バイトで繰り返します
于 2010-07-09T04:40:30.603 に答える
1

x86 でのシフトは、大規模なメモリ構造であっても非常に簡単です。

1) 結果の最初のビット (LSB) として何を使用しないかによって、キャリー フラグをセットまたはクリアします。

2)次のように、メモリ内で一度に32ビットをシフトできるレジスタにデータをプルする必要はありません。

rcr     dword ptr[edx], 1

またはさらに良い

rcr     dword ptr[edx + ecx *4], 1

ここで、ecx はループ カウンター、edx はメモリ ポインターです。

2) 最後にシフトされたキャリー ビットを格納する

編集: メモリ内では、一度に 32 ビットをシフトできます。メモリ アラインメントを忘れないでください。32 ビット アジェンド ワードをシフトして、実行速度を上げます。

于 2010-07-09T07:05:31.350 に答える
0

x86 プロセッサには、この目的に最適なキャリー フラグがあります。キャリーフラグでシフトする命令とscrscl. http://en.wikibooks.org/wiki/X86_Assembly/Shift_and_Rotate#Shift_With_Carry_Instructions

于 2010-07-09T04:42:51.317 に答える