Використовуючи цей приклад із вікіпедії, в якій 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 за ці моменти (я вже зрозумів, як працює пролог, просто хочу знати, що відбувається після того, як я натиснув аргументи на стек і перед прологом).