This question 表示 LEA 指令可用于进行算术运算。

据我了解,而不是:

inc eax
mov ecx, 5
mul ecx
mov ebx, eax

我可以简单地写
lea ebx, [(eax + 1) * 5]

LEA 版本只是一条指令,而不是 4。但是,我不明白 LEA 如何在没有 incmul 的情况下进行算术运算。

LEA 版本在任何方面都更快,还是 LEA 只是在后台运行原始指令?

编辑:这个问题不是关于 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 仍然可以正常工作。

关于assembly - LEA 在内部做什么?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/39190725/

10-11 18:53