Подтвердить что ты не робот

Регистры сборки 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... Пожалуйста, дайте недвусмысленный ответ. Спасибо!

4b9b3361

Ответ 1

Начальное значение для %ebp обычно равно 0. Это значит, что отладчики знают, когда заканчивать цепочку ссылок в backtrace.

Вы должны думать о %ebp как о контрольной точке. Для удобства он помещается между аргументами функции и локальными переменными. Таким образом, вы получаете доступ к аргументам с положительным смещением, а переменные с отрицательным смещением, поэтому легко определить, имеете ли вы доступ к переменной или аргументу.

Ответ 2

Как вы сказали, стек растет. Итак, вы вычитаете, чтобы увеличить стек для локальных жителей. Вы добавляете, чтобы оглянуться назад в стек для хранимых там элементов.