6

Von: http://en.wikipedia.org/wiki/X86_calling_conventionsWarum muss der Aufrufer den Stapel in der cdecl-Aufrufkonvention löschen?

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

Warum müssen wir explizit 12 bis ESP fügen Sie den Stapel zu löschen, da die aufgerufene Funktion daher die Parameter vom Stapel poped sollte den Stapelzeiger Wiederherstellung ...?

Eine weitere Frage:

Theoretisch wäre es möglich, variable Parameter-Funktionen mit dem Angerufenen zur Umsetzung des Bereinigungs rechts die Pflege (zum Beispiel, wenn Sie die Anzahl der Argumente auf dem Stack in einem Register übergeben)?

Antwort

19

Da mit der C-Aufrufkonvention die aufgerufene Funktion nicht die Parameter aufrufen. Das ist der Sinn dieser Aufrufkonvention.

Es erlaubt Dinge wie variable Argumente.

+0

Genau. Mit C-Funktionen kann der Aufrufer so viele Argumente auf dem Stapel ausgeben, wie er möchte, bevor er eine Funktion aufruft. Die aufgerufene Funktion weiß einfach nicht, wie viele gereinigt werden sollten. –

+1

Wie weiß der Angerufene, mit wie vielen Parametern er aufgerufen wurde, damit er sicher darauf zugreifen kann? Im Fall von printf() kann es die Formatzeichenfolge parsen, aber sonst wie macht es das? – anon

+0

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

6

Es war direkt auf der Wikipedia-Seite über dem _cdecl Header

In diesen Konventionen, die die Argumente aus dem Stapel der Anrufer reinigt, die zB für variable Argumentlisten ermöglicht. printf().