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


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.

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.


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

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  #


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.


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 .


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


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.



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.



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.


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.


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

Können Sie etwas näher darauf eingehen?
Peter Mortensen

Es gibt auch Assembly-Ansicht beim Debuggen in MSVC
phuclv

Ich habe momentan
Pieter
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.