lea 0x0(%esi),%esi是什么意思

Bri*_*ian 8 assembly disassembly

lea    0x0(%esi),%esi
Run Code Online (Sandbox Code Playgroud)

我相信它没有结果,只是填补空间.是这样的吗?

Ira*_*ter 17

它是一个NOP.它添加了%esi和0x0的内容,并将结果放在%esi中.有人要么拥有笨拙的代码生成器,要么需要填充N个字节,其中该指令的大小正确.

LEA指令执行速度非常快(通常为1个时钟),因此比N nops要好得多.

x86虽然很古怪,但它有各种各样的指令,除了填充不同的字节数外,它们实际上没有做任何事情.您可能会发现其他不同长度的无用指令.您倾向于查找长但在1个时钟或更短时间内执行的指令.

AMD x86-64手册对于NOP应该使用什么有一些建议; 他们建议其中一个前缀操作码在实际的NOP IIRC之前重复多次.这种前缀操作码被指令获取引擎非常快地消耗; 主要是它们的成本隐藏在指令预取中,而不是指令执行时间.

  • 一个有趣的观点是`lea 0x0(%esi),%esi`仅在32位代码中是无操作.在64位代码中,该指令还将'%rsi`的高位双字置为零.到目前为止,我已经看到GCC仅在32位代码中插入这样的指令. (3认同)