汇编语言中leal指令是什么指令?

按照书上说的编译c代码 结果本来应该是pushl movl addl指令的地方 被一条leal指令完全替代了?
书上说gcc更新地很快 不可能完全一样 但是leal指令是怎么运作的?
另外 为什么这些指令旁边都带着个l? 以及 .seh_endprologue 这个代码又是什么?
书上的代码
//code.c
int accum=0;
int sum(int x,int y)
{

int t=x+y;
accum+=t;
return t;

}

dos窗口里用gcc编译后形成的s文件的一部分

sum:

.seh_endprologue
leal    (%rcx,%rdx), %eax
addl    %eax, accum(%rip)
ret

书上说汇编代码应该是这样
sum:

pushl   %ebp
movl    %esp,%ebp
movl    12(%ebp),%eax
addl    8(%ebp),%eax
addl    %eax,accum
popl    %ebp
ret
阅读 10.1k
1 个回答

leal是地址装载运算符,原本是专门用来取地址的(类似于C语言的取地址运算&),但是后来经常被用作优化作用。原因是它可以用一条指令做到原本需要数条指令才能实现的事情。

比如:

leal (%eax, %eax, 4), %eax

这条指令等同于%eax * 5

在你的程序里面,原本需要两条指令的t = x + y,用leal只需一条指令即可。

至于点号开头的并不是实际的指令,而是给汇编器看的,可以不用理会。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进