首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在x86-32程序集中,"lea eax,[ebx + eax]“和"add eax,ebx”有什么区别?

在x86-32程序集中,"lea eax,[ebx + eax]“和"add eax,ebx”有什么区别?
EN

Stack Overflow用户
提问于 2010-11-30 17:21:50
回答 3查看 2.9K关注 0票数 4

GCC给我做了一些装配代码,里面有这样的声明:

代码语言:javascript
复制
lea eax, [ebx+eax]

(英特尔语法)只是好奇,那会有什么区别,和:

代码语言:javascript
复制
add eax, ebx

是吗?

eax和ebx包含函数的返回值:)

代码语言:javascript
复制
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]
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-11-30 17:41:02

您可以将结果放入EAX以外的另一个寄存器中,例如lea edx, eax + ebxadd做不到。

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

您还可以将某些(字大小)乘法操作与其结合起来,例如lea eax, ebp + eax * 8

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

票数 6
EN

Stack Overflow用户

发布于 2010-11-30 17:24:50

立即想到的一个不同之处是,lea不影响标志,而add影响标志。

如果不看到汇编代码的其余部分,就不可能知道这是否相关。它可能只是GCC代码生成器的一个伪制品(也就是说,它实际上可以为更一般的情况生成代码,或者仅仅使用lea作为一个更灵活的add)。

票数 11
EN

Stack Overflow用户

发布于 2010-11-30 17:42:45

就数值结果而言,没有差别。

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

正如

  1. aix所指出的那样,lea并不根据添加的结果设置标志。这有时对指令调度有用,purposes.
  2. There在一些微体系结构(早期原子核)上也有定时差异;具体来说,在算术单元和地址生成单元之间进行结果转发时会出现阻塞,并且根据上下文使用addlea可以消除这些(非常小的)阻塞。
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4316526

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档