в начале каждой функции ebp указывает, куда бы она ни требовала вызывающая функция, это не относится к текущей функции, пока код текущей функции не решит ее использовать.ebp - это просто указатель стекового фрейма на тот случай, если вы захотите иметь фрейм стека.Идея в том, что ВЫ МОЖЕТЕ использовать ebp, чтобы иметь постоянную ссылку на стек для вашей функции, в то время как вы можете продолжать добавлять или удалять элементы в стеке, используя esp.Если бы вы не использовали указатель стека и продолжали использовать esp в качестве ссылки на стек, то, где конкретный элемент в стеке в течение вашей функции изменяется в зависимости от esp.если ВЫ УСТАНАВЛИВАЕТЕ ebp до того, как начнете использовать стек (кроме как для сохранения ebp), то у вас будет фиксированный относительный адрес к параметрам в стеке, о которых заботится ваша функция, таким как переданные параметры, локальные переменные и т. д.
Вы можете свободно использовать eax, edx или любой другой регистр в качестве указателя фрейма стека в своей функции, ebp является регистром общего назначения, который вы можете использовать для фреймов стека, поскольку x86 исторически имел зависимость от стека (адреса возврата,и старые соглашения о вызовах были основаны на стеке).Другие наборы команд с большим количеством регистров могут просто выбрать регистр для реализации компилятора в качестве указателя на функцию / указатель фрейма стека.Если у вас есть возможность и решили использовать стек стека.Он записывает регистр, который вы могли бы использовать для других целей, записывает больше кода и времени выполнения.Как и при использовании других регистров общего назначения, ebp является энергонезависимым в соответствии с соглашениями о вызовах, используемыми сегодня, вам необходимо сохранить его и вернуть так, как вы его нашли.Так что это указывает на конкретную функцию.То, на что оно указывало, когда ваша функция была введена, было специфичным для вызывающей функции.
Конкретная реализация компилятора может выбрать наличие стековых фреймов и может выбрать способ использования ebp.И если он всегда используется одинаково при включении, то с этим набором инструментов у вас может быть отладчик или другой инструмент, который может воспользоваться этим.Например, если первое, что нужно сделать в функции, это поместить ebp в стек, то адрес возврата вызывающей функции в любой функции, относящейся к ebp, является фиксированным (ну, если не было некоторой оптимизации хвоста, то, возможно, она является вызывающей стороной вызывающего (звонящий (звонящего))).Вы записываете регистр, пространство стека и пространство кода для этой функции, но, подобно компиляции для отладки, вы можете скомпилировать кадр фрейма стека во время разработки, чтобы использовать эти функции.
Причина, по которой вы начинаете с толчка, заключается в том, что это хороший способ использовать указатель кадра и определить согласованное местоположение.помещая его в стек как первое, что вы делаете: 1) сохраняет ebp, чтобы избежать сбоя вызывающей (ых) функции (ей). 2) определяет постоянные адреса эталонной точки.функция.Локальные переменные находятся по фиксированным адресам выше ebp для такой схемы.Компиляторы, так же как и люди, более чем способны к тому, чтобы не нуждаться в этом, мой первый параметр может быть на уровне esp-20 в одной точке кода, и я могу затем добавить еще 8 байтов в стек теперь, когда этот же параметрв esp-28 просто закодируйте его как таковой.но для целей отладки выполняется отладка созданного кода, а иногда, например, поиск адреса возврата с фиксированным смещением.запись другого регистра, IMO ленивая, но, безусловно, может помочь отладить и повысить качество вывода компилятора.Находите ошибки в выходных данных компилятора быстрее и помогите людям, пытающимся прочитать код, быстрее понять его с меньшими усилиями.при правильном использовании указателя фрейма стека все параметры и локальные переменные имеют фиксированное смещение по отношению к указателю фрейма стека на протяжении всей функции между точками, в которых указатель фрейма стека устанавливается и очищается.нажмите указатель, чтобы сохранить его, установите указатель кадра на указатель стека со смещением или без него.до появления указателя кадра перед возвратом.