Проблемы с пониманием стандартной последовательности ввода - PullRequest
4 голосов
/ 29 марта 2010

Стандартная последовательность ввода :

_function:
    push ebp       ;store the old base pointer
    mov ebp, esp   ;make the base pointer point to the current
                   ;stack location – at the top of the stack is the 
                   ;old ebp, followed by the return address and then
                   ;the parameters.
    sub esp, x     ;x is the size, in bytes, of all
                   ;"automatic variables" in the function

вверху стека находится старый ebp, за которым следует обратный адрес а затем параметры.

Старый ebp существует, потому что push ebp,

но почему адрес возврата и параметры там тоже есть?

UPDATE

Стандартная последовательность выхода

mov esp, ebp   ;reset the stack to "clean" away the local variables
pop ebp        ;restore the original base pointer
ret            ;return from the function

Что на самом деле делает ret Я думаю, что esp должен был уже достичь обратного адреса в строке pop ebp

Ответы [ 2 ]

4 голосов
/ 29 марта 2010

В стандартном соглашении о вызовах x86 перед вызовом функции параметр сначала помещается в стек.

А call op означает «отправить следующий адрес в стек, а затем перейти к функции», поэтому адрес возврата также находится в стеке.

Это означает, что до push ebp стек выглядит следующим образом:

 ...
 param2
 param1
 param0
 return_address  <- esp

После звонка push ebp становится

 ...
 param2
 param1
 param0
 return_address
 ebp            <- esp

Наконец, mov ebp, esp сохраняет этот esp в ebp, поэтому вы можете обратиться к адресу возврата и всем входным параметрам, относящимся к ebp, и освободить стек для локального использования.

0 голосов
/ 29 марта 2010

Это все часть ABI. По соглашению вызывающая сторона создает stack frame, который содержит параметры и т. Д., А затем вызывает функцию (во время этого процесса адрес возврата также помещается в стек). Вызываемая функция выделит дополнительное пространство в стеке для локальных переменных и может ссылаться на параметры и локальные переменные через один общий указатель и смещение.

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