英特尔汇编 lea 指令

Intel assembly lea instruction

是表达式

lea edx, [0+eax*4]

lea edx, [eax*4]

相同?

使用+0(零)有什么重要的意义吗?

它会影响性能/结果吗?

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

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

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

所有这些都适用于 64 位模式和 64 位寄存器。参见 https://agner.org/optimize/ and other links in https://whosebug.com/tags/x86/info


性能:

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