11

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

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

没有优化:

83 e8 01     subl $0x1, %eax 

有优化

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

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

任何帮助,将不胜感激。

4

2 回答 2

15

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

但如果我不得不猜测,那是因为它leal允许在不破坏源寄存器的情况下进行减法。

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


第一个例子:

83 e8 01     subl $0x1, %eax 

覆盖%eax从而破坏原始值。

第二个例子:

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

存储%edi - 1%ebp. %edi被保留以备将来使用。

于 2012-10-02T01:24:38.930 回答
11

还要记住,lea这不会影响标志,而sub会影响。因此,如果随后的指令不依赖于通过减法更新的标志,那么更新标志也会更有效。

于 2012-10-02T04:12:27.820 回答