汇编语言中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
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
leal
是地址装载运算符,原本是专门用来取地址的(类似于C语言的取地址运算&
),但是后来经常被用作优化作用。原因是它可以用一条指令做到原本需要数条指令才能实现的事情。比如:
这条指令等同于
%eax * 5
。在你的程序里面,原本需要两条指令的
t = x + y
,用leal
只需一条指令即可。至于点号开头的并不是实际的指令,而是给汇编器看的,可以不用理会。