Я читал другой вопрос, касающийся эффективности двух строк кода, и ОП сказал, что он посмотрел на сборку, стоящую за кодом, и обе строки были идентичны в сборке. Отступление в сторону, как мне просмотреть ассемблерный код, созданный при компиляции программы.
Я использую Microsoft Visual C ++, но мне также хотелось бы знать, можно ли просмотреть сборку кода, написанного на Visual Basic.
Итак, как мне просмотреть ассемблерный код программы, написанной на языках более высокого уровня, таких как C ++ и Visual Basic?
visual-c++
assembly
Барт
источник
источник
Ответы:
Есть несколько подходов:
Обычно вы можете увидеть код сборки при отладке C ++ в Visual Studio (и в Eclipse тоже). Для этого в Visual Studio поставьте точку останова на рассматриваемый код, и когда отладчик попадает в нее, щелкните правой кнопкой мыши и найдите «Перейти к сборке» (или нажмите CTRL + ALT + D).
Второй подход - генерировать листинги сборки во время компиляции. Для этого перейдите в настройки проекта -> C / C ++ -> Выходные файлы -> Расположение списка ASM и введите имя файла. Также выберите «Вывод сборки» на «Сборка с исходным кодом».
Скомпилируйте программу и используйте любой сторонний отладчик. Для этого вы можете использовать OllyDbg или WinDbg. Также вы можете использовать IDA (интерактивный дизассемблер). Но это хардкорный способ сделать это.
источник
Дополнительное примечание: существует большая разница между выводом Debug ассемблера и первым выпуском. Первый полезен, чтобы узнать, как компилятор создает код ассемблера из C ++. Второй полезен, чтобы узнать, как компилятор оптимизирует различные конструкции C ++. В этом случае некоторые преобразования C ++ в asm не очевидны.
источник
Укажите переключатель / FA для компилятора cl. В зависимости от значения переключателя интегрируется либо только код сборки, либо код высокого уровня и код сборки. Имя файла получает расширение .asm. Вот поддерживаемые значения:
источник
Самый простой способ - запустить отладчик и проверить окно разборки .
источник
Более ранняя версия этого ответа («взлом» для 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
type
это версия для DOScat
. Я не хотел включать больше кода, который усложнил бы поиск функций, для которых я хотел видеть asm. (Хотя использование зОго :: строки и счетчика подталкивания запуска для этих целей! Некоторый C-стиль строка манипуляции , что делает больше предположений о последовательности это обработки (и игнорирует макс длиной безопасности / распределение, используя большой буфер) в результатеGetModuleFileNameA
Would быть намного меньше общего машинного кода.)IDK, почему, но
cout << p.string() << endl
показывает только базовое имя (то есть имя файла без каталогов), хотя печать его длины показывает, что это не просто голое имя. (Chromium48 в Ubuntu 15.10). Вероятно, в какой-то моментcout
или между стандартным выводом программы и веб-браузером есть некоторая обработка с обратным слешем.источник
.c_str()
печатает то, что похоже на указатель. Если вы перейдете по ссылке, вы увидите код для шестнадцатеричного дампа astd::string
(отключен с помощью#if 0
). Оказывается, строка в порядке, ноcout
не получает ее в веб-браузер. Также нет никаких символов, отличных от ascii, только обратная косая черта.subdir--; p /= *subdir;
сделали, разве вы не уменьшили p до имени файла? Или, может быть, я неправильно понимаю, что вы пытаетесь напечатать.subdir--
следовало,p /= *subdir
когдаsubdir
было изначальноp.end()
GetModuleFileNameA
только что вернулсяa.exe
. Только когда я сделал его шестнадцатеричный дамп и напечатал длину, я знал, что он работает, и я мог заставить программу манипулировать путем, я просто не мог распечатать путь\\r
(хорошо,\r
когда компилятор выводит) часть имени файла, которую он плохо переводил при рендеринге для веб-браузера. Использованиеp.generic_string()
работает, но обратная косая черта является прямой.В Visual C ++ параметры проекта в разделе «Файлы вывода», как мне кажется, имеют возможность вывода списка ASM с исходным кодом. Таким образом, вы увидите исходный код C / C ++ и получившийся ASM в одном файле.
источник
Для MSVC вы можете использовать компоновщик.
link.exe / дамп / льняные числа / disasm /out:foo.dis foo.dll
foo.pdb должен быть доступен для получения символов
источник
.NET Reflector от Red Gate - замечательный инструмент, который помогал мне более чем несколько раз. Плюс этой утилиты, помимо простой демонстрации MSIL, заключается в том, что вы можете анализировать множество сторонних DLL, а Reflector позаботится о преобразовании MSIL в C # и VB.
Я не обещаю, что код будет таким же ясным, как исходный, но у вас не должно возникнуть особых проблем с его использованием.
источник
Если вы говорите об отладке, чтобы увидеть код сборки, самый простой способ - это Debug-> Windows-> Disassembly (или Alt-8). Это позволит вам войти в вызываемую функцию и остаться в разборке.
источник