【问题标题】:What is the meaning of lea 0x0(%esi),%esilea 0x0(%esi),%esi是什么意思
【发布时间】:2012-05-08 20:05:33
【问题描述】:
lea    0x0(%esi),%esi

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

【问题讨论】:

    标签: assembly disassembly


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 后者,除非 GCC 是一个笨拙的代码生成器。感谢您的快速回复。
    • 有趣的一点是lea 0x0(%esi),%esi 仅在 32 位代码中是无操作的。在 64 位代码中,该指令另外将%rsi 的高位双字归零。到目前为止,我已经看到 GCC 仅在 32 位代码中插入此类指令。
    • @Eugene: lea 0x0(%esi),%esi 在 64 位模式下需要额外的大小前缀。
    • @drhirsch:是的,你是对的,它需要“地址大小覆盖”前缀(0x67)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-14
    • 1970-01-01
    • 1970-01-01
    • 2017-11-23
    • 2012-09-15
    • 2011-10-03
    相关资源
    最近更新 更多