код сборки x86 базовый - PullRequest
       1

код сборки x86 базовый

0 голосов
/ 24 февраля 2012

Что делает следующий код ...

</p> <pre><code> 0x080489b0 <+0>: push %ebp 0x080489b1 <+1>: mov %esp,%ebp 0x080489b3 <+3>: sub $0x14,%esp 0x080489b6 <+6>: push %ebx

Насколько мне известно, это устанавливает стек в первые две строки, а затем толкает% esp вниз 14, существенно увеличивая стек в третьей строке, и, наконец, помещает% ebx в стек (даже если он пуст) что также увеличивает стек и отталкивает% esp вниз еще на одну точку.

Я неправ на любом из этих шагов? Спасибо за любую помощь!

Ответы [ 2 ]

1 голос
/ 24 февраля 2012

Вы примерно правы. Третья инструкция (sub $ 0x14,% esp) фактически означает увеличение стека на 0x14 = 20 байт, возможно, по причинам выравнивания. Четвертая строка означает помещать 4-байтовое содержимое% ebx в стек, вычитая 4 из% esp в качестве побочного эффекта. Причина этого заключается в том, что% ebx является регистром сохранения вызовов: если функция изменяет содержимое% ebx, ожидается, что она поместит% ebx в стек, затем изменит% ebx, затем pop% ebx вернется из стека так, чтобы что вызывающая сторона никогда не замечает изменения в% ebx. Другими регистрами сохранения вызовов на x86 являются% esi и% edi.

1 голос
/ 24 февраля 2012

Не совсем.sub $0x14, %esp вычитает шестнадцатеричный 0x14 (десятичный 20) из указателя стека, что эквивалентно пространству, используемому 5 словами.

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