C++プログラムのアセンブリコードを表示するにはどうすればよいですか?
これを行うための一般的なツールは何ですか?
プログラムを自分でビルドする場合は、アセンブリソースを出力するようコンパイラーに依頼できます。ほとんどのUNIXコンパイラでは、-S
スイッチ。
GNUアセンブラーを使用している場合、-g -Wa,-alh
は、stdoutにソースとアセンブリを混在させます(-Wa
は、コンパイラー・ドライバーにオプションをアセンブラーに渡すよう要求します、-al
はアセンブリリストをオンにし、-ah
「高レベルのソース」リストを追加)
g++ -g -c -Wa,-alh foo.cc
Visual Studioの場合は、 /FAsc
。
バイナリをコンパイルしている場合、
objdump -d a.out
UNIXの場合(cygwinでも機能します)、dumpbin /DISASM foo.exe
Windowsの場合。デバッガーも逆に表示される可能性があります。
disas
コマンドを使用し、GCC/G ++では、-S
を使用してコンパイルします。これは、アセンブリコードを含むsomething.s
ファイルを出力します。
編集:出力をIntel構文(IMO、はるかに読みやすく、ほとんどのアセンブリチュートリアルで使用)にしたい場合は、-masm=intel
でコンパイルします。
Visual Studioの場合;
Gcc/g ++の場合
gcc -save-temps -fverbose-asm prog.c
これにより、すべてのasm行で使用される変数に関するコメントを含むprog.sが生成されます。
movl $42, -24(%ebp) #, readme
movl -16(%ebp), %eax # pid, pid
movl %eax, 4(%esp) # pid,
movl $.LC0, (%esp) #,
call printf #
このサイトは現在私のために働いています(2017): https://godbolt.org/
使用しているデバッガには、アセンブリビュー(Visual Studio、Borland IDE、gdbなど)が必要です。デバッガを使用しておらず、プログラム内のアセンブリを確認するだけの場合は、逆アセンブラを使用するか、プログラムを実行してデバッガでアタッチし、そこからダンプを実行できます。オプションの詳細については、 逆アセンブラ への参照を参照してください。
他の誰かが言ったように、プラットフォームのデバッガーは良い出発点です。すべてのデバッガーと逆アセンブラーの大ハンマーについては、 IDA Pro。 をご覧ください。
Unix/Linuxプラットフォーム(Cygwinを含む)では、objdump --disassemble <executable>
。
ほとんどのコンパイラには、アセンブリリストを出力するオプションがあります。例えば。 VisualStudioでは、次のようなものを使用できます。
cl.exe /FAfile.asm file.c
しかし、読みやすくするために、ほとんどのデバッガーは、逆アセンブリを元のソースとインターリーブするビューを提供するため、コードをコンパイラーの出力と1行ずつ比較できます。
PE Explorer Disassembler 32ビットPEファイルの場合。他の人のためのIDA。
このサイトを試すこともできます: http://Assembly.ynh.io/
そこで、CまたはC++コードを貼り付け、青いボタンを押して、アセンブリの同等バージョンを確認できます。
Visual Studioでは、C++プロジェクトのアセンブラリストを生成できます。
プロジェクトのプロパティに移動してから、C++ /出力ファイルに移動し、アセンブラ出力設定とASMリストの場所をファイル名に設定します。
Intel Mac OS X 10.8(Mountain Lion)では、-masm=intel
ディレクティブは機能しませんでした。ただし、 Xcode がインストールされている場合は、「otool」という名前のツールがインストールされているはずです。
otool code.o -tV
コンパイル済みオブジェクトコードをパラメーターとして提供する必要があります。
Eclipseユーザーの場合、 逆アセンブリビュー を使用できます。
逆アセンブリビューには、ロードされたプログラムが、比較のためにソースコードと混合されたアセンブラー命令として表示されます。現在実行中の行は矢印マーカーで示され、ビューで強調表示されます。 [逆アセンブリ]ビューで次のタスクを実行できます。
- アセンブラー命令の先頭にブレークポイントを設定します
- ブレークポイントの有効化と無効化、およびそれらのプロパティの設定
- プログラムの逆アセンブリ手順を実行します
- プログラムの特定の指示にジャンプします