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

时间:2012-04-21 12:29:24

标签: string assembly x86 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

计划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

事实证明,第三个程序没有按预期工作,并且一些记录告诉我,rep nop又名pause做了一些完全不相关的事情。

reprepzrepnz前缀执行时,当它们后面的指令不是字符串指令时,它们是什么?

2 个答案:

答案 0 :(得分:8)

这取决于。 rep ret有时用于避免在某些AMD处理器上直接跳转到ret的性能不佳。 rep(F3)和repne(F2)前缀也用作许多SSE指令的强制性前缀(例如,它们将打包单变量更改为标量单或变量双变量)。 pause(自旋锁提示)是rep nop的别名。其他一些新指令也使用“假代表前缀”(popcntcrc32vmxon等)。 “假”或强制性前缀位于可选的REX前缀之前,因此不能说它是操作码的一部分,它实际上是一个前缀。

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

答案 1 :(得分:4)

我将在这里引用manual,因为我猜这是唯一的“官方”行为。

从第4.2节“REP / REPE / REPZ / REPNE / REPNZ - 重复字符串操作前缀”:

  

REP前缀可以添加到INS,OUTS,MOVS,LODS和STOS中   说明,以及REPE,REPNE,REPZ和REPNZ前缀即可   添加到CMPS和SCAS指令中。 (REPZ和REPNZ前缀   分别是REPE和REPNE前缀的同义形式。)   与非字符串一起使用时,REP前缀的行为未定义   指令。