Как я могу увидеть ассемблерный код для программы на C ++? - PullRequest
122 голосов
/ 08 мая 2009

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

Какие популярные инструменты для этого?

Ответы [ 14 ]

155 голосов
/ 08 мая 2009

Задайте вопрос компилятору

Если вы собираете программу самостоятельно, вы можете попросить ваш компилятор выдать исходный код сборки. Для большинства компиляторов UNIX используйте переключатель -S.

  • Если вы используете ассемблер GNU, компиляция с -g -Wa,-alh даст смешанный источник и сборку на стандартный вывод (-Wa просит драйвер компилятора передать опции ассемблеру, -al включает листинг сборки и -ah добавляет список «источник высокого уровня»):

    g++ -g -c -Wa,-alh foo.cc

  • Для Visual Studio используйте /FAsc.

Заглянуть в двоичный файл

Если вы скомпилировали бинарный файл,

  • использовать objdump -d a.out в UNIX (также работает для Cygwin),
  • dumpbin /DISASM foo.exe в Windows.

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

Отладчики также могут показывать разборчиво.

32 голосов
/ 08 мая 2009

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

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

21 голосов
/ 08 мая 2009

В Visual Studio ;

  1. установить точку останова
  2. запускать программу до тех пор, пока она не остановится на точке останова
  3. щелкните правой кнопкой мыши по исходному коду и выберите «show disasembly»
12 голосов
/ 08 февраля 2010

для гкц / г ++

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  #
7 голосов
/ 25 апреля 2017

Этот сайт в настоящее время работает на меня (2017): https://godbolt.org/

6 голосов
/ 08 мая 2009

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

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

6 голосов
/ 08 мая 2009

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

5 голосов
/ 08 мая 2009

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

cl.exe /FAfile.asm file.c

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

5 голосов
/ 08 мая 2009

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

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

4 голосов
/ 18 июля 2009

PE Explorer Disassembler для 32-битных PE-файлов. МАР для других.

...