linux - 为什么 gcc 会生成冗长的汇编代码?

标签 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)
...

附言

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)

最佳答案

首先,正如 Mysticial 所说,您应该开启一些优化。尝试将 -O2(或 -O3,或只是 -O1)传递给 gcc。如果想进一步了解生成的汇编代码,还可以通过-fverbose-asm。如果您想了解生成(或不生成)代码的原因,请学习 GCC 内部原理(也许还通过 -fdump-tree-all-fdump- rtl-all 产生大量内部转储文件)。

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

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

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

附言。我不再从事 MELT 工作(2017 年放弃)。 2021 年,另见 Bismon , RefPerSys , Frama-C .

关于linux - 为什么 gcc 会生成冗长的汇编代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12329626/

相关文章:

c - fork 一个 child ,从控制台读取

linux - 如何构建具有自定义更改的 RPM 包

windows - 在 Windows 上安装 Rust

c - 仅使用指针横向打印数组(转置)

assembly - Donald Knuth 的 Mix 汇编语言中的算术运算

assembly - 如何将 IDA Pro 的 "see"外部参照设置为字符串?

linux - 嵌套 for 循环的问题

c - SIGALRM 实现

c - 与共享库链接

c - 堆栈指针从寄存器读取错误值