4

我对 GCC 生成的汇编代码有疑问(-S 选项)。因为,我是汇编语言的新手,对它知之甚少,所以这个问题将非常原始。不过,我希望有人会回答:

假设,我有这个 C 代码:

main(){

    int x = 15; 

    int y = 6;

    int z = x - y;


    return 0;
}

如果我们查看汇编代码(尤其是对应于 int z = x - y 的部分),我们会看到:

主要的:

...
subl    $16, %esp
movl    $15, -4(%ebp)
movl    $6, -8(%ebp)
movl    -8(%ebp), %eax
movl    -4(%ebp), %edx
movl    %edx, %ecx
subl    %eax, %ecx
movl    %ecx, %eax
movl    %eax, -12(%ebp)
...

为什么 GCC 不生成像这样的东西,这样复制的东西就更少了。

主要的:

...
movl    $15, -4(%ebp)
movl    $6, -8(%ebp)
movl    -8(%ebp), %edx          
movl    -4(%ebp), %eax          
subl    %edx, %eax              
movl    %eax, -12(%ebp)
...

附言

Linux zion-5 2.6.32-21-generic #32-Ubuntu SMP Fri Apr 16 08:10:02 UTC 2010 i686 GNU/Linux gcc 版本 4.4.3 (Ubuntu 4.4.3-4ubuntu5)

4

1 回答 1

7

首先,正如 Mysticial 评论的那样,您应该打开一些优化。尝试将-O2(或-O3,或只是-O1)传递给gcc. 如果你想了解更多生成的汇编代码,也可以通过-fverbose-asm. 如果您想了解生成(或不生成)代码的原因-fdump-tree-all,请学习 GCC 内部结构(可能也通过并且-fdump-rtl-all会产生大量内部转储文件)。

MELT上的一些幻灯片 (MELT 是一种扩展 GCC 的领域特定语言)可能会有所帮助并提供其他参考。

当被要求时,您可能会对 GCC 可以为您提供的优化数量感到惊讶。默认情况下,GCC 不会优化。有一些你应该明确要求的优化(甚至不做-O3)。

最新版本的 GCC 可能比旧版本优化得更多。2021 年的当前 GCC 版本是GCC 11

PS。我不再在 MELT 上工作(2017 年放弃了它)。2021 年,另见BismonRefPerSysFrama-C

于 2012-09-08T10:16:35.207 回答