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


回答:


167

コンパイラに尋ねる

プログラムを自分でビルドする場合は、コンパイラにアセンブリソースを出力するように要求できます。ほとんどのUNIXコンパイラでは、-Sスイッチを使用します。

  • GNUアセンブラを使用している場合、でコンパイルする-g -Wa,-alhと、ソースとアセンブリが混在してstdoutに表示されます(-Waコンパイラドライバにオプションをアセンブラに渡すように要求し-al、アセンブリリストをオンにして、-ah「高レベルソース」リストを追加します)。

    g++ -g -c -Wa,-alh foo.cc

  • Visual Studioの場合は、を使用します/FAsc

バイナリをのぞく

バイナリをコンパイルした場合、

デバッガーを使用する

デバッガーは逆アセンブルすることもできます。


35

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

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


5
-fverbose-asmオプションも追加
osgx

23

Visual Studioでは

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

14

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  #


6

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

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


6

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


5

誰かが述べたように、あなたのプラットフォームのデバッガーは良い出発点です。すべてのデバッガーと逆アセンブラーの削岩機については、IDA Proご覧ください

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


コンパイラーにアセンブラーを生成させるオプション(gcc -S、または以下のVS / FAオプションなど)がある場合は、逆アセンブリよりも望ましい方法です。より象徴的です。
マルコファンデフォールト

確かに、ソースがあれば。
Ori Pessach、2009年

2
ちなみに、IDA Proがどれだけのシンボル情報を導き出せるかは驚くでしょう。
Ori Pessach、2009年

5

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

cl.exe /FAfile.asm file.c

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



3

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

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


参考

ええ、2015年には問題なく動作していましたが、突然停止しました。その後ctoassembly.comが登場しましたが、それはCのごく一部のサブセットでしか機能しませんでした。同じことが起こりました。もうロードしません。残念な。
Gomes JA

2

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

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


1

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

otool code.o -tV

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


0

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

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

  • アセンブラー命令の開始時にブレークポイントを設定する
  • ブレークポイントを有効および無効にし、それらのプロパティを設定します
  • プログラムの分解手順をステップ実行
  • プログラム内の特定の手順にジャンプします

もう少し詳しく説明してもらえますか?
Peter Mortensen

MSVCでデバッグするときにアセンブリ表示もあります
phuclv

現在、機能しているEclipse C ++開発環境はありませんが、公式ドキュメントは次のとおり
Pieter
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.