2009-10-08 13 views
6

Od: http://en.wikipedia.org/wiki/X86_calling_conventionsDlaczego wywołujący musi wyczyścić stos w konwencji wywoływania cdecl?

push c 
push b 
push a 
call function_name 
add esp, 12 ;Stack clearing 
mov x, eax 

Dlaczego musimy jawnie dodać 12 do ESP wyczyścić stos od wywoływana funkcja powinna poped parametry ze stosu dlatego przywracającej wskaźnik stosu ...?

Kolejne pytanie:

Teoretycznie byłoby to możliwe do realizacji różnych funkcji parametrów z odbierającym uważając prawa czyszczenia (na przykład jeśli przejdą szereg argumentów na stosie w rejestrze)?

Odpowiedz

19

Ponieważ, w konwencji wywoływania C, wywołana funkcja będzie nie pop parametrów. Właśnie o to chodzi w tej konwencji.

Pozwala na takie rzeczy jak zmienne argumenty.

+0

Dokładnie. Dzięki funkcjom C, wywołujący może wypchnąć tyle argumentów na stosie, ile chce, przed wywołaniem funkcji. Wywoływana funkcja po prostu nie wie, ile powinno zostać oczyszczonych. –

+1

w jaki sposób użytkownik będzie wiedział, z ilu parametrów został wywołany, aby mógł bezpiecznie uzyskać do nich dostęp? W przypadku printf() może on parsować ciąg formatu, ale poza tym jak to robi? – anon

+0

http://en.wikipedia.org/wiki/Stdarg.h –

6

Było tam na stronie wikipedia powyżej nagłówka _cdecl

W tych konwencji rozmówca czyści argumentów ze stosu, co pozwala na listach zmiennych argumentów, np. printf().

Powiązane problemy