Предыдущая версия этого ответа («взлом» для 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 - это версия cat для DOS. Я не хотел включать больше кода, который усложнил бы поиск функций, для которых я хотел бы видеть asm. (Хотя для этих целей используется std :: string и счетчик ускоренного запуска! Некоторые манипуляции со строками в стиле C, которые делают больше предположений о обрабатываемой строке (и игнорируют безопасность / выделение максимальной длины с использованием большого буфера) в результате GetModuleFileNameA будет намного меньше общего машинного кода.)
IDK, почему, но cout << p.string() << endl показывает только базовое имя (то есть имя файла без каталогов), хотя печать его длины показывает, что это не просто голое имя. (Chromium48 в Ubuntu 15.10). Вероятно, в какой-то момент в cout или между стандартным выводом программы и веб-браузером есть некоторая обработка обратного слэша.
person
Peter Cordes
schedule
09.02.2016