IntelおよびAMDプロセッサがネイティブワード長(現在は主に64ビット)で命令をフェッチすることを知っているので、兄にそれについて尋ねたところ、プロセッサをより効率的に実行するために、一部のアセンブリプログラマは命令を32ビットにパディングすると言いました。nop
■次の命令でバイト長が4バイトまたは8バイトを超える場合:
xor ax, ax ; 2 bytes
nop ; 1
nop ; 1
それで、これを行うことに何か利点はありますか?
IntelおよびAMDプロセッサがネイティブワード長(現在は主に64ビット)で命令をフェッチすることを知っているので、兄にそれについて尋ねたところ、プロセッサをより効率的に実行するために、一部のアセンブリプログラマは命令を32ビットにパディングすると言いました。nop
■次の命令でバイト長が4バイトまたは8バイトを超える場合:
xor ax, ax ; 2 bytes
nop ; 1
nop ; 1
それで、これを行うことに何か利点はありますか?
あなたの例ではnop命令の理由はありません。一般に、命令アラインメントの唯一の用途は、関数呼び出しなどの制御フローブランチのターゲットでフェッチされる命令の数を最大化することです。最新のx86フェッチおよびデコードユニットは、x86エンコーディングの可変長の性質に合わせて最適化されています。このようなパディングは物事を遅くするだけです。
Intel Volume 4最適化マニュアルのスキャン(おそらく数年前のもの)は、命令のパディングの理由を提供しませんでした。
はい、AMDBuldozerとIntelAtomのパフォーマンスを大幅に向上させることができますが、IntelCore2とNehalemのパフォーマンスを大幅に向上させることができます。BulldozerとCore2の場合は、16バイト境界で整列し、Atomの場合は8バイト境界で整列します。ただし、NOPの代わりに、追加のプレフィックスまたはより長い命令フォームを使用することが望ましいです。命令の調整は、ピークIPCの半分以上が必要な場合にのみ意味があることに注意してください。