Есть ли способ заставить gdb давать подробные инструкции по сборке? - PullRequest
0 голосов
/ 16 марта 2020
Например,

вместо push $rbp. он показывает шаги для выполнения такой инструкции как это

sub esp, 4 ; "allocate" space for the new stack item

mov [esp], X ; put new stack item value X in

1 Ответ

3 голосов
/ 16 марта 2020

Нет, потому что push - это отдельная машинная инструкция, поэтому она не будет точной разборкой. Если вам нужно больше подробностей, прочитайте руководство к соответствующей инструкции .

Наличие дизассемблера аннотирование инструкций с псевдокодом в комментариях (или подсказок при наведении курсора в a GUI) может быть интересным, но я не мог представить, чтобы кто-нибудь написал такой, у которого даже есть возможность просто заменить push двумя другими инструкциями везде, где это происходит. (И это сделало бы разборку более раздутой.)

Кстати, эта эмуляция c даже не верна. sub изменяет флаги, в отличие от push. И это будет rsp и 8 в 64-битном режиме, для push %rbp (AT & T) / push rbp (Intel). Может ли операция «PUSH» выполняться с использованием других инструкций? указывает на некоторые другие способы, которыми эмуляция нескольких команд может не быть точно эквивалентом.

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


Если вы хотите, чтобы инструкции asm были аннотированы с помощью рассмотрите возможность просмотра выходных данных asm вашего компилятора в проводнике компилятора Godbolt; это имеет всплывающие ссылки на ISA при наведении курсора для инструкций x86. Я думаю, что он включен по умолчанию. Опция находится в More -> Settings -> Show asm description при наведении.

См. это например , где я скомпилировал в 32-битном режиме, чтобы я мог получить его до push. (Я не думал об отключении оптимизации в 64-битном режиме, пока не скопировал / вставил ссылку: P)

Всплывающее окно для push:

Уменьшает стек указатель, а затем сохраняет исходный операнд на вершине стека. Размеры адресов и операндов определяются и используются следующим образом:

Дополнительная информация доступна в контекстном меню.

Итак, это первый абзац раздела «Описание» из руководства Intel vol.2. Если вы щелкнете правой кнопкой мыши по инструкции pu sh, появится полный текст раздела «Описание» из Intel do c со ссылкой на http://www.felixcloutier.com/x86/PUSH.html.

Но к сожалению, это просто многословный раздел описания, а не быстрый псевдокод для более сложных инструкций, которые имеют неявные операнды, такие как idiv или cdq.

В предыдущих итерациях этой функции, возможно, было что-то более компактное; IDK, если вы регулярно используете asm, он вам не нужен для простых инструкций, а когда вам нужно что-то найти, это, как правило, сложнее, чем подсказка всплывающей подсказки.

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

Нет много инструкций x86, где вы можете с пользой перейти к «более простым» инструкциям. например, вы не хотите, чтобы imul расширился до a shift-and-add l oop или наивного простого добавления l oop, я надеюсь? Но lea можно эмулировать с помощью до 4 команд mov / shift / add.

Неужели cdq действительно будет легче понять, если записать как mov edx,eax / sar edx,31? Скорее описание того, что он делает, будет более полезным.

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