Нет, потому что 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
? Скорее описание того, что он делает, будет более полезным.