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

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


在这种情况下,rax包含0x2329。但是,nop的意思是“什么都不做”,因此我对为什么在行中包含参数感到困惑。该代码加载有libc函数调用,因此我假设源代码是​​C / C ++而不是GAS。

这篇文章内容不错,但perror的解释更恰当,并且包含比“ a”更多的“为什么”仅仅是英特尔文档的独奏会。

评论

x86_64中带有参数的nop可能重复项

谢谢。我想念那个发贴。与此类似,但是我认为响应“一字节NOP指令是XCHG(E)AX,(E)AX指令的别名助记符”在IA-32和64处理器上无效。至少根据英特尔文档。

#1 楼

nop指令主要有两种用法:


它们在组装过程结束时或中间过程中经常用作填充。而且,在这种情况下,可能要填充“一次多于一个字节”,这就是为什么他们添加了额外的参数(在大多数情况下只是被忽略)的原因。参见:NOP指令(维基百科)和NOP-无操作(x86指令集参考)。


它们还可以用于在两次内存提取之间延迟ALU,以使流水线有机会获得数据值的正确预测。并且,这可能是您的情况,因为该指令在计算rax+rax*1+0x0时执行少量算术运算,因此ALU确实由于此操作而延迟。
请参阅:延迟槽(Wikipedia)。



评论


谢谢。看一下周围的代码,延迟时隙答案是完全有意义的。它非常类似于英特尔文档中的NOP DWORD ptr [EAX + EAX * 1 + 0x0 8字节示例。

–不是机器
17/09/22在14:13