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]
答案 0 :(得分:11)
立即浮现在脑海中的一个区别是lea
不会影响旗帜,而add
则会影响旗帜。
如果没有看到汇编代码的其余部分,这是否具有任何相关性是不可能的。它可能只是GCC代码生成器的人工制品(即它实际上可以为更一般的情况生成代码,或者仅使用lea
作为更灵活的add
。)
答案 1 :(得分:6)
您可以将结果放入EAX以外的其他寄存器中,例如lea edx, eax + ebx
。 add
无法做到。
lea
还可以有一个额外的第三个操作数,例如lea eax, ebp + esi + 12
,这使它成为add
指令的替代选择。
您还可以将某些(字大小的)乘法运算与它结合使用,例如lea eax, ebp + eax * 8
。
更不用说它更好地描述了意图:)
答案 2 :(得分:4)
就数字结果而言,没有区别。
但是,指令多于存储在目标寄存器中的实际结果:
正如 aix 所指出的那样,lea
不会根据添加的结果设置标记。这有时用于指令调度。
某些微架构(早期的Atom核心)也存在时序差异;具体来说,算术和地址生成单元之间的转发结果涉及到停顿,根据上下文使用add
或lea
可以消除这些(非常小的)停顿。