为什么gcc会生成详细的汇编代码?

时间:2012-09-08 09:34:37

标签: linux gcc assembly

我对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)
...

P.S。

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)

1 个答案:

答案 0 :(得分:5)

首先,正如Mysticial评论的那样,你应该开启一些优化。尝试将-O2(或-O3-O1)传递给gcc。如果您想了解更多生成的汇编代码,也可以传递-fverbose-asm。如果您想了解为什么生成(或不生成)代码,请学习GCC内部(也许也传递-fdump-tree-all-fdump-rtl-all,这会生成大量内部转储文件)。

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

当被要求时,GCC可以给你的优化量可能会让你感到惊讶。默认情况下,GCC不会优化。您应该明确要求进行一些优化(甚至没有在-O3完成)。

最新版本的GCC可能比旧版本更优化。目前的GCC版本是4.7

PS。我不再在MELT上工作了(2017年放弃了它)