Почему мы" нажимаем 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 быть сложным, если не невозможным, в зависимости от того, как функция использует стек. Создание кадра стека обычно безопаснее, за счет использования нескольких байтов пространства стека для сохранения указателя на кадр стека вызывающего абонента.