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

时间:2010-11-30 17:21:51

标签: assembly x86 ia-32

GCC给了我一些汇编代码,并且在这里声明:

lea eax, [ebx+eax]

(英特尔语法) 只是好奇,它之间有什么区别,并且:

add eax, ebx

要?

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]

3 个答案:

答案 0 :(得分:11)

立即浮现在脑海中的一个区别是lea不会影响旗帜,而add则会影响旗帜。

如果没有看到汇编代码的其余部分,这是否具有任何相关性是不可能的。它可能只是GCC代码生成器的人工制品(即它实际上可以为更一般的情况生成代码,或者仅使用lea作为更灵活的add。)

答案 1 :(得分:6)

您可以将结果放入EAX以外的其他寄存器中,例如lea edx, eax + ebxadd无法做到。

lea还可以有一个额外的第三个操作数,例如lea eax, ebp + esi + 12,这使它成为add指令的替代选择。

您还可以将某些(字大小的)乘法运算与它结合使用,例如lea eax, ebp + eax * 8

更不用说它更好地描述了意图:)

答案 2 :(得分:4)

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

但是,指令多于存储在目标寄存器中的实际结果:

  1. 正如 aix 所指出的那样,lea不会根据添加的结果设置标记。这有时用于指令调度。

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