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

Исправлено с помощью флага --capture=no (или -s) из pytest :

pytest -v --capture=no tests/

Подробнее см. https://github.com/timofurrer /colorful/issues/23#issuecomment-468008070.

128
задан Peter Mortensen 7 June 2014 в 14:10
поделиться

10 ответов

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

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

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

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

163
ответ дан 24 November 2019 в 00:38
поделиться

В Visual Studio ;

  1. установить точку останова
  2. запустить программу до остановки в точке останова
  3. щелкните правой кнопкой мыши исходный код и выберите «показать разборку»
23
ответ дан 24 November 2019 в 00:38
поделиться

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

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

]
5
ответ дан 24 November 2019 в 00:38
поделиться

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

Перейдите в свойства проекта, затем в C ++ / Выходные файлы и установите параметры вывода ассемблера и расположение списка ASM в файл имя.

2
ответ дан 24 November 2019 в 00:38
поделиться

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

6
ответ дан 24 November 2019 в 00:38
поделиться

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

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

6
ответ дан 24 November 2019 в 00:38
поделиться

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

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

35
ответ дан 24 November 2019 в 00:38
поделиться

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

cl.exe /FAfile.asm file.c

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

5
ответ дан 24 November 2019 в 00:38
поделиться

Дизассемблер PE Explorer для 32-битных файлов PE. IDA для других.

4
ответ дан 24 November 2019 в 00:38
поделиться

Для gcc / g ++

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

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

    movl    $42, -24(%ebp)  #, readme
    movl    -16(%ebp), %eax # pid, pid
    movl    %eax, 4(%esp)   # pid,
    movl    $.LC0, (%esp)   #,
    call    printf  #
13
ответ дан 24 November 2019 в 00:38
поделиться
Другие вопросы по тегам:

Похожие вопросы: