web-dev-qa-db-ja.com

C ++プログラムのアセンブリコードを表示するにはどうすればよいですか?

C++プログラムのアセンブリコードを表示するにはどうすればよいですか?

これを行うための一般的なツールは何ですか?

126
Geek

コンパイラーに尋ねる

プログラムを自分でビルドする場合は、アセンブリソースを出力するようコンパイラーに依頼できます。ほとんどの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の場合。

デバッガーを使用する

デバッガーも逆に表示される可能性があります。

159

GCC/G ++では、-Sを使用してコンパイルします。これは、アセンブリコードを含むsomething.sファイルを出力します。

編集:出力をIntel構文(IMO、はるかに読みやすく、ほとんどのアセンブリチュートリアルで使用)にしたい場合は、-masm=intelでコンパイルします。

33
Zifre

Visual Studioの場合;

  1. ブレークポイントを設定する
  2. ブレークポイントで停止するまでプログラムを実行します
  3. ソースコードを右クリックして、「dissasemblyを表示」を選択します
22
Viktor Sehr

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  #
12
osgx

このサイトは現在私のために働いています(2017): https://godbolt.org/

8
Carlo Wood

多くの人が、特定のコンパイラでアセンブリコードを出力する方法をすでに教えています。別の解決策は、オブジェクトファイルをコンパイルし、 objdumpreadelf (Unixの場合)またはDUMPBIN( link )(onのようなツールでダンプすることですWindows)。実行可能ファイルをダンプすることもできますが、出力を読むことはより困難になります。

これには、どのコンパイラでも同じように機能するという利点があります。

6

使用しているデバッガには、アセンブリビュー(Visual Studio、Borland IDE、gdbなど)が必要です。デバッガを使用しておらず、プログラム内のアセンブリを確認するだけの場合は、逆アセンブラを使用するか、プログラムを実行してデバッガでアタッチし、そこからダンプを実行できます。オプションの詳細については、 逆アセンブラ への参照を参照してください。

6
Adam Markowitz

他の誰かが言ったように、プラットフォームのデバッガーは良い出発点です。すべてのデバッガーと逆アセンブラーの大ハンマーについては、 IDA Pro。 をご覧ください。

Unix/Linuxプラットフォーム(Cygwinを含む)では、objdump --disassemble <executable>

5
Ori Pessach

ほとんどのコンパイラには、アセンブリリストを出力するオプションがあります。例えば。 VisualStudioでは、次のようなものを使用できます。

cl.exe /FAfile.asm file.c

しかし、読みやすくするために、ほとんどのデバッガーは、逆アセンブリを元のソースとインターリーブするビューを提供するため、コードをコンパイラーの出力と1行ずつ比較できます。

5
Nik

PE Explorer Disassembler 32ビットPEファイルの場合。他の人のためのIDA。

4
Wylder

このサイトを試すこともできます: http://Assembly.ynh.io/

そこで、CまたはC++コードを貼り付け、青いボタンを押して、アセンブリの同等バージョンを確認できます。

3
Gomes J. A.

Visual Studioでは、C++プロジェクトのアセンブラリストを生成できます。

プロジェクトのプロパティに移動してから、C++ /出力ファイルに移動し、アセンブラ出力設定とASMリストの場所をファイル名に設定します。

2

Intel Mac OS X 10.8(Mountain Lion)では、-masm=intelディレクティブは機能しませんでした。ただし、 Xcode がインストールされている場合は、「otool」という名前のツールがインストールされているはずです。

otool code.o -tV

コンパイル済みオブジェクトコードをパラメーターとして提供する必要があります。

1
gibertoni

Eclipseユーザーの場合、 逆アセンブリビュー を使用できます。

逆アセンブリビューには、ロードされたプログラムが、比較のためにソースコードと混合されたアセンブラー命令として表示されます。現在実行中の行は矢印マーカーで示され、ビューで強調表示されます。 [逆アセンブリ]ビューで次のタスクを実行できます。

  • アセンブラー命令の先頭にブレークポイントを設定します
  • ブレークポイントの有効化と無効化、およびそれらのプロパティの設定
  • プログラムの逆アセンブリ手順を実行します
  • プログラムの特定の指示にジャンプします
0
Pieter