Используя этот пример из Википедии, в которой DrawSquare () вызывает DrawLine (),
(Обратите внимание, что эта диаграмма имеет высокие адреса внизу и низкие адреса вверху.)
Может ли кто-нибудь объяснить мне, что ebp
и esp
в этом контексте?
Из того, что я вижу, я бы сказал, что указатель стека всегда указывает на вершину стека, а базовый указатель - на начало текущей функции? Или что?
редактировать: я имею в виду это в контексте программ Windows
edit2: И как тоже eip
работает?
edit3: у меня есть следующий код из MSVC ++:
var_C= dword ptr -0Ch
var_8= dword ptr -8
var_4= dword ptr -4
hInstance= dword ptr 8
hPrevInstance= dword ptr 0Ch
lpCmdLine= dword ptr 10h
nShowCmd= dword ptr 14h
Все они кажутся мечами, поэтому занимают по 4 байта каждый. Таким образом, я вижу, что разрыв от hInstance до var_4 составляет 4 байта. Кто они такие? Я предполагаю, что это обратный адрес, как видно на картинке из Википедии?
(примечание редактора: удалена длинная цитата из ответа Майкла, которая не относится к данному вопросу, но дополнительный вопрос был отредактирован в):
Это потому, что поток вызова функции:
* Push parameters (hInstance, etc.)
* Call function, which pushes return address
* Push ebp
* Allocate space for locals
Мой вопрос (последний, я надеюсь!) Теперь таков: что именно происходит с того момента, как я выдвигаю аргументы функции, которую я хочу вызвать, до конца пролога? Я хочу знать, как ebp, esp развиваются в эти моменты (я уже понял, как работает пролог, я просто хочу знать, что происходит после того, как я поместил аргументы в стек и перед прологом).