Регистры сборки esp и ebp
В настоящее время я изучаю сборку для процессоров Intel.
Поскольку стек "растет", почему мы должны добавить для доступа к определенному элементу
[ebp + 8] ;; This will access the first param
Мне нужно пропустить старое значение ebp и обратный адрес, и поэтому мы используем 8 (поскольку каждый из них имеет длину 4 байта).
Это странно.
Кроме того, если ebp является резервной копией для esp, что такое значение ebp в основной функции
Пример:
_start:
;; what ebp value here ?
push eax
push ebx
call someFunction ;; this will create a stack frame
+-----------+
| param1 |
+-----------+
| param0 | <--- this is [ebp + 8] ( assuming mov ebp, esp )
+-----------+
|ret_address|
+-----------+
| ebp |
+-----------+ <--- esp
А также, когда мы выделяем память для локальных пользователей, мы должны вычесть из ebp...
Пожалуйста, дайте недвусмысленный ответ.
Спасибо!
Ответы
Ответ 1
Начальное значение для %ebp
обычно равно 0. Это значит, что отладчики знают, когда заканчивать цепочку ссылок в backtrace.
Вы должны думать о %ebp
как о контрольной точке. Для удобства он помещается между аргументами функции и локальными переменными. Таким образом, вы получаете доступ к аргументам с положительным смещением, а переменные с отрицательным смещением, поэтому легко определить, имеете ли вы доступ к переменной или аргументу.
Ответ 2
Как вы сказали, стек растет. Итак, вы вычитаете, чтобы увеличить стек для локальных жителей. Вы добавляете, чтобы оглянуться назад в стек для хранимых там элементов.