Рання версія цієї відповіді ("хак" для rextester.com) здебільшого є зайвою тепер, коли http://gcc.godbolt.org/ надає CL 19 RC для ARM, x86 та x86-64 (орієнтований на конвенцію про виклики Windows на відміну від gcc, clang та icc на цьому веб-сайті).
Провідник компілятора Godbolt розроблений для гарного форматування виводу ASM компілятора, видалення "шуму" директив, тому я дуже рекомендую використовувати його для пошуку ASM для простих функцій, які беруть аргументи та повертають значення (тому вони не будуть оптимізовано далеко).
Деякий час CL був доступний на веб- сайті http://gcc.beta.godbolt.org/, але не на основному веб-сайті, але зараз він є на обох.
Щоб отримати вихід ASM від MSVC від онлайн-компілятора http://rextester.com/l/cpp_online_compiler_visual : Додайте /FAs
до параметрів командного рядка. Попросіть вашу програму знайти свій власний шлях та відпрацювати шлях до .asm
та скинути його. Або запустити розбирач на .exe
.
наприклад 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
є DOS-версією cat
. Я не хотів включати більше коду, який би ускладнював пошук функцій, для яких я хотів бачити ASM. (Хоча використання ЗОГО :: рядки і лічильника підштовхування запуску для цих цілей! Деякий C-стиль рядок маніпуляції , що робить більше припущень про послідовність це обробки (і ігнорує макс довжиною безпеки / розподіл, використовуючи великий буфер) в результаті GetModuleFileNameA
Would бути набагато меншим загальним машинним кодом.)
IDK чому, але cout << p.string() << endl
показує лише базову назву (тобто ім'я файлу, без каталогів), хоча друк його довжини показує, що це не просто оголене ім'я. (Chromium48 на Ubuntu 15.10). Можливо, в якийсь момент cout
або між версією програми та веб-браузером обробляється зворотна похила .