Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly “与”的区别是什么;lea eax,[ebx和"eax]";及;添加eax、ebx“;在x86-32汇编中?_Assembly_X86 - Fatal编程技术网

Assembly “与”的区别是什么;lea eax,[ebx和"eax]";及;添加eax、ebx“;在x86-32汇编中?

Assembly “与”的区别是什么;lea eax,[ebx和"eax]";及;添加eax、ebx“;在x86-32汇编中?,assembly,x86,Assembly,X86,GCC为我编写了一些汇编代码,其中包含以下语句: lea eax, [ebx+eax] (英特尔语法) 我只是好奇,这和: add eax, ebx 是吗 eax和ebx包含函数的返回值:) 一个立即浮现在脑海中的区别是lea不会影响标志,而add会影响标志 如果看不到汇编代码的其余部分,就无法确定这是否有任何相关性。它可能只是GCC代码生成器的一个人工制品(即,它实际上可以为更一般的情况生成代码,或者只是使用lea作为更灵活的add)您可以将结果放入EAX以外的另一个寄存器,例如lea-e

GCC为我编写了一些汇编代码,其中包含以下语句:

lea eax, [ebx+eax]
(英特尔语法) 我只是好奇,这和:

add eax, ebx
是吗

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


一个立即浮现在脑海中的区别是
lea
不会影响标志,而
add
会影响标志


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

您可以将结果放入EAX以外的另一个寄存器,例如
lea-edx,EAX+ebx
<代码>添加无法执行此操作

lea
还可以有一个额外的第三个操作数,例如
leaeax、ebp+esi+12
,这使得它成为
add
指令的一个更方便的替代方法

您还可以将某些(字大小)乘法运算与之组合,例如
leaeax、ebp+eax*8


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

就数值结果而言,没有区别

但是,与存储在目标寄存器中的实际结果相比,指令有更多的含义:

  • 正如aix指出的,
    lea
    不会根据添加的结果设置标志。这对于指令调度目的偶尔有用

  • 在某些微结构(早期原子核)上也存在时序差异;具体而言,算术和地址生成单元之间的转发结果涉及暂停,根据上下文使用
    add
    lea
    可以消除这些(非常小的)暂停


  • 在一些较旧的英特尔处理器中,lea可能比add慢得多。不确定目前的收成,但怀疑情况可能不再如此;在AMD的Athlon和更高版本中,这可能是有益的-事实上这是一种寻找另一个并行操作的方法,因为
    LEA
    由寻址引擎而不是ALU处理。@Brian:是的,这两个操作在我所知的所有当前英特尔处理器上都是单周期操作(尽管在某些处理器上,可以一次发出更多的
    add
    指令)。@FrankH:
    LEA
    在英特尔的ALU上运行(Haswell:p1/p5表示简单,p1仅表示三分量或rip相对。p0仅表示PII/PIII)和AMD CPU(推土机系列中的EX0/1).我甚至检查了P4,它在与
    ADD
    相同的ALU端口上运行
    LEA
    。不过,通过Nano2/3000在其存储地址端口上运行
    LEA
    ,而不是在I1/I2 integer ALU上运行
    ADD
    。说LEA“对其他端口有额外的延迟”,这听起来就像Stephen所说的Atom(它也在AGU1上运行LEA,而不是ALU0/1)。不过,Silvermont和其他OOO芯片一样;在ALU上运行LEA。当然,是的。我不是在批评你的答案,只是FrankH的回答(以及答案)。Atom和Silvermont是非常不同的体系结构。有趣的事实是:K8和K10运行(复杂)你的第2点有助于理解Agner Fog表格中关于AGU和ALU之间需要更长时间才能转发结果的注释。(不过,我甚至没有读过他的MicroTech pdf中的Atom部分,这里可能提到过。)@CiroSantilli的可能重复包子露宪六四事件法轮功: 不幸的是,这个问题的答案并不十分准确。投票率最高/接受率最高的答案声称,
    lea
    在AGU上运行。为了让Atom以这种方式工作,(并且需要它的输入提前准备好,但在管道中也会提前生成输出,或者诸如此类),但包括Silvermont在内的无序CPU不是这样的。我想我应该回答这个问题。@PeterCordes谢谢你提供的信息。我建议你回答这个问题,如果没有一个答案是正确的,就对错误的答案进行评论(看起来你已经这样做了),并对问题进行评论,希望OP会改变接受(不太可能).我不认为这会影响这种情况下的重复方向:那一个只是有更多的投票权。由于“创造正义”效应,这也是你获得代表的一个好机会:-)
    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]