Wcześniejsza wersja tej odpowiedzi (A „Hack "dla rextester.com) jest w większości zbędny teraz, gdy http://gcc.godbolt.org/ zapewnia CL 19 RC dla ARM, x86 i x86-64 (kierując się konwencją wywołującą Windows, w przeciwieństwie do gcc, clang i icc na tej stronie).
Eksplorator kompilatorów Godbolt został zaprojektowany do ładnego formatowania danych wyjściowych kompilatora ASM, usuwając "szum" dyrektyw, więc zdecydowanie polecam używanie go do sprawdzania asm dla prostych funkcji, które pobierają argumenty i zwracają wartość (więc nie zostaną zoptymalizowane).
Przez chwilę CL był dostępny na http://gcc.beta.godbolt.org/, ale nie na stronie głównej, ale teraz jest na obu.
Aby uzyskać wyjście asm MSVC z http://rextester.com/l/cpp_online_compiler_visual kompilatora internetowym: Dodaj /FAs
do opcji wiersza poleceń. Niech twój program znajdzie swoją własną ścieżkę i wytyczy ścieżkę do .asm
i zrzuci ją. Lub uruchom dezasembler na urządzeniu .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 wersja DOS cat
. Nie chciałem dodawać więcej kodu, który utrudniłby znalezienie funkcji, które chciałem zobaczyć. (Chociaż używanie std :: string i boost działają przeciwnie do tych celów! Niektóre manipulacje łańcuchami w stylu C, które powodują więcej założeń dotyczących łańcucha, który przetwarza (i ignoruje maksymalne bezpieczeństwo/alokację przy użyciu dużego bufora) na wynik GetModuleFileNameA
byłby o wiele mniejszy całkowity kod maszynowy.)
IDK dlaczego, ale cout << p.string() << endl
pokazuje tylko nazwę baseame (tj. nazwę pliku, bez katalogów), mimo że wydrukowanie jej długości pokazuje, że to nie tylko nazwa bez nazwy. (Chromium48 na Ubuntu 15.10). Prawdopodobnie istnieje pewne przetwarzanie ułamków ukośników w pewnym momencie w cout
lub między stdoutem programu i przeglądarką internetową.
Należy zauważyć, że podejście nr 2 nie działa podczas kompilowania biblioteki statycznej z włączoną optymalizacją całego programu (przynajmniej w VS2010). Co ma sens - kompilator jeszcze nie wygenerował ostatecznego kodu. – dhaffey
Nazywa się "Goto Disassembly" w Visual Studio 2017 – Matthias