This question表示LEA指令可用于算术运算。
据我所知,而不是:
inc eax
mov ecx, 5
mul ecx
mov ebx, eax
我可以简单地写
lea ebx, [(eax + 1) * 5]
LEA版本只是一条指令而不是4.但是,我不明白LEA如何在没有inc
和mul
的情况下进行算术运算。
LEA版本是否更快,或者LEA是否只是在后台运行原始说明?
编辑:这个问题不是关于LEA的目的,而是关于它如何在内部工作。
答案 0 :(得分:5)
如果没有INC和MUL,我不明白LEA是如何进行算术的。
关键是LEA只能执行某些类型的算术:这种类型在计算内存地址时非常有用,例如数组访问。
将CPU视为具有用于此类地址计算的专用电路,并将LEA视为使用该电路的指令。
您可以在Wikipedia中阅读x86寻址模式。它显示了您可以使用LEA执行的计算类型。
简而言之,它是一个寄存器乘以1/2/4/8,加上一个寄存器加上一个常数。您可以使用LEA计算(eax + 1) * 5
的唯一原因是它等同于eax * 4 + eax + 5
。例如,如果你试图计算(eax + 1) * 6
,LEA将没有任何帮助,而通用的MUL和ADD仍然可以正常工作。