Используя этот пример, исходящий из wikipedia, в котором DrawSquare() вызывает DrawLine(),
(Обратите внимание, что эта диаграмма имеет верхние адреса внизу и низкие адреса вверху.)
Может ли кто-нибудь объяснить мне, что ebp
и esp
в этом контексте?
Из того, что я вижу, я бы сказал, что указатель стека всегда находится в верхней части стека, а базовый указатель на начало текущей функции? Или что?
edit: Я имею в виду это в контексте оконных программ
edit2: И как работает eip
?
edit3: У меня есть следующий код из MSVС++:
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 развиваются в те моменты (я уже понял, как работает пролог, я просто хочу знать, что происходит после того, как я нажал аргументы в стеке и перед прологом).