webentwicklung-frage-antwort-db.com.de

Wie kann ich den Assemblycode für ein C++ - Programm sehen?

Wie kann ich den Assemblycode für ein C++ - Programm sehen?

Was sind die beliebtesten Tools, um dies zu tun?

121
Geek

Fragen Sie den Compiler

Wenn Sie das Programm selbst erstellen, können Sie Ihren Compiler auffordern, den Assembly-Quellcode auszugeben. Für die meisten UNIX-Compiler verwenden Sie den Schalter _-S_.

  • Wenn Sie den Assembler GNU verwenden, führt das Kompilieren mit _-g -Wa,-alh_ zu einer vermischten Quelle, und Assembly on stdout (_-Wa_ fordert den Compilertreiber auf, Optionen an Assembler zu übergeben, _-al_ dreht in der Assembly-Auflistung und _-ah_ fügt die Auflistung "Quelle auf hoher Ebene" hinzu):

    _g++ -g -c -Wa,-alh foo.cc_

  • Verwenden Sie für Visual Studio /FAsc .

Schauen Sie in die Binärdatei

Wenn Sie binär kompiliert haben,

Verwenden Sie Ihren Debugger

Debugger könnten sich auch disassebly zeigen.

  • Verwenden Sie den Befehl disas in GDB.
  • oder das Disassembly-Fenster von Visual Studio unter Windows.
159

Kompilieren Sie in GCC/G ++ mit -S. Dadurch wird eine something.s-Datei mit dem Assembly-Code ausgegeben.

Bearbeiten: Wenn die Ausgabe in Intel-Syntax sein soll (was IMO ist, viel lesbarer und die meisten Assembly-Tutorials verwenden), kompilieren Sie mit -masm=intel.

31
Zifre

In Visual Studio

  1. einen Haltepunkt setzen
  2. führen Sie das Programm aus, bis es am Haltepunkt stoppt
  3. klicken Sie mit der rechten Maustaste auf den Quellcode und wählen Sie "show dissasembly".
21
Viktor Sehr

Für gcc/g ++

gcc -save-temps -fverbose-asm prog.c

Dies erzeugt prog.s mit einigen Kommentaren zu den in jeder asm-Zeile verwendeten Variablen:

    movl    $42, -24(%ebp)  #, readme
    movl    -16(%ebp), %eax # pid, pid
    movl    %eax, 4(%esp)   # pid,
    movl    $.LC0, (%esp)   #,
    call    printf  #
11
osgx

Viele Leute haben bereits erzählt, wie man mit einem bestimmten Compiler Assembly-Code ausgeben kann. Eine andere Lösung ist, eine Objektdatei zu kompilieren und sie mit einem Tool wie objdump , readelf (unter Unix) oder DUMPBIN ( link ) (unter Windows) ..__ abzuspeichern Dump einer ausführbaren Datei, aber es wird schwieriger, die Ausgabe zu lesen.

Dies hat den Vorteil, dass es mit jedem Compiler gleich funktioniert.

6

Der verwendete Debugger sollte über eine Assembly-Ansicht verfügen (Visual Studio, Borland IDE, gdb usw.). Wenn Sie keinen Debugger verwenden und lediglich wissen möchten, welche Assembly in einem Programm enthalten ist, können Sie einen Disassembler verwenden. Alternativ können Sie das Programm ausführen und es mit einem Debugger anhängen und von dort aus das Abbild erstellen. Verweise auf disassemblers für Informationen zu Optionen.

6
Adam Markowitz

Diese Seite arbeitet derzeit für mich (2017): https://godbolt.org/

5
Carlo Wood

Wie bereits erwähnt, ist der Debugger Ihrer Plattform ein guter Ausgangspunkt. Für den Presslufthammer aller Debugger und Disassembler lesen Sie IDA Pro.

Auf Unix/Linux-Plattformen (einschließlich Cygwin) können Sie objdump --disassemble <executable> verwenden.

5
Ori Pessach

Die meisten Compiler haben die Möglichkeit, eine Assembly-Liste auszugeben. Z.B. Mit VisualStudio können Sie Folgendes verwenden:

cl.exe /FAfile.asm file.c

Für eine bessere Lesbarkeit bieten die meisten Debugger jedoch eine Ansicht, die die Demontage mit der ursprünglichen Quelle verschachtelt. So können Sie Ihren Code zeilenweise mit der Ausgabe des Compilers vergleichen.

5
Nik

PE Explorer Disassembler für 32-Bit-PE-Dateien. IDA für andere.

4
Wylder

Sie können diese Site auch ausprobieren: http://Assembly.ynh.io/

Dort können Sie Ihren C- oder C++ - Code einfügen und eine blaue Taste drücken, um die Assembly-äquivalente Version anzuzeigen.

3
Gomes J. A.

In Visual Studio können Sie die Assembler-Liste für ein C++ - Projekt erstellen.

Gehen Sie zu den Projekteigenschaften, dann zu C++/Ausgabedateien und setzen Sie die Assembler-Ausgabeeinstellung und den ASM-Listenort auf einen Dateinamen.

2

Auf einem Intel Mac OS X 10.8 (Mountain Lion) funktionierte die -masm=intel-Direktive nicht. Wenn Sie jedoch Xcode installiert haben, sollte das Tool 'otool' installiert sein:

otool code.o -tV

Sie müssen den kompilierten Objektcode als Parameter angeben.

1
gibertoni

Wenn Sie ein Eclipse-Benutzer sind, können Sie die Ansicht Disassembly verwenden.

Die Disassembly-Ansicht zeigt das geladene Programm als Assembler Anweisungen zum Vergleich mit Quellcode gemischt. Die derzeit Die Ausführungszeile wird durch eine Pfeilmarkierung angezeigt und in der .__ hervorgehoben. Aussicht. In der Disassembly-Ansicht können Sie folgende Aufgaben ausführen:

  • Setzen Sie Haltepunkte zu Beginn einer beliebigen Assembler-Anweisung
  • Aktivieren und deaktivieren Sie Haltepunkte und legen Sie deren Eigenschaften fest
  • Gehen Sie die Demontageanweisungen Ihres Programms durch
  • Springen Sie zu bestimmten Anweisungen im Programm
0
Pieter