La version antérieure de cette réponse (un "hack" pour rextester.com) est principalement redondante maintenant que http://gcc.godbolt.org/ fournit CL 19 RC pour ARM, x86 et x86-64 (ciblant la convention d'appel Windows , contrairement à gcc, clang et icc sur ce site).
L'explorateur de compilateur Godbolt est conçu pour formater joliment la sortie asm du compilateur, en supprimant le «bruit» des directives, je vous recommande donc vivement de l'utiliser pour rechercher des fonctions simples qui prennent des arguments et renvoient une valeur (donc ils ne seront pas optimisé loin).
Pendant un certain temps, CL était disponible sur http://gcc.beta.godbolt.org/ mais pas sur le site principal, mais maintenant c'est sur les deux.
Pour obtenir la sortie asm MSVC à partir du compilateur en ligne http://rextester.com/l/cpp_online_compiler_visual : Ajoutez /FAs
aux options de ligne de commande. Demandez à votre programme de trouver son propre chemin, de trouver le chemin vers le .asm
et de le vider. Ou exécutez un désassembleur sur le .exe
.
par exemple 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
est la version DOS de cat
. Je ne voulais pas inclure plus de code qui rendrait plus difficile la recherche des fonctions pour lesquelles je voulais voir l'asm. (Bien que l'utilisation de std :: string et boostent les exécutions à l'encontre de ces objectifs! Une certaine manipulation de chaîne de style C qui fait plus d'hypothèses sur la chaîne qu'il traite (et ignore la sécurité / allocation de longueur maximale en utilisant un grand tampon) sur le résultat de GetModuleFileNameA
serait être beaucoup moins de code machine total.)
IDK pourquoi, mais cout << p.string() << endl
ne montre que le nom de base (c'est-à-dire le nom de fichier, sans les répertoires), même si l'impression de sa longueur montre que ce n'est pas seulement le nom nu. (Chromium48 sur Ubuntu 15.10). Il y a probablement un traitement d'échappement par anti-slash à un moment donné cout
, ou entre la sortie standard du programme et le navigateur Web.