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