在x86-32汇编中,“lea eax,[ebx + eax]”和“add eax,ebx”的区别是什么?

4
GCC为我生成了一些汇编代码,在其中有这样一条语句:
lea eax, [ebx+eax]

(英特尔语法) 只是好奇,那和这个有什么区别:
add eax, ebx

你好!这段内容涉及到IT技术,其中eax和ebx分别用来存储函数的返回值。

mov eax, DWORD PTR [ebp+8]
mov DWORD PTR [esp], eax 
call CALC1
mov ebx, eax.
mov eax, DWORD PTR [ebp+8]
mov DWORD PTR [esp], eax
call CALC2
lea eax, [ebx+eax]

2
可能是LEA指令还是ADD指令?的重复问题。 - Ciro Santilli OurBigBook.com
@PeterCordes 感谢提供的信息。如果没有一个答案是正确的,我建议您回答该问题,评论错误的答案(看起来您已经这样做了),并评论问题,希望OP会更改接受(不太可能)。我认为这不应影响此案例中的重复方向:那个问题只有更多的赞成票。这也是一个让您获得声望的好机会,因为它具有“创造正义”的效应 :-) - Ciro Santilli OurBigBook.com
3个回答

11

有一个立即显著的差异是,lea指令不会影响标志位,而add指令会。

如果没有看到其余汇编代码,很难确定这是否相关。它可能只是GCC代码生成器的副产品(即实际上可能为更一般的情况生成代码或仅使用lea作为更灵活的add)。


6
您可以将结果放入除EAX之外的另一个寄存器中,例如lea edx, eax + ebxadd无法实现此功能。 lea还可以有第三个操作数,例如lea eax, ebp + esi + 12,这使它成为add指令更方便的替代品。
您还可以将某些(字长)乘法操作与其组合使用,例如lea eax, ebp + eax * 8
更不用说它更好地描述了意图 :)

5

就数字结果而言,没有区别。

然而,指令的意义远不止存储在目标寄存器中的实际结果:

  1. 正如aix所指出的,lea不会根据加法的结果设置标志。这在指令调度方面偶尔是有用的。

  2. 在某些微架构(早期Atom核心)上也存在时间差异;具体来说,在算术单元和地址生成单元之间转发结果时存在停顿,根据上下文使用addlea可以消除这些(非常小的)停顿。


在一些旧的英特尔处理器中,lea 指令可能比 add 指令慢得多。不确定现在的处理器是否仍然如此,但怀疑这种情况已经不再存在了。 - Brian Knoblauch
在AMD的Athlon及以后的处理器中,使用LEA指令可能会有益处 - 实际上这是一种通过寻址引擎而不是ALU来处理的方式,可以挤出另一个并行操作。 - FrankH.
1
@Brian:是的,就我所知,当前英特尔处理器上这两种操作都是单周期操作(尽管在某些处理器上可以同时发出更多的“add”指令)。 - Stephen Canon
1
@FrankH:LEA 在英特尔(Haswell:p1/p5 用于简单操作,3 组件或 RIP 相关的操作只使用 p1。PII/PIII 只使用 p0)和 AMD CPU(Bulldozer 家族中的 EX0/1)的 ALU 上运行。我甚至检查了 P4,它在与 ADD 相同的 ALU 端口上运行 LEA。但是,Via Nano2/3000 在其存储地址端口上运行 LEA,而在 I1/I2 整数 ALU 上运行 ADDAgner Fog 的表格 表明,LEA 对其他端口具有“额外的延迟”,这听起来像 Stephen 关于 Atom 的说法(它也在 AGU1 上运行 LEA,而不是 ALU0/1)。然而,Silvermont 就像其他 OOO 芯片一样,在 ALU 上运行 LEA。 - Peter Cordes
@PeterCordes:没错,我在答案中写的只适用于早期的Atom核心(Bonnell/Saltwell)。Silvermont更加现代化。 - Stephen Canon
1
当然。我并不是在批评你的回答,只是针对FrankH的回复(以及https://dev59.com/YG015IYBdhLWcg3w6QA0上的回答)。Atom和Silvermont是非常不同的架构。有趣的事实是:K8和K10在它们的AGU中运行(复杂的)LEA。你的第二点帮助理解了Agner Fog表格中关于在AGU和ALU之间转发结果需要更长时间的注释。(我甚至还没有阅读他的微体系结构pdf中的Atom部分,但那里可能提到了。) - Peter Cordes

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接