Da: http://en.wikipedia.org/wiki/X86_calling_conventionsPerché il chiamante deve cancellare lo stack nella convenzione chiamata cdecl?
push c
push b
push a
call function_name
add esp, 12 ;Stack clearing
mov x, eax
Perché abbiamo bisogno di aggiungere in modo esplicito da 12 a ESP per cancellare lo stack dal momento che la funzione chiamata avrebbe dovuto poped i parametri dallo stack quindi ripristinare lo stack pointer ...?
Un'altra domanda:
In teoria, sarebbe possibile implementare funzioni parametro variabile con il chiamato curando il diritto di pulizia (per esempio se si passa il numero di argomenti sullo stack in un registro)?
Esattamente. Con le funzioni C, il chiamante può spingere tanti argomenti in pila come preferisce prima di chiamare una funzione. La funzione chiamata semplicemente non sa quanti ne dovrebbero essere puliti. –
come fa il callee a sapere quanti parametri è stato chiamato in modo che possa accedervi in sicurezza? Nel caso di printf() può analizzare la stringa di formato, ma altrimenti come fa? – anon
http://en.wikipedia.org/wiki/Stdarg.h –