为什么 GCC 发出“lea”而不是“sub”来进行减法?

2023-12-20

我正在查看一些通过反汇编一些 C 程序生成的程序集,我对经常重复看到的单个优化感到困惑。

当我没有对 GCC 编译器进行优化时,使用subl减法指令,但是当我打开优化时(-O3准确地说)编译器使用leal指令而不是减法,示例如下:

没有优化:

83 e8 01     subl $0x1, %eax 

有优化

8d 6f ff     leal -0x1(%edi), %ebp 

这两条指令都是 3 个字节长,所以我在这里没有看到优化。有人可以帮助我并尝试解释编译器的选择吗?

任何帮助,将不胜感激。


如果没有看到产生此结果的原始 C 代码,很难判断。

但如果我必须猜测的话 那是因为leal允许在不破坏源寄存器的情况下异地进行减法。

这可以节省额外的寄存器移动。


第一个例子:

83 e8 01     subl $0x1, %eax 

覆盖%eax从而破坏了原有的价值。

第二个例子:

8d 6f ff     leal -0x1(%edi), %ebp 

stores %edi - 1 into %ebp. %edi被保存以供将来使用。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么 GCC 发出“lea”而不是“sub”来进行减法? 的相关文章

随机推荐