- 是什么
rep; nop
意思? - 和
pause
指令一样吗? - 它与
rep nop
(没有分号)相同吗? - 与简单
nop
指令有什么区别? - 它在 AMD 和 Intel 处理器上的行为是否不同?
- (奖励)这些说明的官方文档在哪里?
这个问题的动机
在另一个问题的评论中进行了一些讨论后,我意识到我不知道rep; nop;
在 x86(或 x86-64)程序集中是什么意思。而且我在网上找不到很好的解释。
我知道这rep
是一个前缀,意思是“重复下一条指令cx
时间”(或者至少在旧的 16 位 x86 程序集中是这样)。根据Wikipedia 上的这个汇总表,它似乎rep
只能与movs
, stos
, cmps
,lods
一起使用scas
(但也许这个限制在较新的处理器上被删除了)。因此,我认为rep nop
(没有分号)会重复一次nop
操作cx
。
然而,经过进一步的搜索,我变得更加困惑。似乎rep; nop
andpause
映射到完全相同的操作码,并且pause
具有与 just 不同的行为nop
。2005 年的一些旧邮件说了不同的话:
- “尽量不要烧太多电”
- “它相当于 'nop' 只是使用 2 字节编码。”
- “这对英特尔来说很神奇。它就像'nop,但让另一个 HT 兄弟运行'”
- “它在英特尔上暂停,在 Athlon 上快速填充”
有了这些不同的意见,我无法理解正确的含义。
它在 Linux 内核中使用(在i386和x86_64上),连同这条评论:/* REP NOP (PAUSE) is a good thing to insert into busy-wait loops. */
它也在BeRTOS 中使用,带有相同的评论。