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

发布于 2022-09-06 21:25:33 字数 589 浏览 18 评论 0

按照书上说的编译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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

夜司空 2022-09-13 21:25:33

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

比如:

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

这条指令等同于%eax * 5

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

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

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文