fuz*_*fuz 7 string x86 assembly undefined-behavior
我试图找出普通循环,loop循环和内置rep循环之间的速度差异.我写了三个程序来比较行为:
_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)
_start: xor %ecx,%ecx
not %ecx
loop .
mov $1,%eax
xor %ebx,%ebx
int $0x80
Run Code Online (Sandbox Code Playgroud)
_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,repz和repnz前缀在做,当指令后他们是不是字符串指令?
这取决于.rep ret有时用于避免直接跳转到ret某些AMD处理器上的不良性能.的rep(F3)和repne(F2)前缀也用作强制前缀许多SSE指令(例如,它们改变为标量烧毛或标量双变体填充单变体).pause(自旋锁提示)是别名rep nop.其他一些新的指令,使用"假代表前缀"以及(popcnt,crc32,vmxon等)."假"或强制性前缀出现在可选的REX前缀之前,因此不能说它是操作码的一部分,它实际上是一个前缀.
如果前缀为a,则其他操作会生成#UD rep.