Ich las eine andere Frage bezüglich der Effizienz von zwei Codezeilen, und das OP sagte, dass er die Baugruppe hinter dem Code betrachtete und beide Zeilen in der Baugruppe identisch waren. Abgesehen von Exkurs, wie könnte ich den Assembler-Code anzeigen, der beim Kompilieren eines Programms erstellt wurde?
Ich verwende Visual C ++ von Microsoft, möchte aber auch wissen, ob es möglich ist, die in Visual Basic geschriebene Assembly hinter dem Code anzuzeigen.
Wie kann ich den Assembler-Code hinter einem Programm anzeigen, das in höheren Sprachen wie C ++ und Visual Basic geschrieben wurde?
visual-c++
assembly
Bart
quelle
quelle
Antworten:
Es gibt verschiedene Ansätze:
Normalerweise können Sie beim Debuggen von C ++ in Visual Studio (und auch Eclipse) Assembler-Code sehen. Setzen Sie dazu in Visual Studio einen Haltepunkt auf den betreffenden Code. Wenn der Debugger ihn trifft, klicken Sie auf "Gehe zu Baugruppe" (oder drücken Sie STRG + ALT + D).
Der zweite Ansatz besteht darin, beim Kompilieren Baugruppenlisten zu generieren. Gehen Sie dazu zu Projekteinstellungen -> C / C ++ -> Ausgabedateien -> Speicherort der ASM-Liste und geben Sie den Dateinamen ein. Wählen Sie außerdem "Baugruppenausgabe" bis "Baugruppe mit Quellcode".
Kompilieren Sie das Programm und verwenden Sie einen Debugger eines Drittanbieters. Sie können hierfür OllyDbg oder WinDbg verwenden. Sie können auch IDA (Interactive Disassembler) verwenden. Aber das ist eine Hardcore-Methode.
quelle
Zusätzlicher Hinweis: Es gibt einen großen Unterschied zwischen der Ausgabe des Debug-Assemblers und der Ausgabe von Release 1. Der erste ist gut zu lernen, wie der Compiler Assembler-Code aus C ++ erzeugt. Der zweite ist gut zu lernen, wie der Compiler verschiedene C ++ - Konstrukte optimiert. In diesem Fall sind einige C ++ - to-asm-Transformationen nicht offensichtlich.
quelle
Geben Sie den Schalter / FA für den cl-Compiler an. Abhängig vom Wert des Schalters ist entweder nur der Baugruppencode oder der übergeordnete Code und der Baugruppencode integriert. Der Dateiname erhält die Dateierweiterung .asm. Hier sind die unterstützten Werte:
quelle
Am einfachsten ist es, den Debugger zu starten und das Demontagefenster zu überprüfen .
quelle
Die frühere Version dieser Antwort (ein "Hack" für rextester.com) ist jetzt, da http://gcc.godbolt.org/ CL 19 RC für ARM, x86 und x86-64 bereitstellt (für die Windows-Aufrufkonvention ), größtenteils überflüssig im Gegensatz zu gcc, clang und icc auf dieser Site).
Der Godbolt-Compiler-Explorer wurde entwickelt, um die asm-Ausgabe des Compilers gut zu formatieren und das "Rauschen" von Direktiven zu entfernen. Ich würde daher dringend empfehlen, ihn zu verwenden, um asm nach einfachen Funktionen zu durchsuchen, die Argumente annehmen und einen Wert zurückgeben (dies ist also nicht der Fall) weg optimiert).
Für eine Weile war CL auf http://gcc.beta.godbolt.org/ verfügbar, aber nicht auf der Hauptseite, aber jetzt ist es auf beiden.
So erhalten Sie eine MSVC-ASM-Ausgabe vom Online-Compiler http://rextester.com/l/cpp_online_compiler_visual : Fügen Sie
/FAs
den Befehlszeilenoptionen hinzu. Lassen Sie Ihr Programm seinen eigenen Pfad finden und den Pfad zum ermitteln.asm
und sichern. Oder führen Sie einen Disassembler auf dem.exe
.zB http://rextester.com/OKI40941
type
ist die DOS-Version voncat
. Ich wollte keinen weiteren Code einfügen, der es schwieriger macht, die Funktionen zu finden, für die ich den ASM sehen wollte. (Obwohl die Verwendung von std :: string und Boost - Laufzähler auf diese Ziele! Einige C-String - Manipulation , die mehr Annahmen über die Saite macht es der Verarbeitung (und ignoriert Maximallänge Sicherheit / Zuteilung durch einen großen Puffer) auf dem Ergebnis derGetModuleFileNameA
Would viel weniger Gesamtmaschinencode sein.)IDK warum,
cout << p.string() << endl
zeigt aber nur den Basisnamen (dh den Dateinamen ohne die Verzeichnisse) an, obwohl das Drucken seiner Länge zeigt, dass es nicht nur der bloße Name ist. (Chromium48 unter Ubuntu 15.10). Es gibt wahrscheinlich irgendwann incout
oder zwischen dem Standard des Programms und dem Webbrowser eine Backslash-Escape-Verarbeitung .quelle
.c_str()
druckt etwas, das wie ein Zeiger aussieht. Wenn Sie dem Link folgen, sehen Sie Code zum Hexdump astd::string
(deaktiviert mit#if 0
). Es stellt sich heraus, dass die Zeichenfolge in Ordnung ist, abercout
nicht an den Webbrowser gesendet wird. Es gibt auch keine Nicht-ASCII-Zeichen, nur Backslashes.subdir--; p /= *subdir;
getan haben, haben Sie p nicht nur auf den Dateinamen reduziert ? Oder vielleicht verstehe ich falsch, was Sie zu drucken versuchen.subdir--
gefolgt von ,p /= *subdir
wennsubdir
ursprünglichp.end()
GetModuleFileNameA
gerade zurücka.exe
. Erst als ich es hexdumpte und die Länge druckte, wusste ich, dass es funktioniert, und ich konnte das Programm den Pfad manipulieren lassen, ich konnte den Pfad einfach nicht drucken\\r
(nun,\r
wenn der Compiler ihn ausgibt) Teil des Dateinamens zu sein, den er beim Rendern für den Webbrowser schlecht übersetzt hat. Verwenden vonp.generic_string()
Arbeiten, aber die umgekehrten Schrägstriche sind Schrägstriche.In Visual C ++ bieten die Projektoptionen unter Ausgabedateien meines Erachtens eine Option zum Ausgeben der ASM-Liste mit Quellcode. Sie sehen also den C / C ++ - Quellcode und den resultierenden ASM in derselben Datei.
quelle
Für MSVC können Sie den Linker verwenden.
link.exe / dump / linenumbers / disasm /out:foo.dis foo.dll
foo.pdb muss verfügbar sein, um Symbole zu erhalten
quelle
Der .NET Reflector von Red Gate ist ein ziemlich großartiges Tool, das mir mehr als ein paar Mal geholfen hat. Das Plus an diesem Dienstprogramm ist, dass Sie viele DLLs von Drittanbietern analysieren können und der Reflector sich um die Konvertierung von MSIL in C # und VB kümmert.
Ich verspreche nicht, dass der Code so klar wie die Quelle sein wird, aber Sie sollten keine großen Probleme haben, ihm zu folgen.
quelle
Wenn Sie über das Debuggen sprechen, um den Assemblycode anzuzeigen, ist Debug-> Windows-> Disassembly (oder Alt-8) der einfachste Weg. Auf diese Weise können Sie in eine aufgerufene Funktion eintreten und in der Demontage bleiben.
quelle