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
#include <string>
#include <boost/filesystem.hpp>
#include <Windows.h>
using namespace std;
static string my_exe(void){
char buf[MAX_PATH];
DWORD tmp = GetModuleFileNameA( NULL, // self
buf, MAX_PATH);
return buf;
}
int main() {
string dircmd = "dir ";
boost::filesystem::path p( my_exe() );
//boost::filesystem::path dir = p.parent_path();
// transform c:\foo\bar\1234\a.exe
// into c:\foo\bar\1234\1234.asm
p.remove_filename();
system ( (dircmd + p.string()).c_str() );
auto subdir = p.end(); // pointing at one-past the end
subdir--; // pointing at the last directory name
p /= *subdir; // append the last dir name as a filename
p.replace_extension(".asm");
system ( (string("type ") + p.string()).c_str() );
// std::cout << "Hello, world!\n";
}
... code of functions you want to see the asm for goes here ...
type
ist die DOS-Version von cat
. 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 der GetModuleFileNameA
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 in cout
oder zwischen dem Standard des Programms und dem Webbrowser eine Backslash-Escape-Verarbeitung .