我试图找出普通循环之间的速度差异,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
结果第三个程序没有按预期工作,一些recherche告诉我,
rep nop
又名 pause
做一些完全不相关的事情。什么是
rep
, repz
和 repnz
前缀在做什么,当它们后面的指令不是字符串指令时?
最佳答案
这取决于。 rep ret
有时用于避免直接跳转到 ret
的不良性能在某些 AMD 处理器上。 rep
(F3) 和 repne
(F2) 前缀也用作许多 SSE 指令的强制前缀(例如,它们将压缩单变体更改为标量单变体或标量双变体)。 pause
(自旋锁提示)是 rep nop
的别名.其他一些新指令也使用“假代表前缀”( popcnt
、 crc32
、 vmxon
等)。 “假”或强制前缀出现在可选的 REX 前缀之前,所以不能说它是操作码的一部分,它确实是一个前缀。
如果以 rep
为前缀,其他操作会生成 #UD .
关于string - 当表示前缀附加到非字符串指令时会发生什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10258918/