Является ли регистр EBP (указатель базового кадра) только для отладки в x86?
Изучение сборки x86 и указатель кадра немного раздувает мой разум. Я узнал из этого SO вопрос, что EBP делает жизнь отличной для отладки. Это здорово, но мне было любопытно: "Для чего еще используется EBP?" Глядя на стек вызовов Статья в Википедии, EBP необходима для динамического распределения стека.
Поскольку я всегда был в предположении, что динамическое распределение распространяется на кучу. Итак, почему я хотел бы использовать динамическое распределение стека - почему не достаточно кучи? И как полезен для этого EBP?
Ответы
Ответ 1
Выделение небольшого объема памяти из стека чрезвычайно быстро по сравнению с распределением кучи. Когда мы выделяем память из кучи, мы должны вызывать API или диспетчер памяти.
ДА вы можете использовать регистр EBP также для любых других целей, таких как другие 32-битные регистры, но сначала вы должны сохранить его содержимое и после этого восстановить до выхода из процедуры.
Вы можете использовать PUSH EBP
для хранения содержимого EBP в стеке и POP EBP
для восстановления.
Ответ 2
Вы ошибочно полагаете, что ebp
необходим для распределения фреймов стека. Это неверно, esp
можно использовать напрямую.
Использование ebp
в качестве указателя кадра стека никоим образом не требуется в наши дни. Есть несколько моментов, где было полезно:
-
В 16-битном коде использование sp
(указатель стека) при адресации было строго ограничено, относительная адресация вообще не была возможна вообще в x86, где bp
можно было использовать в каждой адресации доступный режим.
-
Причины этой ограниченной поддержки были, возможно, компиляторами, доступными тогда, гораздо проще генерировать код с указателями фреймов, чтобы отслеживать постоянно меняющийся sp
. Есть еще много процессоров, которые имели специальную поддержку инструкций фрейма стека, таких как leave
или enter
, но AFAIK никто, кроме Intel, не зашел так далеко, чтобы калечить реальный sp
в этом процессе: -)
-
Debugging. Гораздо проще раскрутить стек, если доступны указатели на кадры, но современные отладчики могут делать даже без него.
Если вы хотите выделить 100-байтовое пространство в стеке, просто sub esp, #100
, получите доступ к пространству с move [esp + x]
, где x
находится между 0 и 99 и очистите с помощью add esp, #100
, и вы закончите. Я бы даже утверждал, что использование указателей фреймов стека в рукописной сборке подобно копированию поведения тридцатилетнего компилятора, когда компиляторы были действительно глупыми и не могли обойтись. Это не обязательно и полезно, если вы пишете сборку.