我最近了解到,nop
指令实际上是xchg eax, eax
……它所做的基本上是eax
与自身进行交流。
就 CPU 而言,交换真的发生了吗?
我最近了解到,nop
指令实际上是xchg eax, eax
……它所做的基本上是eax
与自身进行交流。
就 CPU 而言,交换真的发生了吗?
有几个指令,可以根据编译器使用。xchg eax, eax
是字节码90,是一条合法的指令,占用一个处理周期。此外,还有其他几个指令可以用来代替xchg eax, eax
:
lea eax, [eax + 0x00] byte code 8D 40 00
mov eax, eax byte code 89 C0
由于所有这些指令的长度不同,编译器会根据对齐要求选择最合适的版本之一。
关于编译器的选择,一些提示:
GAS(GNU Assembler,由 GCC 使用)x86 NOP 操作可以在函数i386_align_code() 中找到
同样,对于 LLVM,它位于X86AsmBackend::writeNopData()
简短的回答是“是的”。事实上,如果您通过直接生成机器语言操作码进行试验,您会发现有一整套有效的 NOP 操作,所有这些操作都需要一个处理器周期来执行。
虽然它们在技术上没有“文档化”,但您会发现非常接近 0x90,
XCHG EAX, EAX
XCHG EBX, EBX
XCHG ECX, ECX
XCHG EDX, EDX