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)?
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. –
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
http://en.wikipedia.org/wiki/Stdarg.h –