7

loopプレーンループ、ループ、ビルトインループの速度の違いを調べてみましたrep。動作を比較するために3つのプログラムを作成しました。

プログラム1

_start: xor %ecx,%ecx
0:      not %ecx
        dec %ecx
        jnz 0b
        mov $1,%eax
        xor %ebx,%ebx
        int $0x80       # syscall 1: exit

プログラム2

_start: xor %ecx,%ecx
        not %ecx
        loop .
        mov $1,%eax
        xor %ebx,%ebx
        int $0x80

プログラム3

_start: xor %ecx,%ecx
        not %ecx
        rep nop # Do nothing but decrement ecx
        mov $1,%eax
        xor %ebx,%ebx
        int $0x80

3番目のプログラムは期待どおりに機能しないことが判明しました。一部の研究者は、rep nop別名pauseはまったく関係のないことをしていると言っています。

それに続く命令が文字列命令でない場合reprepzおよびプレフィックスは何をしますか?repnz

4

2 に答える 2

8

場合によります。は、特定の AMD プロセッサrep retの に直接ジャンプすることによるパフォーマンスの低下を避けるために使用されることがあります。ret( repF3) およびrepne(F2) プレフィックスは、多くの SSE 命令の必須プレフィックスとしても使用されます (たとえば、パックされた単一バリアントをスカラー シングルまたはスカラーダブル バリアントに変更します)。pause(スピン ロック ヒント) は のエイリアスですrep nop。他のいくつかの新しい命令では、「偽の担当者の接頭辞」も使用されます ( popcntcrc32vmxonなど)。「偽の」または必須のプレフィックスは、オプションの REX プレフィックスの前にあるため、オペコードの一部とは言えません。実際にはプレフィックスです。

他の操作でrep.

于 2012-04-21T14:22:14.130 に答える
4

ここでマニュアルを引用するのは、それが唯一の「公式」の動作を指定していると思うからです。

セクション 4.2「REP/REPE/REPZ/REPNE/REPNZ - 文字列操作プレフィックスの繰り返し」から:

REP プレフィックスは INS、OUTS、MOVS、LODS、および STOS 命令に追加でき、REPE、REPNE、REPZ、および REPNZ プレフィックスは CMPS および SCAS 命令に追加できます。(REPZ および REPNZ プレフィックスは、それぞれ REPE および REPNE プレフィックスの同義形式です。) REP プレフィックスの動作は、文字列以外の命令で使用した場合は未定義です。

于 2012-04-21T14:38:50.263 に答える