【问题标题】:Intel assembly lea instruction英特尔汇编 lea 指令
【发布时间】:2019-12-02 13:48:39
【问题描述】:

是表达式

lea edx, [0+eax*4]

lea edx, [eax*4]

相同?

使用+0(零)有什么重要的地方吗?

它会影响性能/结果吗?

【问题讨论】:

  • 这没什么区别。这两行都生成完全相同的机器代码。
  • 你已经标记了这个 x86-16,但这是一个 32 位指令?
  • 哎呀。 64位版本的指令是什么?
  • @NateEldredge 这当然也是 16 位模式下的有效指令。
  • 当您尝试并自己检查机器代码时发生了什么?

标签: assembly x86 nasm


【解决方案1】:

是的,它们是相同的[0+eax*4] 是编码[eax*4] 寻址模式的唯一方法。

在反汇编中,您会看到+0,因为具有缩放索引的寻址模式在机器代码中并不是真正可编码的。 x86 寻址模式总是有一个基址寄存器或disp32。但 disp32 可以全为零。

(有趣的事实:这就是为什么[ebp] 组装为带有零字节的[ebp + disp8]。编码意味着 base=EBP 没有位移,而是意味着没有基址寄存器,只是一个 disp32。无论有没有,这同样适用索引)。

所有这些都适用于具有 64 位寄存器的 64 位模式。请参阅https://agner.org/optimize/https://stackoverflow.com/tags/x86/info 中的其他链接


性能:

花费额外的机器代码大小在一个单指令中进行复制和缩放通常是值得的,而不是mov + shl。特别是如果 mov 和 shl 在 64 位模式下都需要它们自己的 REX 前缀。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-02-27
    • 2020-09-22
    • 1970-01-01
    • 1970-01-01
    • 2011-02-14
    • 2012-10-22
    • 2016-07-13
    • 2011-04-29
    相关资源
    最近更新 更多