Является ли регистр 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, и вы закончите. Я бы даже утверждал, что использование указателей фреймов стека в рукописной сборке подобно копированию поведения тридцатилетнего компилятора, когда компиляторы были действительно глупыми и не могли обойтись. Это не обязательно и полезно, если вы пишете сборку.