Для чего нужен регистр ebp, если есть esp?
Ответ
Один из типичных способов использования регистра ebp - создание стекового кадра
Если упрощенно, в начале функции состояние регистра esp сохраняется в ebp, и дальше уже адреса аргументов функции и локальных переменных отсчитываются от него. Дальше, в процессе работы функции (и вызываемых ею функций) esp может меняться как угодно, но адрес локальной переменной в этой функции как был, скажем, ebp-8 так и остается им при любых изменениях esp
При адресации локальных переменных можно обойтись и без ebp, но тогда адрес переменной будет рассчитываться как esp+N+var, где N зависит от того, какие изменения произошли с esp после выделения памяти в стеке под локальные переменные. Современные компиляторы, в общем-то, так и делают, а ebp используют для каких-то других целей (например, просто как регистр общего назначения).
Еще небольшое дополнение. В 16-битные времена при сложной адресации (базовый регистр + индексный регистр + смещение, т.е., например, [BP+SI+10h]) в качестве базового регистра можно было использовать только bp и bx (sp нельзя было использовать в качестве базового регистра, т.е. адресация вида [SP+N] невозможна), в качестве индексного - только si и di. Поэтому, если бы не было bp, то пришлось бы обходиться только одним базовым регистром (тогда логичнее было бы bx переименовать в bp (Base Pointer)). При 32-битной адресации разделение не такое строгое, в качестве базового регистра можно использовать любой 32-битный регистр, в качестве индексного - любой кроме esp
Комментариев нет:
Отправить комментарий