Wie kann ich den Assemblycode für ein C ++ - Programm anzeigen?
Was sind die beliebtesten Tools, um dies zu tun?
Wie kann ich den Assemblycode für ein C ++ - Programm anzeigen?
Was sind die beliebtesten Tools, um dies zu tun?
Antworten:
Wenn Sie das Programm selbst erstellen, können Sie Ihren Compiler bitten, die Assembly-Quelle auszugeben. Verwenden Sie für die meisten UNIX-Compiler den -S
Schalter.
Wenn Sie den GNU-Assembler verwenden, wird beim Kompilieren mit -g -Wa,-alh
auf stdout eine gemischte Quelle und Assembly gemischt ( -Wa
fordert den Compilertreiber auf, Optionen an den Assembler zu übergeben, die -al
Assembly-Liste zu aktivieren und -ah
die Liste "High-Level-Quelle" hinzuzufügen):
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 auch disassebly zeigen.
disas
Befehl in GDB,Kompilieren Sie in GCC / G ++ mit -S
. Dadurch wird eine something.s
Datei mit dem Assemblycode ausgegeben .
Bearbeiten: Wenn die Ausgabe in Intel-Syntax erfolgen soll (IMO ist viel besser lesbar und wird in den meisten Assembly-Tutorials verwendet), kompilieren Sie mit -masm=intel
.
-fverbose-asm
Option hinzu
In Visual Studio ;
Für gcc / g ++
gcc -save-temps -fverbose-asm prog.c
Dadurch werden prog.s mit einigen Kommentaren zu Variablen generiert, die in jeder asm-Zeile verwendet werden:
movl $42, -24(%ebp) #, readme
movl -16(%ebp), %eax # pid, pid
movl %eax, 4(%esp) # pid,
movl $.LC0, (%esp) #,
call printf #
Diese Seite arbeitet derzeit für mich (2017): https://godbolt.org/
Viele Leute haben bereits erklärt, wie Assembler-Code mit einem bestimmten Compiler ausgegeben werden soll. Eine andere Lösung besteht darin, eine Objektdatei zu kompilieren und mit einem Tool wie objdump , readelf (unter Unix) oder DUMPBIN ( link ) (unter Windows) zu sichern . Sie können auch eine ausführbare Datei sichern, die Ausgabe ist jedoch schwieriger zu lesen.
Dies hat den Vorteil, dass Sie mit jedem Compiler genauso arbeiten können.
Unabhängig davon, welchen Debugger Sie verwenden, sollte eine Assemblyansicht vorhanden sein (Visual Studio, Borland IDE, GDB usw.). Wenn Sie keinen Debugger verwenden und lediglich sehen möchten, welche Assembly in einem Programm enthalten ist, können Sie einen Disassembler verwenden oder alternativ das Programm ausführen und mit einem Debugger daran anhängen und von dort aus den Speicherauszug ausführen. Informationen zu Optionen finden Sie unter Verweise auf Disassembler .
Wie bereits erwähnt, ist der Debugger Ihrer Plattform ein guter Ausgangspunkt. Werfen Sie einen Blick auf IDA Pro , um den Presslufthammer aller Debugger und Disassembler zu finden .
Auf Unix / Linux-Plattformen (einschließlich Cygwin) können Sie verwenden objdump --disassemble <executable>
.
Die meisten Compiler haben die Möglichkeit, eine Baugruppenliste auszugeben. Mit VisualStudio können Sie beispielsweise Folgendes verwenden:
cl.exe /FAfile.asm file.c
Für eine optimale Lesbarkeit bieten die meisten Debugger jedoch eine Ansicht, die die Demontage mit der Originalquelle verschachtelt, sodass Sie Ihren Code zeilenweise mit der Ausgabe des Compilers vergleichen können.
PE Explorer Disassembler für 32-Bit-PE-Dateien. IDA für andere.
Sie können auch diese Site 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 generieren.
Gehen Sie zu den Projekteigenschaften, dann zu C ++ / Ausgabedateien und setzen Sie die Assembler-Ausgabeeinstellung und den Speicherort der ASM-Liste auf einen Dateinamen.
Wenn Sie ein Eclipse-Benutzer sind, können Sie die Ansicht Disassembly verwenden .
Die Disassembly-Ansicht zeigt das geladene Programm als Assembler-Anweisungen, die zum Vergleich mit dem Quellcode gemischt wurden. Die aktuell ausgeführte Zeile wird durch eine Pfeilmarkierung angezeigt und in der Ansicht hervorgehoben. In der Demontageansicht können Sie folgende Aufgaben ausführen:
- Setzen Sie Haltepunkte zu Beginn einer Assembler-Anweisung
- Aktivieren und deaktivieren Sie Haltepunkte und legen Sie deren Eigenschaften fest
- Führen Sie die Anweisungen zur Demontage Ihres Programms durch
- Wechseln Sie zu bestimmten Anweisungen im Programm
Alt +8