2015-05-01 8 views
1

Я знаю, что во время вызова функции регистр EBP указывает на первое значение, которое вызываемая функция нажимает на стек. Но когда основная функция вызывается в первый раз, на что указывает регистр EBP? Является ли это первой локальной переменной, которая нажимается на стек основной функцией?Что такое регистр EBP, указывающий на выполнение основной функции? (Архитектура Intel x82)

+3

Фактически, если 'ebp' используется как указатель кадра, он обычно указывает на * old *' ebp', так как нормальный код ввода функции - 'push ebp; mov ebp, esp'. – EOF

+0

Почему вы хотите знать? –

ответ

5

Не определено, где ebp указывает, когда функция введена. Функциональный пролог (который является частью функции) делает ebp точкой кадра стека, хотя пролог можно опустить, если он не нужен или может сделать что-либо еще с ebp, пока он восстанавливает значение при возврате. main в этом не отличается.

1

Значение ebp до того, как операционная система инициализируется main(), поэтому вам нужно указать, какую ОС вы используете.

Говоря о Linux и libc, существует функция до main(), которая называется _start. Но до _start позиция ebp и esp определяется ядром Linux при распределении стека. И большую часть времени значение по умолчанию добавляется к смещению для реализации ASLR (рандомизация макета адреса-пространства).

+0

Исходный 'ebp' не определен в ABI, но ядро ​​linux устанавливает его в ноль. – Jester

+0

@Jester: он не определен в ABI, но не обязательно, когда выполняется 'main()'. Или у вас возникла бы настоящая проблема ... – perror

+0

Он не определен даже при входе в 'main', и нет, это не создает проблемы, потому что любая функция, которая хочет указатель кадра, должна сама установить ее. См. Ответ @ StenSoft. – Jester