Wie kann ich den Assemblycode für ein C++ - Programm sehen?
Was sind die beliebtesten Tools, um dies zu tun?
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
.
Wenn Sie binär kompiliert haben,
objdump -d a.out
_ unter UNIX (funktioniert auch für cygwin),dumpbin /DISASM foo.exe
unter Windows.Debugger könnten sich auch disassebly zeigen.
disas
in GDB.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
.
In Visual Studio ;
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 #
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.
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.
Diese Seite arbeitet derzeit für mich (2017): https://godbolt.org/
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.
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.
PE Explorer Disassembler für 32-Bit-PE-Dateien. IDA für andere.
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.
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.
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.
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