2017-05-16 9 views
1

私はコンパイラによって行われるx64アセンブリの最適化を理解しようとしています。"nop dword ptr [rax + rax]" x64アセンブリ命令は何をしますか?

Releaseという小さなC++プロジェクトを、Windowsの場合はVisual Studio 2008 SP1 IDEでビルドしました。

そしてラインの一つには、以下のアセンブリコードを含んでいた:私の知る限りは、それ自体でnopdo nothingですけど、私は」として

enter image description here

B8 31 00 00 00 mov   eax,31h 
0F 1F 44 00 00 nop   dword ptr [rax+rax] 

そして、ここではスクリーンショットですそのようなオペランドでそれを見たことはありません。

誰かが何をしているのか説明できますか?

+4

マルチバイトNOPです。 Set Setのリファレンスでこれについて説明しています。http://www.felixcloutier.com/x86/NOP.html –

+0

@MichaelPetch:ありがとうございます。興味深いことに、その命令を 'Release'ビルドに追加する目的は何ですか? – c00000fd

+3

通常、整列のため。多くの場合、16または32バイトの境界に合わせるためにループの前に表示されます(通常は16がデフォルトです)。これにより、ループのパフォーマンスが向上します。 –

答えて

0

コメントで指摘されているように、通常、後続の命令をループ内の最初の命令である場合、16バイト境界に整列するために使用されるのはmulti-byte NOPです。

このようなアライメントは、命令フェッチが16バイト単位で行われることが多いため、命令フェッチ帯域幅に役立ちます。したがって、ループの先頭を整列させると、ボトルネックが発生することなくデコードが行われる可能性が最大になります。

そのような位置合わせの重要性は、それが一度位置合わせにあまり敏感でループバッファの導入とUOPキャッシュであったよりもおそらくあまり重要ではありません。場合によっては、この最適化は、特にループが非常に少数の時間を実行する場合には、ペシム化であってもよい。

関連する問題