Как я могу увидеть код сборки для программы на C ++?


Ответы:


167

Спросите у компилятора

Если вы собираете программу самостоятельно, вы можете попросить ваш компилятор создать исходный код сборки. Для большинства компиляторов 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 на винде.

Используйте свой отладчик

Отладчики также могли демонстрировать дизассемблирование.


35

В GCC / G ++ компилируйте с помощью -S. Это выведет something.sфайл с кодом сборки.

Изменить: если вы хотите, чтобы вывод был в синтаксисе Intel (который является IMO, гораздо более читаемым, и большинство руководств по сборке используют его), скомпилируйте с -masm=intel.


5
добавить также -fverbose-asmопцию
osgx

23

В Visual Studio ;

  1. установить точку останова
  2. запустить программу, пока она не остановится в точке останова
  3. щелкните правой кнопкой мыши исходный код и выберите "показать разборку"

14

Для gcc / g ++

gcc -save-temps -fverbose-asm prog.c

Это сгенерирует prog.s с некоторыми комментариями к переменным, используемым в каждой строке asm:

    movl    $42, -24(%ebp)  #, readme
    movl    -16(%ebp), %eax # pid, pid
    movl    %eax, 4(%esp)   # pid,
    movl    $.LC0, (%esp)   #,
    call    printf  #


6

Многие люди уже рассказали, как сгенерировать ассемблерный код с помощью данного компилятора. Другое решение - скомпилировать объектный файл и выгрузить его с помощью такого инструмента, как objdump , readelf (в Unix) или DUMPBIN ( ссылка ) (в Windows). Вы также можете выгрузить исполняемый файл, но это будет сложнее прочитать вывод.

Это имеет то преимущество, что работает одинаково с любым компилятором.


6

Какой бы отладчик вы ни использовали, он должен иметь представление сборки (Visual Studio, Borland IDE, gdb и т. Д.). Если вы не используете отладчик и просто хотите увидеть, какая сборка находится в программе, вы можете использовать дизассемблер или, альтернативно, запустить программу и присоединиться к ней с помощью отладчика и выполнить дамп оттуда. См. Ссылки на дизассемблеры для получения информации о параметрах.


5

Как уже упоминал кто-то другой, отладчик вашей платформы - хорошая отправная точка. Для отбойного молотка всех отладчиков и дизассемблеров, посмотрите на IDA Pro.

На платформах Unix / Linux (включая Cygwin) вы можете использовать objdump --disassemble <executable>.


Если есть возможность заставить компилятор генерировать ассемблер (например, gcc -S или параметр VS / FA ниже), это предпочтительнее дизассемблирования. Это более символично.
Марко ван де Воорт

Конечно, если у вас есть источник.
Ori Pessach

2
Кстати, вы удивитесь, сколько символьной информации может выводить IDA Pro.
Ori Pessach

5

Большинство компиляторов имеют возможность выводить список сборок. Например, с VisualStudio вы можете использовать что-то вроде:

cl.exe /FAfile.asm file.c

Однако для лучшей читаемости большинство отладчиков будут предлагать представление, которое чередует разборку с исходным исходным кодом, поэтому вы можете сравнивать свой код с выводом компилятора построчно.



3

Вы также можете попробовать этот сайт: http://assembly.ynh.io/

Там вы можете вставить свой код C или C ++ и нажать синюю кнопку, чтобы увидеть версию, эквивалентную сборке.


К вашему сведению, не
удается

Да, еще в 2015 году все работало нормально, потом вдруг перестало. Затем появился ctoassembly.com, но он работал только для небольшого подмножества C. Произошло то же самое: больше не загружается. Жаль.
Gomes JA

2

В Visual Studio вы можете создать список ассемблера для проекта C ++.

Перейдите в свойства проекта, затем в C ++ / Output Files и установите для параметра Assembler Output и ASM list location имя файла.


1

На Intel Mac OS X 10.8 (Mountain Lion) -masm=intelдиректива не работала. Однако, если у вас установлен Xcode , он должен был установить инструмент с именем otool:

otool code.o -tV

Вы должны предоставить скомпилированный объектный код в качестве параметра.


0

Если вы являетесь пользователем Eclipse, вы можете использовать представление Disassembly .

Представление Disassembly показывает загруженную программу в виде инструкций ассемблера, смешанных с исходным кодом для сравнения. Текущая выполняемая строка обозначается маркером стрелки и выделяется на экране. В представлении «Разборка» вы можете выполнять следующие задачи:

  • Установите точки останова в начале любой инструкции ассемблера
  • Включение и отключение точек останова и установка их свойств
  • Выполните инструкции по разборке вашей программы
  • Переход к конкретным инструкциям в программе

Можете ли вы уточнить немного?
Питер Мортенсен

Также есть сборка при отладке в MSVC
phuclv 07

У меня сейчас нет рабочей среды разработки Eclipse C ++, но вот официальная документация: help.eclipse.org/kepler/…
Питер,
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.