Более ранняя версия этого ответа («взлом» для 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/, но не на основном сайте, но теперь он доступен на обоих.
Чтобы получить вывод MSVC asm из 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
или между стандартным выводом программы и веб-браузером есть некоторая обработка с обратным слешем.