gpt4 book ai didi

gcc - 为什么 GCC 发出 "lea"而不是 "sub"进行减法?

转载 作者:行者123 更新时间:2023-12-02 17:00:57 24 4
gpt4 key购买 nike

我正在查看一些通过反汇编一些 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 

%edi - 1存储到%ebp中。 %edi 被保留以供将来使用。

关于gcc - 为什么 GCC 发出 "lea"而不是 "sub"进行减法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12683314/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com