2012-02-24 4 views
0

Что делает следующий код делать ...x86 код сборки основной

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

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

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

ответ

1

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

+0

Хорошо, я понимаю, что забыл, что 0x14 находится в шестнадцатеричном виде, поэтому он увеличивает стек на 20 байт. Я думал, что стек будет расти, но не был уверен, потому что я не мог понять, как это поможет, поэтому вернемся к чтению для меня, я думаю: P спасибо! – yiati

1

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

+0

О да, я всегда забываю преобразовать шестнадцатеричный в десятичный: P, чтобы стек расширился от этого на 5 слов. Благодаря! – yiati

+0

Это может быть установка пространства для: 5 «локальных» слов или «локальной» переменной для хранения 20-байтовой строки. – Gunner

Смежные вопросы