7

我试图找出普通循环、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

节目二

_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 noppause做了一些完全不相关的事情。

rep,repzrepnz前缀后面的指令不是字符串指令时,它们在做什么?

4

2 回答 2

8

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

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

于 2012-04-21T14:22:14.130 回答
4

我只是在这里引用手册,因为我猜它指定了唯一的“官方”行为。

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

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

于 2012-04-21T14:38:50.263 回答