我试图找出普通循环,loop
循环和内置rep
循环之间的速度差异。我写了三个程序来比较行为:
_start: xor %ecx,%ecx
0: not %ecx
dec %ecx
jnz 0b
mov $1,%eax
xor %ebx,%ebx
int $0x80 # syscall 1: exit
_start: xor %ecx,%ecx
not %ecx
loop .
mov $1,%eax
xor %ebx,%ebx
int $0x80
_start: xor %ecx,%ecx
not %ecx
rep nop # Do nothing but decrement ecx
mov $1,%eax
xor %ebx,%ebx
int $0x80
事实证明,第三个程序没有按预期工作,并且一些记录告诉我,rep nop
又名pause
做了一些完全不相关的事情。
当rep
,repz
和repnz
前缀执行时,当它们后面的指令不是字符串指令时,它们是什么?
答案 0 :(得分:8)
这取决于。 rep ret
有时用于避免在某些AMD处理器上直接跳转到ret
的性能不佳。 rep
(F3)和repne
(F2)前缀也用作许多SSE指令的强制性前缀(例如,它们将打包单变量更改为标量单或变量双变量)。 pause
(自旋锁提示)是rep nop
的别名。其他一些新指令也使用“假代表前缀”(popcnt
,crc32
,vmxon
等)。 “假”或强制性前缀位于可选的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前缀的行为未定义 指令。强>