是表达式
lea edx, [0+eax*4]
lea edx, [eax*4]
相同吗?
使用+0(零)是否有任何重要意义?
它会影响性能/结果吗?
答案 0 :(得分:4)
是的,它们是相同的,[0+eax*4]
是编码[eax*4]
寻址模式的唯一方法。
在反汇编中,您会看到+0
,因为使用 just 缩放索引的寻址模式在机器代码中并不是真正可编码的。 x86寻址模式始终具有基址寄存器或disp32
。但是disp32可以全为零。
(有趣的事实:这就是[ebp]
组装成[ebp + disp8]
且字节数为零的原因。这种编码方式意味着base = EBP没有位移,而是没有基址寄存器,只是一个disp32。相同不论有没有索引都适用。
所有这些都适用于带有64位寄存器的64位模式。请参阅https://agner.org/optimize/和https://stackoverflow.com/tags/x86/info
中的其他链接性能:
通常值得花额外的机器代码大小在一条单uup指令中进行复制和缩放,而不是使用mov
+ shl
。尤其是在mov和shl在64位模式下都需要自己的REX前缀的情况下。