регистры сборки esp и ebp - PullRequest
       75

регистры сборки esp и ebp

16 голосов
/ 03 декабря 2011

Я сейчас изучаю сборку для процессоров Intel. Поскольку стек «растет вниз», почему мы должны добавить его для доступа к определенному элементу

[ebp + 8] ;; This will access the first param

Я знаю, что мы должны пропустить старое значение ebp и адрес возврата, и поэтому мы используем 8 (потому что каждый имеет длину 4 байта). Это немного странно.

Кроме того, если ebp является резервной копией для esp , каково значение ebp в основной функции Пример:

_start:

;; what's 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 ... Пожалуйста, дайте однозначный ответ. Спасибо!

Ответы [ 2 ]

14 голосов
/ 03 декабря 2011

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

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

2 голосов
/ 03 декабря 2011

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

...