Почему мы" нажимаем EBP "и" MOV EBP, ESP " в вызываемом в сборке?

почему мы push ebp как первое действие в вызываемом объекте функции сборки?

Я понимаю, что тогда мы используем mov edi, [ebp+8] чтобы получить переданные переменные, но наши esp уже указывает на обратный адрес вызывающей функции. Мы можем легко получить доступ к переданным переменным с помощью mov edi, [esp+4] или если мы нажали регистры вызываемого абонента, то mov edi, [esp+16].

Итак, почему у этого дополнительного регистра в cpu (ebp) который вы позже должны управлять в функциях? т. е.

push ebp
mov ebp, esp

...

mov esp, ebp
pop ebp

1 ответов


создание нового стек внутри вызываемого абонента, сохраняя при этом кадр стека вызывающего абонента. Кадр стека обеспечивает последовательный доступ к переданным параметрам и локальным переменным, используя фиксированные смещения относительно EBP в любом месте функции, в то время как ESP свободно продолжать быть изменен по мере необходимости, пока функция выполняется. ESP является движущейся целью, поэтому доступ к параметрам и переменным с использованием динамических смещений относительно ESP can быть сложным, если не невозможным, в зависимости от того, как функция использует стек. Создание кадра стека обычно безопаснее, за счет использования нескольких байтов пространства стека для сохранения указателя на кадр стека вызывающего абонента.