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

Jar*_*ash 3 linux assembly gcc

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

假设,我有这个C代码:

main(){

    int x = 15; 

    int y = 6;

    int z = x - y;


    return 0;
}
Run Code Online (Sandbox Code Playgroud)

如果我们查看汇编代码(特别是对应于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)
...
Run Code Online (Sandbox Code Playgroud)

为什么GCC不能生成类似这样的东西,这样可以减少复制内容.

主要:

...
movl    $15, -4(%ebp)
movl    $6, -8(%ebp)
movl    -8(%ebp), %edx          
movl    -4(%ebp), %eax          
subl    %edx, %eax              
movl    %eax, -12(%ebp)
...
Run Code Online (Sandbox Code Playgroud)

PS

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

Bas*_*tch 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年放弃了它)

  • 让我想起如何计算向量的范数.当看到gcc如何优化它时,我得到了以下结果(使用常量输入): - 01:函数内联,-O2:循环也展开,-O3:常量向量的范数静态地在代码中,没有计算一点都不 (虽然可能混合-O1和-O2) (2认同)