Обучение считать ассемблерный вывод GCC

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

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

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

37
задан porgarmingduod 9 April 2010 в 23:34
поделиться

6 ответов

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

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

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

21
ответ дан 27 November 2019 в 04:53
поделиться

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

Если вы все еще хотите изучить ассемблер попробуйте книгу Джеффа Дантеманна Пошаговое руководство на языке ассемблера: программирование в Linux .

1
ответ дан 27 November 2019 в 04:53
поделиться

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

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

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

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

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

2
ответ дан 27 November 2019 в 04:53
поделиться

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

23
ответ дан 27 November 2019 в 04:53
поделиться

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

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

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

3
ответ дан 27 November 2019 в 04:53
поделиться

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

0
ответ дан 27 November 2019 в 04:53
поделиться