6

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)?

risposta

19

Perché, con la convenzione di chiamata C, la funzione chiamata sarà non pop i parametri. Questo è il punto di questa convenzione di chiamata.

Permette cose come argomenti variabili.

+0

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. –

+1

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

+0

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

6

E 'stato proprio lì sulla pagina di wikipedia sopra l'intestazione _cdecl

In queste convenzioni il chiamante pulisce gli argomenti dallo stack, che permette di elenchi di argomenti variabili, ad esempio. printf().

Problemi correlati