Учимся читать вывод ассемблера GCC - PullRequest
37 голосов
/ 10 апреля 2010

Я подумываю о некотором элементарном понимании сборки. Моя текущая цель проста: ОЧЕНЬ ОСНОВНО понимание вывода ассемблера GCC при компиляции C / C ++ с ключом -S для x86 / x86-64.

Достаточно просто сделать простые вещи, такие как просмотр одной функции и проверка того, оптимизирует ли GCC то, что я ожидаю исчезнуть.

Кто-нибудь знает / знает действительно краткое введение в сборку, относящееся к GCC и специально для чтения, а также список наиболее важных инструкций, которые должен знать каждый, кто случайно читает сборку?

Ответы [ 6 ]

22 голосов
/ 10 апреля 2010

Вы должны использовать опцию GCC -fverbose-asm. Это заставляет компилятор выводить дополнительную информацию (в форме комментариев), которая облегчает понимание связи кода сборки с исходным кодом C / C ++.

21 голосов
/ 10 апреля 2010

Если вы используете gcc или clang, аргумент -masm = intel говорит компилятору генерировать сборку с синтаксисом Intel вместо синтаксиса AT & T, а аргумент --save-temps указывает компилятору сохранять временные файлы (предварительно обработанный источник , вывод сборки, несвязанный объектный файл) в каталог GCC вызывается из.

Получение поверхностного понимания сборки x86 должно быть легко со всеми имеющимися ресурсами. Вот один из таких ресурсов: http://www.cs.virginia.edu/~evans/cs216/guides/x86.html.

Вы также можете просто использовать disasm и gdb, чтобы увидеть, что делает скомпилированная программа.

3 голосов
/ 10 апреля 2010

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

На Intel, к счастью, коды операций несколько разумны. PowerPC не так много на мой взгляд. MIPS был моим любимым. Для MIPS я позаимствовал маленький справочник моего соседа, а для PPC у меня была некоторая документация IBM в PDF, которая была удобна для поиска. (А для Intel, в основном, я предполагаю, а затем смотрю регистры, чтобы убедиться, что я угадываю правильно! Хе)

Собственно, сама сборка проста. Он в основном делает три вещи: перемещает данные между памятью и регистрами, оперирует данными в регистрах и изменяет счетчик программ. Отображение между вашим языком по выбору и сборкой потребует некоторого изучения (например, научиться распознавать вызов виртуальной функции), и для этого «полезный» вид исходного кода и дизассемблирования (как вы можете получить в Visual Studio) очень полезен.

2 голосов
/ 10 апреля 2010

"случайно читая сборку" лол (красиво)

Я бы начал со следующего в gdb во время выполнения; Вы лучше чувствуете, что происходит. Но тогда, может быть, это только я. он разберет для вас функцию (disass func), затем вы сможете пройти через нее один шаг

Если вы делаете это исключительно для проверки оптимизаций - не беспокойтесь.

а) компилятор делает хорошую работу

б) вы все равно не сможете понять, что он делает (никто не может)

1 голос
/ 10 апреля 2010

В отличие от языков более высокого уровня, на самом деле не так уж много различий (если таковые имеются) между способностью читать ассемблер и записывать его. Инструкции имеют непосредственное отношение к кодам операций ЦП - пропустить их несложно, сохраняя при этом понимание того, что делает строка кода. (Это не похоже на язык более высокого уровня, где вы можете видеть строку с надписью «print $ var» и не должны знать или заботиться о том, как он выводит его на экран.)

Если вы все еще хотите изучать ассемблер, попробуйте книгу Язык ассемблера, шаг за шагом: программирование в Linux , автор Jeff Duntemann.

0 голосов
/ 10 апреля 2010

Я уверен, что есть вводные книги и веб-сайты, но довольно эффективный способ узнать это на самом деле получить ссылки на Intel, а затем попытаться сделать простые вещи (такие как целочисленная математика и логическая логика) в вашем любимом язык высокого уровня, а затем посмотрите, что получился в результате двоичный код.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...