LEA在内部做什么?

kon*_*las 2 x86 assembly

这个问题说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的目的,而是它如何在内部工作.

NPE*_*NPE 5

我不明白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仍然可以正常工作.

  • 现代 Intel CPU 实际上没有用于这些地址计算的专用电路。ALU 执行 LEA 所需的所有算术。为了让 LEA 真正在 AGU(地址生成单元)上运行,您必须回到旧的 Intel 芯片(Pentium III 及更早版本)或 AMD K8/K10。 (2认同)
  • @CodyGray:有序 Atom(Silvermont 之前)在实际 AGU 上运行 LEA,比 ALU 更早在管道中运行。因此,就延迟而言,它需要更早准备好输入,但更快地产生输出。但请注意,现代 CPU *确实* 有专用的 AGU 来处理加载和存储地址微指令;他们只是不将它们用于 LEA。我想这就是你想说的,但你的第一句话就错了。 (2认同)