Определить количество команд из формы сборки - PullRequest
0 голосов
/ 01 мая 2018

У меня есть C-файл, и я преобразовал его в форму сборки, и я хотел бы выяснить, сколько инструкций по основной функции, используя gdb и файл сборки. Как я могу это сделать?

1 Ответ

0 голосов
/ 02 мая 2018

В отладчике введите x/10i main. Это показывает первые десять инструкций после точки входа main. (Вы можете использовать число, отличное от десяти, если хотите). Ищите инструкцию возврата. Это может быть что-то вроде ret или retq. Если он не появляется в первых десяти инструкциях, нажмите клавишу возврата. (Это повторяет / продолжает предыдущую команду, показывая следующие десять инструкций. Вы также вводите x/10i, чтобы продолжить с текущего местоположения.) Когда вы видите инструкцию возврата, считайте инструкции от main до нее.

Вы также можете скомпилировать сборку с помощью ключа -S GCC. Это создаст файл, содержащий источник сборки, имя foo.s, если ваш исходный файл имел имя foo.c. Затем вы можете просмотреть его в текстовом редакторе, чтобы посчитать инструкции от метки main: до возврата. (Этот файл может быть загроможден различной другой информацией - метками без инструкций, комментариями, вставленными компилятором для информационных / отладочных целей, специальными директивами ассемблера, которые не являются инструкциями, и т. Д., Поэтому подсчет инструкций в нем может быть затруднен, если вы не знает, какие вещи являются инструкциями, а какие нет. Отладчик может быть проще использовать для этой задачи, поскольку он показывает необработанные инструкции.)

Технически, функция в C не обязательно компилируется в простой набор последовательных инструкций. Компилятор может встраивать код из вызываемых функций в вызывающую функцию. Теоретически он мог бы поместить инструкции для одной функции в несколько разных мест (хотя, по моему опыту, компиляторы, как правило, этого не делают), с переходами между ними. Таким образом, подсчет инструкций, как правило, не полезен для простых занятий в классе и учебных занятий.

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