Почему базовый указатель указывает на вершину стека?
В книге "Программирование с нуля" я вижу фрейм стека при вызове функции примерно так
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
указывает?)