3

x86で単一のメモリセルをゼロに設定する最速の方法は何ですか? 通常、私が行う方法は次のとおりです。

C745D800000000  MOV [ebp-28], 0

ご覧のとおり、定数に 4 バイトすべてを使用しているため、これはかなり分厚いエンコードになっています。MVZEよりコンパクトですがMVZE、メモリでは機能しない単純なレジスタを使用できます。

MOVレジスタをクリアしてから、レジスタ値をメモリにクリアすることを考えていました。次に、2 つの命令になりますが、上記の 1 つの 7 バイト命令ではなく、合計 5 バイトしかありません。「短いほど、通常は速い」というルールに従うと、これが望ましい場合があります。

4

2 に答える 2

5

残念ながら、ここに書いたことは、メモリセルを「直接」ゼロにする唯一の方法です。もちろん、レジスタを XOR してからメモリ位置に移動することもできますが、それがより高速になるかどうかはわかりません。

たまたま値がゼロのレジスタがあり、それが確実である場合は、必ずそれを使用してください。それ以外の場合は、そのまま使用してmov [ebp-28], 0ください。オペランドは最も遅いものの 1 つであることが知られていることに注意してくださいmem, imm。コードをプロファイリングしてこれがボトルネックであることがわかった場合は、関数の最初 (またはその他) でレジスタをゼロに初期化し、それを関数全体で使用してみてください。コード、定義済みの定数の一種として。

于 2013-03-15T22:27:13.493 に答える