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