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