Korzystając z tego przykładu pochodzącego z wikipedii, w której DrawSquare () wywołuje DrawLine (),
(Pamiętaj, że ten diagram ma wysokie adresy u dołu i niskie adresy u góry).
Czy ktoś mógłby mi wyjaśnić, co ebp
i esp
w tym kontekście?
Z tego, co widzę, powiedziałbym, że wskaźnik stosu zawsze wskazuje na górę stosu, a wskaźnik bazowy na początek bieżącej funkcji? Albo co?
edycja: Mam na myśli to w kontekście programów Windows
edit2: A jak to eip
działa?
edit3: Mam następujący kod z 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
Wszystkie wydają się być dwordami, dlatego zabierają 4 bajty każdy. Widzę więc, że między hInstance a var_4 występuje 4-bajtowa przerwa. Czym oni są? Zakładam, że jest to adres zwrotny, jak widać na zdjęciu w Wikipedii?
(uwaga redaktora: usunąłem długi cytat z odpowiedzi Michaela, który nie należy do pytania, ale edytowano pytanie uzupełniające):
Wynika to z faktu, że przepływ wywołania funkcji jest następujący:
* Push parameters (hInstance, etc.)
* Call function, which pushes return address
* Push ebp
* Allocate space for locals
Moje pytanie (na koniec, mam nadzieję!) Brzmi teraz: co dokładnie dzieje się od momentu, gdy podskakuję argumenty funkcji, którą chcę wywołać do końca prologu? Chcę wiedzieć, jak ewoluują ebp, esp w tych momentach (już zrozumiałem, jak działa prolog, chcę tylko wiedzieć, co się dzieje po tym, jak wrzuciłem argumenty na stos i przed prologiem).