アセンブリ言語を学ぼうとしています。ファイルを分解する方法を検索して見つけました.c
が、プログラムの最適化されたバージョンが生成されると思います。Cファイルに対応する正確なアセンブリコードを確認できる方法はありますか。
7 に答える
gccオプション-O
を使用すると、さまざまなレベルの最適化が可能になります。-O0
それらを無効にし、-S
アセンブリを出力するために使用します。-O3
最高レベルの最適化です。
gcc 4.8以降、最適化レベル-Og
が利用可能になりました。これにより、デバッグに干渉しない最適化が可能になり、標準の編集-コンパイル-デバッグサイクルのデフォルトとして推奨されます。
アセンブリの方言をintelまたはattuseまたはに変更し-masm=intel
ます-masm=att
。
を使用して、特定の最適化を手動で有効にすることもできます-fname
。
詳細については、gccのマニュアルを参照してください。
gccの場合、コンパイラに渡された-O1 -O2または-O3オプションを省略したい場合、またはすでにそれらを持っている場合は、 -O0オプションを追加して再度オフにすることができます。デバッガーでcソースと逆アセンブルされたマシンコードを確認できるように、デバッグ用に-gを追加すると役立つ場合があります。
参照:http ://sourceware.org/gdb/onlinedocs/gdb/Optimized-Code.html
コピーの省略なしでテストし、コンストラクター/オペレーターのコピー/移動を実際に確認するには、「-fno-elide-constructors」を追加します。
最適化(-O0)がない場合でも、GCCとClangはコピーの省略を実行します。これは、場合によってはコピー/移動コンストラクターをスキップする効果があります。コピーの省略の詳細については、この質問を参照してください。
ただし、Clang 3.4では、バグ(コンストラクターを呼び出さない無効な一時オブジェクト)がトリガーされます。これは3.5で修正されています。
コマンドラインオプション-O0
(-[capital o] [zero])を使用して、最適化を無効に-S
し、アセンブリファイルを取得します。その他のgccコマンドラインオプションについては、こちらをご覧ください。
#pragmaGCCPush_optionsを使用して内部的に最適化を制御することもできます
#pragma GCC push_options
/* #pragma GCC optimize ("unroll-loops") */
.... code here .....
#pragma GCC pop_options
ずっと前ですが、まだ必要です。
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
gccコマンドラインで-O0を渡すと、最適化を無効にできます。
たとえば、.Cファイルを.Sファイル呼び出しに変換するには:
gcc -O0 -S test.c