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

133

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

Was sind die beliebtesten Tools, um dies zu tun?

Geek
quelle
Microsoft Visual C ++ Express hat gerade einen Haltepunkt gesetzt undAlt +8
jyz
Mögliches Duplikat: stackoverflow.com/questions/137038/…
legends2k

Antworten:

167

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 -SSchalter.

  • Wenn Sie den GNU-Assembler verwenden, wird beim Kompilieren mit -g -Wa,-alhauf stdout eine gemischte Quelle und Assembly gemischt ( -Wafordert den Compilertreiber auf, Optionen an den Assembler zu übergeben, die -alAssembly-Liste zu aktivieren und -ahdie 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,

Verwenden Sie Ihren Debugger

Debugger könnten auch disassebly zeigen.

  • Verwenden disasBefehl in GDB,
  • oder das Demontagefenster von Visual Studio unter Windows.
Angestellt Russisch
quelle
35

Kompilieren Sie in GCC / G ++ mit -S. Dadurch wird eine something.sDatei 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.

Zifre
quelle
5
füge auch -fverbose-asmOption hinzu
osgx
23

In Visual Studio ;

  1. Setzen Sie einen Haltepunkt
  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 "Dissasembly anzeigen".
Viktor Sehr
quelle
14

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  #
osgx
quelle
6

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.

Bastien Léonard
quelle
6

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 .

Adam Markowitz
quelle
5

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>.

Ori Pessach
quelle
Wenn es eine Option gibt, mit der der Compiler den Assembler generiert (z. B. gcc -S oder die unten stehende VS / FA-Option), ist dies der Demontage vorzuziehen. Es ist symbolischer.
Marco van de Voort
Sicher, wenn Sie die Quelle haben.
Ori Pessach
2
Sie werden übrigens überrascht sein, wie viele Symbolinformationen von IDA Pro abgeleitet werden können.
Ori Pessach
5

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.

Nik
quelle
3

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.

Gomes JA
quelle
Zu
Ihrer Information, Fehler
Ja, 2015 hat es gut funktioniert, dann hat es plötzlich aufgehört. Dann kam ctoassembly.com, aber es funktionierte nur für eine kleine Teilmenge von C. Das gleiche passierte: nicht mehr geladen. Schade.
Gomes JA
2

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.

Cătălin Pitiș
quelle
1

Unter Intel Mac OS X 10.8 (Mountain Lion) -masm=intelfunktionierte die Anweisung 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.

gibertoni
quelle
0

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
Pieter
quelle
Können Sie etwas näher darauf eingehen?
Peter Mortensen
Es gibt auch Assembly-Ansicht beim Debuggen in MSVC
phuclv
Ich habe momentan
Pieter