Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly 为什么x86 nopl指令采用操作数?_Assembly_X86_X86 64_Instructions_Nop - Fatal编程技术网

Assembly 为什么x86 nopl指令采用操作数?

Assembly 为什么x86 nopl指令采用操作数?,assembly,x86,x86-64,instructions,nop,Assembly,X86,X86 64,Instructions,Nop,为什么x86中的nopl指令采用操作数?不,不,什么都不做 nopl 0x0(%rax) 许多处理器的二进制指令集有多种表示功能相同的指令的方式。例如,原始ARM指令集包括加载R0的指令,其格式为b有时我在调试时使用nops。如果我知道某些事情是如何出错的,但需要数千个断点才能发现,那么我就编写代码来测试它。它可能看起来像这样(C样式代码): 当我在“asm”行上设置断点时,调试器将使用nop的线性(物理)地址(对应于虚拟地址)设置一个DRx寄存器。当到达此位置时,将发生断点中断,您将进入

为什么x86中的
nopl
指令采用操作数?不,不,什么都不做

nopl   0x0(%rax)

许多处理器的二进制指令集有多种表示功能相同的指令的方式。例如,原始ARM指令集包括加载R0的指令,其格式为
b有时我在调试时使用nops。如果我知道某些事情是如何出错的,但需要数千个断点才能发现,那么我就编写代码来测试它。它可能看起来像这样(C样式代码):

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


下面是一个“不做任何事”nop指令实际执行某些操作的示例。。。虽然是间接的

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

作者暗示,额外的NOP可能会进一步加快这一过程


所以NOP肯定有它的用途。

你可以用一个参数“什么都不做”,对吗
90nop也有参数,它实际上是
xchgeax,eax
。我问这个问题是因为我使用的反编译器将它分类为分支指令。有什么原因会发生这种情况吗?它有点像一小段数据(编码参数的字节)上的一个分支,它有时用于这个目的——有效地跳过一些出于某种原因必须存在的数据(丑陋的黑客,但是嘿…),所以你可以把它看作一个分支。必须存在的数据是什么?操作数?supercat给出了该数据有时用于什么的示例。如果为true,则更有用的是操作数更改了指令的长度,如注释中的重复链接所示。@ughoavgfhw:如果只需要适当长度的任意NOP,可以简单地定义
NOP
nop2
nop3
等,或者具有助记符,用于“生成最快的n字节nop序列”,其参数为所需大小。如果一个人只需要一个7字节的NOP,那么就不需要指定一个值进入其中的四个字节。这正是大多数人所做的,如果汇编程序不预先定义这样的助记符,如果他们需要特定的NOP长度,那么宏就是这样做的。(大多数人只使用
align
指令,而不是手动多字节NOP;如果要手动填充指令,通常希望将现有指令加长,而不是添加单独的NOP。)。因此,通常您会在C源代码中看到汇编程序或JIT的NOP1/NOP2/等定义,而不是asm本身。您似乎已经回答了“nop为什么存在?”这个问题,而这不是本文所问的问题。
if (condition_occurred)
{
  asm("nop");
}