string - 当表示前缀附加到非字符串指令时会发生什么?

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

方案二
_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 , repzrepnz前缀在做什么,当它们后面的指令不是字符串指令时?

最佳答案

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

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

关于string - 当表示前缀附加到非字符串指令时会发生什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10258918/

相关文章:

c# - 将 Unity 项目导入 Visual Studio 时出现 "Error: DEP 0700: Registration of the app failed"

javascript - 使用正则表达式分割 javascript 字符串以将数字与其他字符分开

c# - ar-sa 文化的预期日期时间字符串是什么?

swift - 你能在 Swift 中评估一个字符串吗?

assembly - 通过加法和减法设置和清除进位标志

c - 这条指令是做什么的? :- mov %gs:0x14, %eax

assembly - GNU 汇编器 x86 指令后缀(例如 ".s"中的 "mov.s")如何工作?

javascript - 在javascript中处理长字符串

linux - 如何制作多架构 Docker 镜像?

assembly - 保护模式寻址