这是一种什么样的汇编语言结构?

逆向工程 拆卸 部件
2021-06-30 10:46:47

我正在反转在 AMD X86-64 上创建的 ELF64 可执行文件。我在文件末尾附近遇到了这一行,并且对它的含义感到困惑:

nop    WORD PTR cs:[rax+rax*1+0x0]

在这种情况下rax包含0x2329. 然而,nop意味着“什么都不做”,所以我很困惑为什么行中包含参数。代码加载了libc函数调用,所以我假设源代码是​​ C/C++ 而不是 GAS。

这篇文章的内容很好,但 perror 的解释更恰当,包含更多的“为什么”,而不仅仅是对英特尔文档的独奏。

1个回答

nop指令的用法主要有两种

  1. 它们经常用作组装程序末尾或程序之间的填充。而且,在这种情况下,人们可能想用“一次多于一个字节”来填充,这就是为什么他们添加了额外的参数(大部分时间都被忽略了)。

    请参阅:NOP 指令(维基百科)和NOP—无操作(x86 指令集参考)。

  2. 它们还可用于在两次内存提取之间延迟 ALU,以便让流水线有机会获得对数据值的正确预测。并且,这可能是您的情况,因为该指令在计算时执行小型算术计算rax+rax*1+0x0,因此 ALU 由于此操作而确实延迟了。

    请参阅:延迟槽(维基百科)。