nop WORD PTR cs:[rax+rax*1+0x0]
在这种情况下,
rax
包含0x2329
。但是,nop
的意思是“什么都不做”,因此我对为什么在行中包含参数感到困惑。该代码加载有libc
函数调用,因此我假设源代码是C / C ++而不是GAS。这篇文章内容不错,但perror的解释更恰当,并且包含比“ a”更多的“为什么”仅仅是英特尔文档的独奏会。
#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
评论
x86_64中带有参数的nop可能重复项谢谢。我想念那个发贴。与此类似,但是我认为响应“一字节NOP指令是XCHG(E)AX,(E)AX指令的别名助记符”在IA-32和64处理器上无效。至少根据英特尔文档。