在nasm中的长nop指令

Bee*_*ope 6 x86 assembly nasm

nasm是否有任何内置方法来发出给定长度的long-nop(又称多字节nops)指令?

Ale*_*lke -2

NOP请注意,在代码方面,英特尔处理器中只有一条指令。它的代码是 0x90,它只是一个字节。

较长的“nop”是不执行任何操作的指令,例如XCHG寄存器本身。例如,对于“2 个字节NOP”,您可以这样写:

XCHG AL, AL
Run Code Online (Sandbox Code Playgroud)

其编码为:

86 C0
Run Code Online (Sandbox Code Playgroud)

所以你可以编写宏来获得你想要的任何大小。找到所有这些“不执行任何操作”的指令需要做一些工作。另外,有时(大多数情况下)编译器会尝试优化您的表达式。这就是可能需要输入代码的地方。

我所知道的最长的编码将使用该LEA指令。这是可以优化地址偏移量的地方,因为它们将是零,很多零,并且应该优化它们。

正如 Jester 提到的,您可以使用现有的宏。互联网上有该文件的副本。

https://github.com/lettolabs/nasm/blob/master/macros/smartalign.mac

解码所有这些指令并看看它们是什么是很有趣的。

例如,他们使用 aMOV %si, %si创建 2 个字节NOP

  • @DavidHoelzer:在 x86-64 中 `0x90` 是真正的 NOP。如果它运行为“xchg eax,eax”,它会将 EAX 零扩展到 RAX。如果你写‘xchg eax,eax’,它不能被编码为‘90’;它必须使用通用的“xchg r/m32, r32”编码,因为 NOP 指令接管“0x90”xchg-with-eax 操作码。(其他寄存器仍然可以使用短编码,例如“0x91”到带有 ecx 的 xchg eax)。我不确定汇编器如何选择在 32 位或 64 位模式下编码 `xchg ax,ax`。`66 90` 是合法的,尽管它是一个真正的 NOP,而不是 3-uop `xchg`。(不过,用作 NOP 的 LEA 编码并不是真正的 NOP。) (4认同)
  • [多字节 NOP 操作码正式发布](https://software.intel.com/en-us/forums/watercooler-catchall/topic/307174) 是从 2006 年开始...另请参阅 [felixcloutier](http:// www.felixcloutier.com/x86/NOP.html)——它们都被称为“nop”。 (2认同)