A versão anterior desta resposta (um "hack" para rextester.com) é basicamente redundante agora que http://gcc.godbolt.org/ fornece CL 19 RC para ARM, x86 e x86-64 (visando a convenção de chamada do Windows , ao contrário de gcc, clang e icc nesse site).
O explorador do compilador Godbolt é projetado para formatar bem a saída do compilador asm, removendo o "ruído" das diretivas, então eu recomendo usá-lo para olhar asm para funções simples que pegam args e retornam um valor (então eles não serão otimizado).
Por um tempo, CL estava disponível em http://gcc.beta.godbolt.org/, mas não no site principal, mas agora está em ambos.
Para obter a saída do ASM MSVC do http://rextester.com/l/cpp_online_compiler_visual compilador online: Adicione /FAs
às opções de linha de comando. Faça com que seu programa encontre seu próprio caminho, trabalhe o caminho para o .asm
e descarte-o. Ou execute um desmontador no .exe
.
por exemplo, 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
é a versão DOS de cat
. Eu não queria incluir mais código que tornaria mais difícil encontrar as funções para as quais eu queria ver o conjunto. (Embora usando std :: string e boost run counter para esses objetivos! Alguma manipulação de string de estilo C que faz mais suposições sobre a string que está processando (e ignora a segurança / alocação de comprimento máximo usando um grande buffer) no resultado de GetModuleFileNameA
seria ser muito menos código de máquina total.)
IDK por que, mas cout << p.string() << endl
mostra apenas o nome de base (ou seja, o nome do arquivo, sem os diretórios), embora a impressão de seu comprimento mostre que não é apenas o nome básico. (Chromium48 no Ubuntu 15.10). Provavelmente há algum processamento de escape de barra invertida em algum ponto cout
ou entre o stdout do programa e o navegador da web.