Как я могу увидеть код сборки для программы на C ++?
Какие популярные инструменты для этого?
Как я могу увидеть код сборки для программы на C ++?
Какие популярные инструменты для этого?
Ответы:
Если вы собираете программу самостоятельно, вы можете попросить ваш компилятор создать исходный код сборки. Для большинства компиляторов UNIX используйте -S
переключатель.
Если вы используете ассемблер GNU, компиляция с помощью -g -Wa,-alh
даст смешанный исходный код и сборку на stdout ( -Wa
просит драйвер компилятора передать параметры ассемблеру, -al
включает листинг сборки и -ah
добавляет листинг «исходный код высокого уровня»):
g++ -g -c -Wa,-alh foo.cc
Для Visual Studio используйте /FAsc
.
Если вы скомпилировали двоичный файл,
objdump -d a.out
в UNIX (также работает для cygwin),dumpbin /DISASM foo.exe
на винде.Отладчики также могли демонстрировать дизассемблирование.
disas
команду в GDB,В GCC / G ++ компилируйте с помощью -S
. Это выведет something.s
файл с кодом сборки.
Изменить: если вы хотите, чтобы вывод был в синтаксисе Intel (который является IMO, гораздо более читаемым, и большинство руководств по сборке используют его), скомпилируйте с -masm=intel
.
-fverbose-asm
опцию
В Visual Studio ;
Этот сайт сейчас у меня работает (2017): https://godbolt.org/
Многие люди уже рассказали, как сгенерировать ассемблерный код с помощью данного компилятора. Другое решение - скомпилировать объектный файл и выгрузить его с помощью такого инструмента, как objdump , readelf (в Unix) или DUMPBIN ( ссылка ) (в Windows). Вы также можете выгрузить исполняемый файл, но это будет сложнее прочитать вывод.
Это имеет то преимущество, что работает одинаково с любым компилятором.
Какой бы отладчик вы ни использовали, он должен иметь представление сборки (Visual Studio, Borland IDE, gdb и т. Д.). Если вы не используете отладчик и просто хотите увидеть, какая сборка находится в программе, вы можете использовать дизассемблер или, альтернативно, запустить программу и присоединиться к ней с помощью отладчика и выполнить дамп оттуда. См. Ссылки на дизассемблеры для получения информации о параметрах.
Как уже упоминал кто-то другой, отладчик вашей платформы - хорошая отправная точка. Для отбойного молотка всех отладчиков и дизассемблеров, посмотрите на IDA Pro.
На платформах Unix / Linux (включая Cygwin) вы можете использовать objdump --disassemble <executable>
.
Большинство компиляторов имеют возможность выводить список сборок. Например, с VisualStudio вы можете использовать что-то вроде:
cl.exe /FAfile.asm file.c
Однако для лучшей читаемости большинство отладчиков будут предлагать представление, которое чередует разборку с исходным исходным кодом, поэтому вы можете сравнивать свой код с выводом компилятора построчно.
Дизассемблер PE Explorer для 32-битных файлов PE. IDA для других.
Вы также можете попробовать этот сайт: http://assembly.ynh.io/
Там вы можете вставить свой код C или C ++ и нажать синюю кнопку, чтобы увидеть версию, эквивалентную сборке.
В Visual Studio вы можете создать список ассемблера для проекта C ++.
Перейдите в свойства проекта, затем в C ++ / Output Files и установите для параметра Assembler Output и ASM list location имя файла.
Если вы являетесь пользователем Eclipse, вы можете использовать представление Disassembly .
Представление Disassembly показывает загруженную программу в виде инструкций ассемблера, смешанных с исходным кодом для сравнения. Текущая выполняемая строка обозначается маркером стрелки и выделяется на экране. В представлении «Разборка» вы можете выполнять следующие задачи:
- Установите точки останова в начале любой инструкции ассемблера
- Включение и отключение точек останова и установка их свойств
- Выполните инструкции по разборке вашей программы
- Переход к конкретным инструкциям в программе
Alt +8