пару вопросов:
1. Написано, что ebp обычно указывает на return instruction pointer, здесь имеется в виду, что с помощью него легко вычислить указатель на предыдущий фрейм? Потому что я читал, что сам регистр bp статически указывает на начало фрейма, а по адресу хранится указатель на предыдущий bp(я так понимаю, для профилировалия, чтоб пробежаться по стеку)
2. Написано, что процессор автоматически ссылается на ss регистр для операциями со стеком. Здесь же просто имеется я виду, что автоматически смещение проставляется по отношению к текущему сегменту ss?
1: это совершенно не обязательно; 2: это значит, что при чтении со стека или записи в него, автоматически используется сегмент в SS
1. А на практике какие-то компиляторы так делают? 2. Да, это и имел в виду, спасибо
1: как именно? почти все компиляторы со включённой оптимизацией могут не использовать ebp в качестве указателя фрейма
ebp для указателя на return instruction pointer
Почитай про -fno-omit-frame-pointer
Да, я уже глянул на годболт, что его вообще нет, но мне скорее интересно, когда он есть
это поведение по умолчанию у большинства в т.ч. при отключённой оптимизации, только ebp не на return указывает, а на старое значение ebp, после которого уже идёт return instruction pointer
Ну цепочка строится только если явно no-omit укажешь. Для исполнения программы эти фрейм поинтеры не особо нужны за исключением редких конвенций вызова.
return ip разве не после первого ebp идет(в смысле после ebp callee)?
обычно функции при входе сразу сохраняют ebp, в конце обычно делается: mov esp, ebp pop ebp ret
а где ты картинку взял?
1 том интеловского манула 6.2
> что с помощью него легко вычислить указатель на предыдущий фрейм ... если он вообще пишется в ebp например на том же GCC его генерацию можно отключить с помощью -fomit-frame-pointer
у меня, кстати, прямо под картинкой хороший абзацс пояснением твоего второго вопроса
Вопросы для пидоров
но лучше оставить решение на усмотрение компилятора, ибо адресация по стеку относительно ebp генерирует более короткие инструкции
Ну там только написано, что сегмент автоматически используется, который сейчас в ss, но что это на уровне адресации значит не совсем было понятно
это не совсем так - оно отключает их только там где он не используется внутри функции :)
ну тогда ладно, но оно емнип и так включается на O2/O3
следующее предложение прочитай
Обсуждают сегодня