92

アセンブリ言語を学ぼうとしています。ファイルを分解する方法を検索して見つけました.cが、プログラムの最適化されたバージョンが生成されると思います。Cファイルに対応する正確なアセンブリコードを確認できる方法はありますか。

4

7 に答える 7

125

gccオプション-Oを使用すると、さまざまなレベルの最適化が可能になります。-O0それらを無効にし、-Sアセンブリを出力するために使用します。-O3最高レベルの最適化です。

gcc 4.8以降、最適化レベル-Ogが利用可能になりました。これにより、デバッグに干渉しない最適化が可能になり、標準の編集-コンパイル-デバッグサイクルのデフォルトとして推奨されます。

アセンブリの方言をintelまたはattuseまたはに変更し-masm=intelます-masm=att

を使用して、特定の最適化を手動で有効にすることもできます-fname

詳細については、gccのマニュアルを参照してください。

于 2011-04-23T18:01:08.993 に答える
12

gccの場合、コンパイラに渡された-O1 -O2または-O3オプションを省略したい場合、またはすでにそれらを持っている場合は、 -O0オプションを追加して再度オフにすることができます。デバッガーでcソースと逆アセンブルされたマシンコードを確認できるように、デバッグ用に-gを追加すると役立つ場合があります。

参照:http ://sourceware.org/gdb/onlinedocs/gdb/Optimized-Code.html

于 2011-04-23T18:02:53.013 に答える
10

コピーの省略なしでテストし、コンストラクター/オペレーターのコピー/移動を実際に確認するには、「-fno-elide-constructors」を追加します。

最適化(-O0)がない場合でも、GCCとClangはコピーの省略を実行します。これは、場合によってはコピー/移動コンストラクターをスキップする効果があります。コピーの省略の詳細については、この質問を参照してください。

ただし、Clang 3.4では、バグ(コンストラクターを呼び出さない無効な一時オブジェクト)がトリガーされます。これは3.5で修正されています。

于 2014-06-24T10:58:24.680 に答える
9

コマンドラインオプション-O0(-[capital o] [zero])を使用して、最適化を無効に-Sし、アセンブリファイルを取得します。その他のgccコマンドラインオプションについては、こちらをご覧ください。

于 2011-04-23T18:01:56.913 に答える
5

#pragmaGCCPush_optionsを使用して内部的に最適化を制御することもできます

#pragma GCC push_options
/* #pragma GCC optimize ("unroll-loops") */     

.... code here .....

#pragma GCC pop_options
于 2019-06-25T05:34:44.827 に答える
4

ずっと前ですが、まだ必要です。

info - https://gcc.gnu.org/onlinedocs/gcc/Optimize-Options.html
list - gcc -Q --help=optimizers test.c | grep enabled
disable as many as you like with:
  gcc **-fno-web** -Q --help=optimizers test.c | grep enabled
于 2018-12-18T12:04:07.350 に答える
3

gccコマンドラインで-O0を渡すと、最適化を無効にできます。

たとえば、.Cファイルを.Sファイル呼び出しに変換するには:

gcc -O0 -S test.c

于 2011-04-23T18:02:23.120 に答える