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