Zachowanie ebp i esp w stosach przy użyciu funkcji z parametrem
chcę dowiedzieć się więcej o stosie. Zwłaszcza, co się dzieje, gdy wywoływana jest funkcja z parametrem. W tym celu piszę następujący kod:
#include <stdio.h>
int sum(int d, int e, int f){
int result = d + e + f;
return result;
}
int main(void){
int a = 5;
int b = 4;
int c = 2;
int erg = sum(a,b,c);
printf("Result is: %d", erg);
}
i otrzymuję następujący kod zgromadzenia (dodam tylko częśćmain
funkcja, ponieważ najpierw chcę zrozumieć tę sekcję):
push ebp,
mov ebp, esp
and esp, -16
sub esp, 32
mov DWORD PTR[esp+28], 5
mov DWORD PTR[esp+24], 4
mov DWORD PTR[esp+20], 2
mov eax, DWORD PTR[esp+20]
mov DWORD PTR[esp+8], eax
mov eax, DWORD PTR[esp+24]
mov DWORTD PTR[esp+4], eax
mov eax, DWORD PTR[esp+28]
mov DWORD PTR[esp], eax
call sum
........
........
Więc w tej części narysuję dla siebie mały szkic. Proszę spojrzeć :) Moje pytanie: Gdzie jest w tym momencie mojeebp
? Ze względu na linię 2 mojego kodu asemblera musi znajdować się w tym samym miejscu, co[esp]
, dobrze ?
Teraz część funkcji sumy, która wynika z mojego drugiego pytania.
więc oto kod montażu tego:
push ebp
mov ebp, esp
sub esp, 16
mov eax, DWORD PTR[ebp+12]
mov edx, DWORD PTR[ebp+8]
mov edx, eax
------------
więc dowiedziałem się, że możemy zawsze znaleźć nasze parametry[eb+12]
i[ebp+8]
. (Pominąłem trzeci parametr, ponieważ chcę to uprościć). Moje pytanie brzmi teraz: jeśli założę toesp
=ebp
i patrzę na mój szkic, a potem widzę, że nic nie ma[esp+12]
lub teraz[ebp+12]
. Niemniej jednak jest on używany. Jak mogę to sobie wyobrazić?
Czy ktoś może mi pomóc? Przeczytałem tak wiele dokumentów, ale nikt nie wydaje się szkicować tych rzeczy. Z tego powodu bardzo trudno to zrozumieć.
Dziękuję Ci!
Oto mój szkic: