x86 $ esp Странно меняется - PullRequest
       0

x86 $ esp Странно меняется

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

Я разбираю некоторый код сборки x86, скомпилированный с GCC для назначения.

Непосредственно перед вызовом функции у меня есть:

$esp = 0xffffdbd0

Установка точки останова в самой первой строкевызываемой функции (даже до push) дает:

$esp = 0xffffdbcc

После нажатия:

$esp = 0xffffdbc8

Так почему же $esp изменяется таким образом?Теоретически, просто переход к функции не должен изменять указатель стека, а затем он меняется после push?Что происходит?

Я предполагаю, что это связано с выравниванием, и что каким-то образом происходит какое-то выравнивание за моей спиной с инструкциями по сборке call и push.Но это предположение;Понятия не имею.

Может кто-нибудь, кто знает, уточнить?

Ответы [ 3 ]

4 голосов
/ 27 февраля 2012

Когда вы выполняете инструкцию CALL, адрес инструкции сразу после CALL помещается в стек. Это делается для того, чтобы при выполнении инструкции RET программа могла вернуться назад к нужному адресу и продолжить выполнение инструкций. Помещение этого адреса в стек означает, что вы можете иметь вложенные CALL s и без проблем возвращаться к правильному адресу в каждом RET.

Поскольку это 32-битная система, в стек будет помещено 4 байта:

0xffffdbd0 - 0xffffdbcc = 0x4
3 голосов
/ 27 февраля 2012

Инструкция call помещает адрес первой инструкции после себя в стек, прежде чем перейти к месту назначения.Таким образом, ret знает, куда идти после возврата функции.

2 голосов
/ 27 февраля 2012

Ваше предположение

Теоретически, простое обращение к функции не должно изменять указатель стека

совершенно неверно.Переход к функции делает именно это: он изменяет указатель стека, в частности он помещает туда адрес возврата.«Нажатие» в x86 (и почти в любой другой арке) всегда означает неявное уменьшение указателя стека и сохранение значения, которое будет помещено в него.

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