Как я могу увидеть код сборки для программы на С++?
Каковы популярные инструменты для этого?
Как я могу увидеть код сборки для программы на С++?
Каковы популярные инструменты для этого?
Если вы сами создаете программу, вы можете попросить компилятор испустить источник сборки. Для большинства компиляторов 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.Отладчики также могут показаться disassebly.
disas
в GDB,В GCC/g++ скомпилируйте с помощью -S
. Это будет выводить файл something.s
с кодом сборки.
Изменить: если вы хотите, чтобы выход находился в синтаксисе Intel (который является IMO, гораздо более читаемым и большинством руководств по сборке его используют), скомпилируйте с помощью -masm=intel
.
В Visual Studio;
Для 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 #
Независимо от того, какой отладчик вы используете, должен иметь вид сборки (Visual Studio, Borland IDE, gdb и т.д.). Если вы не используете отладчик, и вы просто хотите увидеть, какая сборка находится в программе, вы можете использовать дизассемблер или, альтернативно, запустить программу и подключиться к ней с помощью отладчика и сделать там дамп. См. Ссылки на дизассемблеры для получения информации о параметрах.
Многие люди уже говорили, как испускать код сборки с данным компилятором. Другим решением является компиляция объектного файла и сбрасывание его с помощью инструмента objdump, readelf (в Unix) или DUMPBIN (ссылка) (в Windows). Вы также можете сбрасывать исполняемый файл, но будет труднее прочитать результат.
Это имеет то преимущество, что вы работаете с любым компилятором.
Как уже упоминалось, ваш отладчик платформы является хорошей отправной точкой. Для отбойного молотка всех отладчиков и дизассемблеров ознакомьтесь с IDA Pro.
На платформах Unix/Linux (включая Cygwin) вы можете использовать objdump --disassemble <executable>
.
Большинство компиляторов имеют возможность выводить список сборок. Например. с VisualStudio вы можете использовать что-то вроде:
cl.exe /FAfile.asm file.c
Для лучшей читаемости большинство отладчиков будут предлагать представление, которое чередует разборку с исходным исходным кодом, поэтому вы можете сравнить свой код с выходом компилятора по строкам.
PE Explorer Disassembler для 32-разрядных файлов PE. IDA для других.
Вы также можете попробовать этот сайт: http://assembly.ynh.io/
Там вы можете вставить свой код C или С++ и нажать синюю кнопку, чтобы увидеть эквивалентную версию сборки.
В Visual Studio вы можете сгенерировать список ассемблера для проекта С++.
Перейдите к свойствам проекта, затем к файлам С++/Output и установите для параметра Assembler Output и расположение списка ASM имя файла.
Этот сайт в настоящее время работает для меня (2017): https://godbolt.org/
В Intel Mac OS X 10.8 (Mountain Lion) директива -masm=intel
не работала. Однако, если вы установили Xcode, он должен был установить инструмент с именем 'otool':
otool code.o -tV
Вы должны предоставить скомпилированный объектный код в качестве параметра.
Если вы пользователь Eclipse, вы можете использовать Разборный вид.
В представлении "Разборка" отображается загруженная программа как ассемблер инструкции, смешанные с исходным кодом для сравнения. В настоящее время строка выполнения указана маркером стрелки и выделена в Посмотреть. В представлении "Разборка" вы можете выполнить следующие задачи:
- Установить точки останова в начале любой инструкции ассемблера
- Включить и отключить точки останова и установить их свойства
- Выполняйте инструкции по разборке вашей программы.
- Перейти к определенным инструкциям в программе