Wie kann ich den Assemblycode für ein C ++ - Programm anzeigen?
Was sind die beliebtesten Tools, um dies zu tun?
c++
assembly
disassembly
Geek
quelle
quelle
Alt +8
Antworten:
Fragen Sie den Compiler
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
.Schauen Sie in die Binärdatei
Wenn Sie binär kompiliert haben,
objdump -d a.out
unter UNIX (funktioniert auch für Cygwin),dumpbin /DISASM foo.exe
unter Windows.Verwenden Sie Ihren Debugger
Debugger könnten auch disassebly zeigen.
disas
Befehl in GDB,quelle
Kompilieren Sie in GCC / G ++ mit
-S
. Dadurch wird einesomething.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
.quelle
-fverbose-asm
Option hinzuIn Visual Studio ;
quelle
Für gcc / g ++
Dadurch werden prog.s mit einigen Kommentaren zu Variablen generiert, die in jeder asm-Zeile verwendet werden:
quelle
Diese Seite arbeitet derzeit für mich (2017): https://godbolt.org/
quelle
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.
quelle
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 .
quelle
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>
.quelle
Die meisten Compiler haben die Möglichkeit, eine Baugruppenliste auszugeben. Mit VisualStudio können Sie beispielsweise Folgendes verwenden:
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.
quelle
PE Explorer Disassembler für 32-Bit-PE-Dateien. IDA für andere.
quelle
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.
quelle
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.
quelle
Unter Intel Mac OS X 10.8 (Mountain Lion)
-masm=intel
funktionierte die Anweisung nicht. Wenn Sie jedoch Xcode installiert haben, sollte das Tool 'otool' installiert sein:Sie müssen den kompilierten Objektcode als Parameter angeben.
quelle
Wenn Sie ein Eclipse-Benutzer sind, können Sie die Ansicht Disassembly verwenden .
quelle