La versione precedente di questa risposta (un "hack" per rextester.com) è per lo più ridondante ora che http://gcc.godbolt.org/ fornisce CL 19 RC per ARM, x86 e x86-64 (mirando alla convenzione di chiamata di Windows , a differenza di gcc, clang e icc su quel sito).
L'esploratore del compilatore Godboltèprogettato per formattare bene l'output asm del compilatore, rimuovendo il "rumore" delle direttive, quindi consiglio vivamente di usarlo per guardare asm per funzioni semplici che accettano argomenti e restituiscono un valore (quindi non saranno ottimizzato lontano).
Per un po ', CL è stato disponibile su http://gcc.beta.godbolt.org/ ma non sul sito principale, ma ora è su entrambi.
Per ottenere l'output asm di MSVC dal compilatore online http://rextester.com/l/cpp_online_compiler_visual : Aggiungi /FAs
alle opzioni della riga di comando. Fai in modo che il tuo programma trovi il suo percorso, elabori il percorso per .asm
e scaricalo. Oppure esegui un disassemblatore sul file .exe
.
ad es. 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
è la versione DOS di cat
. Non volevo includere più codice che avrebbe reso più difficile trovare le funzioni per le quali volevo vedere asm. (Sebbene l'utilizzo di std :: string e boost sia contrario a questi obiettivi! Alcune manipolazioni di stringhe in stile C che fanno più ipotesi sulla stringa che sta elaborando (e ignora la sicurezza / allocazione della lunghezza massima utilizzando un grande buffer) sul risultato di GetModuleFileNameA
sarebbe essere molto meno codice macchina totale.)
IDK perché, ma cout << p.string() << endl
mostra solo il nome di base (cioè il nome del file, senza le directory), anche se stamparne la lunghezza mostra che non è solo il nome semplice. (Chromium48 su Ubuntu 15.10). Probabilmente c'è un po 'di elaborazione backslash-escape ad un certo punto cout
o tra lo stdout del programma e il browser web.