sobota, 20 sierpnia 2011

Konwencje wywołań


Witam!
Chyba każdy programista spotkał się z funkcjami. Mają one nazwę, argumenty, ramkę stosu etc. W ich skład wchodzą również tajemnicze konwencje wywołań. Jest ich 4 z czego tylko 3 są wykorzystywane. Ich działanie omówię poniżej:
cdecl
Dosyć enigmatyczna nazwa ;) Oznacza ona C (style) Declare(Function).
Aby wywołać taką funkcję w asemblerze caller(wywołujący funkcje) musi umieścić argumenty na stosie, wywołać funkcje a potem obliczyć wielkość argumentów i zdjąć je ze stosu. Wszystkie funkcje ze standardowej biblioteki C są właśnie wywoływane w tej konwencji. Warto nadmienić, że argumenty wrzucamy na stos od tyłu. Wynika to z budowy stosu.
Przykład:
push arg2
push arg1
call [Foo]
sub esp,2*4
Jak widać wrzucamy argumenty "od tyłu". Następnie wywołujemy funkcje, po czym czyścimy stos(każdy argument na stosie ma 4 bajty dlatego 2*4). W kompilatorach C możemy narzucić tą konwencję na naszą funkcję pisząc _cdecl(lub __cdecl w bcc32 i kompilatorze M$)
Pascal
To bardzo stara konwencja używana w bardzo starych kompilatorach języka Pascal. Cechą szczególną jest wrzucanie argumentów na stos od przodu(!). Uniemożliwia to znaną z cdecl zmienną liczbę argumentów. Był to główny powód zaprzestania implementacji tej konwencji.
#edit Konwencji tej używały: QuickBasic i Windows 3.1 API. Jest możliwość wymuszenia jej w niektórych kompilatorach(np. we FreeBasic'u).
stdcall
To chyba najwygodniejsza z konwencji wywołań. Argumenty podajemy od tyłu na stos i wywołujemy funkcję. Nie martwimy się czyszczeniem stosu ponieważ zajmuję się tym calle. Również uniemożliwia podawanie zmiennej ilości argumentów(tzn. umożliwia jednak jest to dosyć problematyczne). Przykład:
push arg2
push arg1
call [StdBoo]
Fastcall
Najbardziej zależna od kompilatora konwencja wywołań. Argumenty umieszczamy w rejestrach. To w jakich rejestrach oraz w jakiej kolejności zależy od używanego kompilatora.
Istnieje jeszcze kilka pomniejszych konwencji wywołań które są raczej mniej popularne jak np. safecall czy thiscall
Więcej info na:
http://en.wikipedia.org/wiki/X86_calling_conventions

Brak komentarzy:

Prześlij komentarz

Popularne posty