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

PS

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

まず、Mystial がコメントしたように、いくつかの最適化を有効にする必要があります。-O2(または-O3、または単に-O1) を に渡してみてくださいgcc。生成されたアセンブリ コードをさらに理解したい場合は、-fverbose-asm. なぜコードが生成されるのか (または生成されないのか)を理解したい場合は、GCC の内部構造を学んでください (おそらくパスも通過-fdump-tree-all-fdump-rtl-all、大量の内部ダンプ ファイルが生成されます)。

MELTに関するいくつかのスライド (MELT は GCC を拡張するためのドメイン固有言語です) が役立つ可能性があり、他の参考資料が提供されます。

求められたときに、GCC が提供できる最適化の量に驚くかもしれません。デフォルトでは、GCC は最適化しません。明示的に要求する必要がある最適化がいくつかあります ( でさえ実行されません-O3)。

GCC の最近のバージョンは、おそらく古いバージョンよりも最適化されています。2021 年の現在の GCC バージョンはGCC 11です。

PS。私はもう MELT に取り組んでいません (2017 年に放棄しました)。2021 年には、 BismonRefPerSys、 Frama -Cも参照してください。

于 2012-09-08T10:16:35.207 に答える