#ассемблер
Для чего нужен регистр ebp, если есть esp?
Ответы
Ответ 1
Один из типичных способов использования регистра 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.Ответ 2
Ну, я бы ответствовал так - все это регистры общего назначения, но в основном они применяются для работы со стеком (хотя не исключены и иные применения); обычно esp указывает текущее состояние стека, а ebp - начало кадра стека для данного вызова функции, так что не придется мучиться с адресами локальных переменных при каждом изменении в стеке. Например, при дополнительном выделении памяти в стеке или еще чем-то в таком роде.
Комментариев нет:
Отправить комментарий