将rep-prefix附加到非字符串指令时会发生什么?

fuz*_*fuz 7 string x86 assembly undefined-behavior

我试图找出普通循环,loop循环和内置rep循环之间的速度差异.我写了三个程序来比较行为:

计划1

_start: xor %ecx,%ecx
0:      not %ecx
        dec %ecx
        jnz 0b
        mov $1,%eax
        xor %ebx,%ebx
        int $0x80       # syscall 1: exit
Run Code Online (Sandbox Code Playgroud)

计划2

_start: xor %ecx,%ecx
        not %ecx
        loop .
        mov $1,%eax
        xor %ebx,%ebx
        int $0x80
Run Code Online (Sandbox Code Playgroud)

计划3

_start: xor %ecx,%ecx
        not %ecx
        rep nop # Do nothing but decrement ecx
        mov $1,%eax
        xor %ebx,%ebx
        int $0x80
Run Code Online (Sandbox Code Playgroud)

事实证明,第三个程序没有按预期工作,一些recherche告诉我,那rep nop也是pause完全不相关的事情.

什么rep,repzrepnz前缀在做,当指令后他们是不是字符串指令?

har*_*old 8

这取决于.rep ret有时用于避免直接跳转到ret某些AMD处理器上的不良性能.的rep(F3)和repne(F2)前缀也用作强制前缀许多SSE指令(例如,它们改变为标量烧毛或标量双变体填充单变体).pause(自旋锁提示)是别名rep nop.其他一些新的指令,使用"假代表前缀"以及(popcnt,crc32,vmxon等)."假"或强制性前缀出现在可选的REX前缀之前,因此不能说它是操作码的一部分,它实际上是一个前缀.

如果前缀为a,则其他操作会生成#UD rep.