英特尔汇编 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 前缀。
是表达式
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 前缀。