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