Регистр ebp
(базовый указатель) часто используется при обработке кадров стека (разные «уровни» стека). Хотя указатель стека может меняться в зависимости от того, что вы нажимаете и извлекаете, базовый указатель остается неизменным, пока вы находитесь на одном уровне стека.
Таким образом, вы можете получить все локальные переменные на одной стороне ebp
(например, mov ax,[ebp-8]
) и все переданные параметры на другой стороне (например, mov ax,[ebp+12]
), а также любые другие местоположения которые относятся к ebp
, например к коду возврата в некоторых случаях.
Причина, по которой у вас есть предыдущее содержимое базового указателя, помещенного в стек, заключается в том, что легко восстановить значение при переходе к предыдущему кадру стека. Вы просто вставляете это значение в ebp
и оно восстанавливается, то есть вы можете получить доступ к локальным и переданным параметрам для следующего уровня.
В этой статье представлен графический обзор того, как он может работать, что я обычно считаю бесценным:
+------------------+
+-> | prev-prev EBP |
| +------------------+
| | function param 2 |
| +------------------+
| | function param 1 |
| +------------------+
| | return address |
| +------------------+
+---| previous EBP | <-- current EBP
+------------------+
| local var 1 |
+------------------+
То, как это работает, заключается в том, что вы передаете параметры функции, а затем просто вызываете эту функцию. Код пролога в начале функции выглядит примерно так:
push ebp ; save old base pointer.
mov ebp, esp ; set new copy.
sub esp, 16h ; allocate space for local variables.
, который сохраняет старый ebp
и устанавливает новый, указывая на переменные, выдвигаемые вызывающим кодом. Вычитание из указателя стека предназначено для выделения места для местных жителей.
Как указано, это означает, что переданные параметры можно получить с помощью [ebp+N]
, а локальные - с [ebp-N]
.
Код эпилога является обратной операцией:
add esp, 16h ; forget about locals.
pop ebp ; restore previous value
ret ; return to calling code.
, после чего ebp
теперь устанавливается на прежнее значение.