Я знаю, что во время вызова функции регистр EBP указывает на первое значение, которое вызываемая функция нажимает на стек. Но когда основная функция вызывается в первый раз, на что указывает регистр EBP? Является ли это первой локальной переменной, которая нажимается на стек основной функцией?Что такое регистр EBP, указывающий на выполнение основной функции? (Архитектура Intel x82)
ответ
Не определено, где ebp
указывает, когда функция введена. Функциональный пролог (который является частью функции) делает ebp
точкой кадра стека, хотя пролог можно опустить, если он не нужен или может сделать что-либо еще с ebp
, пока он восстанавливает значение при возврате. main
в этом не отличается.
Значение ebp
до того, как операционная система инициализируется main()
, поэтому вам нужно указать, какую ОС вы используете.
Говоря о Linux и libc
, существует функция до main()
, которая называется _start
. Но до _start
позиция ebp
и esp
определяется ядром Linux при распределении стека. И большую часть времени значение по умолчанию добавляется к смещению для реализации ASLR (рандомизация макета адреса-пространства).
Исходный 'ebp' не определен в ABI, но ядро linux устанавливает его в ноль. – Jester
@Jester: он не определен в ABI, но не обязательно, когда выполняется 'main()'. Или у вас возникла бы настоящая проблема ... – perror
Он не определен даже при входе в 'main', и нет, это не создает проблемы, потому что любая функция, которая хочет указатель кадра, должна сама установить ее. См. Ответ @ StenSoft. – Jester
Фактически, если 'ebp' используется как указатель кадра, он обычно указывает на * old *' ebp', так как нормальный код ввода функции - 'push ebp; mov ebp, esp'. – EOF
Почему вы хотите знать? –