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]发布于 2010-11-30 17:41:02
您可以将结果放入EAX以外的另一个寄存器中,例如lea edx, eax + ebx。add做不到。
lea也可以有额外的第三个操作数,例如lea eax, ebp + esi + 12,这使它成为add指令的一个更好的选择。
您还可以将某些(字大小)乘法操作与其结合起来,例如lea eax, ebp + eax * 8。
更不用说它更好地描述了意图:)
发布于 2010-11-30 17:24:50
立即想到的一个不同之处是,lea不影响标志,而add影响标志。
如果不看到汇编代码的其余部分,就不可能知道这是否相关。它可能只是GCC代码生成器的一个伪制品(也就是说,它实际上可以为更一般的情况生成代码,或者仅仅使用lea作为一个更灵活的add)。
发布于 2010-11-30 17:42:45
就数值结果而言,没有差别。
但是,一条指令比存储在目标寄存器中的实际结果更多:
正如
lea并不根据添加的结果设置标志。这有时对指令调度有用,purposes.add或lea可以消除这些(非常小的)阻塞。https://stackoverflow.com/questions/4316526
复制相似问题