Почему базовый указатель указывает на вершину стека?

В книге "Программирование с нуля" я вижу фрейм стека при вызове функции примерно так

parameter 2    <- 12(%ebp)
parameter 1    <-  8(%ebp)
return address <-  4(%ebp)
ebp            <-   (%ebp)
local var 1    <- -4(%ebp)
local var 2    <- -8(%ebp) and (%esp)

В нем говорится, что когда функция возвращается, она сохраняет возвращаемое значение в %eax, затем восстанавливает %ebp а также %esp в позицию до вызова функции, затем ret вытолкнет все, что находится на вершине стека, и укажет %eipна этот адрес (который должен быть обратным адресом). Но когда я вижу код, я подозреваю, что строка

movl %ebp, %esp # This
popl %ebp       # And this
ret

Почему он указывает базовый указатель на вершину стека? Не когдаpopl выполняется, исчезнет только одна локальная переменная (потому что именно там %esp указывает?)

0 ответов

Другие вопросы по тегам