【问题标题】:Why does x86 nopl instruction take an operand? [duplicate]为什么 x86 nopl 指令需要一个操作数? [复制]
【发布时间】:2013-06-06 12:22:20
【问题描述】:

为什么 x86 中的 nopl 指令采用操作数?不要nops只是做,好吧,什么都不做?

nopl   0x0(%rax)

【问题讨论】:

  • 你可以用一个论点“什么都不做”,对吧? 90 nop也有论据,真的是xchg eax, eax
  • 我问是因为我使用的反编译器将其分类为分支指令。为什么会发生这种情况?
  • 它有点像一小部分数据(编码参数的字节)上的分支,它有时用于此目的 - 有效地跳过一些由于某种原因必须存在的数据(丑陋的 hack IMO 但是嘿..),所以你可以把它看作一个分支
  • 必须存在哪些数据?操作数?
  • supercat 举例说明了这些数据的用途

标签: assembly x86 x86-64 instructions nop


【解决方案1】:

许多处理器的二进制指令集有多种表示功能相同指令的方式。例如,原始的 ARM 指令集包括使用 b << n 形式的任何值加载 R0 的指令,其中 b 是从 0 到 255 的值,n 是从 0 到 24 的偶数。如果想使用值 256 加载 R0,可以加载使用 1<<8 加载它的指令,或者可以使用 4<<616<<464<<2 的指令。加载这些不同值的指令都有不同的二进制编码,即使所有四个指令具有相同的效果。

一些编译器的汇编器不遗余力地提供方法来请求一段代码应该使用哪些看似相同的指令。虽然这通常并不重要,但有时可能希望避免在一段代码中使用某些字节值,或者有时对一段代码中的某些字节的修改应该具有特定效果。例如,上述ARM指令中的8位用于指定b的值。如果代码要用值 12 覆盖上述指令之一的b 部分,则加载到 R0 中的值将取决于使用了原始四个指令中的哪一个;它可以是 0x0C00、0x0300、0x00C0 或 0x0030。

虽然 8x86 的汇编器通常无法明确区分所有可能的指令编码,但在某些情况下,能够指定指令中应包含哪些字节值可能会有所帮助。例如,处理异常的一种方法是进行例行检查,当异常发生时,返回地址处的指令是否是某种特定形式的 NOP,如果是,则将其操作数解释为数据结构的地址持有异常相关的信息。在实践中,大多数支持异常的 8x86 语言都使用其他方法来处理它们,但是上述方法会减慢正常函数返回的速度,直到获取和执行长 NOP 所需的时间,但能够相对有效地处理异常退出(大多数语言使用较慢的方法来处理中断,以避免在无异常情况下执行 NOP 的成本,但其他语言可以选择不同的处理方式。

【讨论】:

  • 虽然是真的,但在这种情况下,它更有用的是操作数会改变指令的长度,如 cmets 中的重复链接中的 nrz's answer 所示。
  • @ughoavgfhw:如果只需要一个适当长度的任意 NOP,可以简单地定义 nopnop2nop3 等,或者使用“生成最快的 n 字节 nop 序列”,其参数是所需的大小。如果只需要例如一个 7 字节的 NOP 就不需要指定一个值来进入其中的四个字节。
  • 这正是大多数人所做的,如果汇编程序没有预先定义这样的助记符,如果他们需要特定的 NOP 长度,则使用宏。 (大多数人只使用align 指令,而不是手动多字节 NOP;如果您要手动填充指令,您通常希望使现有指令更长,而不是添加单独的 NOP。What methods can be used to efficiently extend instruction length on modern x86?)。所以通常你会在汇编程序或 JIT 的 C 源代码中看到 NOP1 / NOP2 / 等定义,而不是在 asm 本身中。
【解决方案2】:

有时我在调试时使用 nops。如果我知道出了什么问题,但它需要数千个断点断点才能发现我编写了测试它的代码。它可能看起来像这样(C 风格的代码):

if (condition_occurred)
{
  asm("nop");
}

当我在“asm”行设置断点时,调试器将使用 nop 的线性(物理)地址(对应于虚拟地址)设置 DRx 寄存器。当到达此位置时,将发生断点中断,您将进入调试器。如果您在没有调试器的情况下执行 nop 将被处理(没有任何反应)。所以在这里我想要一个完全不做任何事情的指令,并且它做(不做)是有道理的。


这是一个“什么都不做”的 nop 指令实际上做了一些事情的例子……虽然是间接的。

请参阅this paper 中的第 8 页,并注意示例 3 中循环的第一条(顶部)指令(这是示例 2 的扩展)。还有页面右下角的脚注。

作者暗示额外的 nop 可能会进一步加快这个过程。

所以 nops 肯定有它们的用途。

【讨论】:

  • 您似乎已经回答了“为什么 nop 存在?”的问题,这不是这里提出的问题。
猜你喜欢
  • 2012-09-15
  • 1970-01-01
  • 2015-02-20
  • 2013-04-09
  • 2012-10-01
  • 2021-11-13
  • 2012-04-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多