英特尔汇编学习指令

时间:2019-12-02 13:48:39

标签: assembly x86 nasm

是表达式

lea edx, [0+eax*4]

lea edx, [eax*4]

相同吗?

使用+0(零)是否有任何重要意义?

它会影响性能/结果吗?

1 个答案:

答案 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前缀的情况下。