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
(cygwin でも機能)、dumpbin /DISASM foo.exe
Windows で。デバッガーは、逆アセンブルを表示することもできます。
disas
GDB でコマンドを使用します。Intel 構文を好む場合にset disassembly-flavor intel
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 など)。デバッガーを使用しておらず、プログラム内のアセンブリを確認したいだけの場合は、逆アセンブラーを使用するか、プログラムを実行してデバッガーでアタッチし、そこからダンプを実行できます。オプションについては、逆アセンブラのリファレンスを参照してください。
ほとんどのコンパイラには、アセンブリ リストを出力するオプションがあります。たとえば、VisualStudio では次のようなものを使用できます。
cl.exe /FAfile.asm file.c
ただし、読みやすくするために、ほとんどのデバッガーは元のソースと逆アセンブリをインターリーブするビューを提供するため、コードをコンパイラーの出力と 1 行ずつ比較できます。
他の誰かが述べたように、プラットフォームのデバッガーは良い出発点です。すべてのデバッガーと逆アセンブラーのジャックハンマーについては、IDA Pro をご覧ください。
Unix/Linux プラットフォーム (Cygwin を含む) では、objdump --disassemble <executable>
.
32 ビット PE ファイル用のPE Explorer 逆アセンブラー。他の人のための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 ユーザーの場合は、逆アセンブリ ビューを使用できます。
[逆アセンブリ] ビューには、ロードされたプログラムが、比較のためにソース コードと混合されたアセンブラ命令として表示されます。現在実行中の行は矢印マーカーで示され、ビューで強調表示されます。逆アセンブリ ビューでは、次のタスクを実行できます。
- アセンブラ命令の先頭にブレークポイントを設定する
- ブレークポイントの有効化と無効化、およびそれらのプロパティの設定
- プログラムの逆アセンブル手順を実行する
- プログラム内の特定の命令にジャンプする