此问题已经在这里有了答案:
考虑以下用x86-assembly编写的功能
foo:
rep
nop
ret
使用NASM汇编代码并用gdb
对其进行反汇编:
(gdb) disas foo
Dump of assembler code for function foo:
0x0000000000000610 <+0>: pause ;pause ????
0x0000000000000612 <+2>: ret
0x0000000000000613 <+3>: nop WORD PTR cs:[rax+rax*1+0x0]
0x000000000000061d <+13>: nop DWORD PTR [rax]
End of assembler dump.
它使用原始程序集中未显示的pause
指令。为什么这样工作?这是NASM的故意记录的行为吗?因此,如果某些早期的x86 cpu
没有pause
,我们可以只使用rep nop
?
F3
和90
字节作为PAUSE指令,将其组装成PAUSE指令。这是因为PAUSE指令也被编码为F3 90
。这是x86 CPUS的有意记录的行为,因此没有PAUSE指令的CPU会将其视为NOP。与NASM或GDB无关,它们只能根据CPU文档进行汇编和反汇编指令。