Wcześniejsza wersja tej odpowiedzi ("hack" dla rextester.com) jest teraz w większości zbędna, ponieważ http://gcc.godbolt.org/ udostępnia CL 19 RC dla ARM, x86 i x86-64 (celując w konwencję wywoływania systemu Windows , w przeciwieństwie do gcc, clang i icc na tej stronie).
Eksplorator kompilatora Godbolt jest przeznaczony do ładnego formatowania danych wyjściowych kompilatora asm, usuwania „szumu” dyrektyw, więc bardzo polecam używanie go do szukania prostych funkcji, które pobierają argumenty i zwracają wartość (więc nie będą zoptymalizowany z dala).
Przez jakiś czas CL był dostępny na http://gcc.beta.godbolt.org/, ale nie na głównej stronie, ale teraz jest na obu.
Aby uzyskać dane wyjściowe MSVC asm z http://rextester.com/l/cpp_online_compiler_visual kompilatora online: Dodaj /FAs
do opcji wiersza poleceń. Niech twój program znajdzie własną ścieżkę, opracuje ścieżkę do .asm
pliku i zrzuci go. Lub uruchom dezasembler na .exe
.
np. 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
jest wersją DOS cat
. Nie chciałem dołączać więcej kodu, który utrudniałby znalezienie funkcji, dla których chciałem zobaczyć asm. (Chociaż za pomocą std :: string i są sprzeczne impuls do tych celów! Niektóre C-styl manipulacji ciąg, który sprawia, że kolejne założenia o struny to przetwórstwo (i ignoruje max długości bezpieczeństwa / alokację przy użyciu duży bufor) na skutek GetModuleFileNameA
BĘDZIE być znacznie mniej całkowitym kodem maszynowym.)
IDK dlaczego, ale cout << p.string() << endl
pokazuje tylko podstawową nazwę (tj. Nazwę pliku bez katalogów), mimo że wypisanie jej długości pokazuje, że nie jest to tylko sama nazwa. (Chromium48 na Ubuntu 15.10). Prawdopodobnie w pewnym momencie cout
lub między standardowym wyjściem programu a przeglądarką internetową występuje pewne przetwarzanie ucieczki odwrotnym ukośnikiem .