9
lea    0x0(%esi),%esi

我相信它没有结果,只是在填充空间。是这样吗?

4

1 回答 1

17

它是一个 NOP。它将 %esi 和 0x0 的内容相加,并将结果放入 %esi。有些人要么有一个笨拙的代码生成器,要么需要填充 N 个字节,其中这条指令的大小是正确的。

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

x86 与它一样古怪,有各种指令,除了填充不同数量的字节外,它们实际上什么都不做。您可能会发现其他不同长度的无用指令。您往往会发现很长但在 1 个时钟或更短的时间内执行的指令。

AMD x86-64 手册有一些关于 NOP 应该使用什么的建议;他们建议在实际 NOP IIRC 之前重复多次前缀操作码之一。这样的前缀操作码很快就会被指令获取引擎消耗掉;大多数情况下,它们的成本隐藏在指令预取中,而不是指令执行时间中。

于 2012-05-08T20:07:59.597 回答