Ni. Il sistema operativo normalmente fa riferimento ad un entrypoint specificato negli header del file eseguibile, che credo possa omettere il normale preambolo della funzione; il punto è che il tuo main non è il "vero" main, il compilatore specifica automaticamente come entrypoint una funzione che si occupa di inizializzare le strutture della libreria C, eventualmente recuperare e parsare la linea di comando e alla fine chiamare il tuo main come una normale funzione.
Sui parametri e i registri, dipende dalla calling convention. I parametri possono essere passati in parte in registri e in parte sullo stack, e la responsabilità della pulizia (pop) dei parametri passati sullo stack può essere della procedura chiamante o di quella chiamata (nel primo caso è possibile avere chiamate a funzioni con numero di parametri variabile, nel secondo si ha risparmio in termini di dimensioni dell'eseguibile dato che il codice di pulizia viene scritto una sola volta in fondo alla procedura invece che a tutti i siti di chiamata).quando quindi viene chiamata una funzione, prima si salvano i parametri, l'sfp( saved frame pointer ) e l'indirizzo di ritorno nel frame pointer e poi si provvede a sottrarre dal top dello stack lo spazio relativo del frame pointer?
L'indirizzo di ritorno su x86 viene salvato automaticamente dall'istruzione CALL, e quindi in genere segue immediatamente il push dei parametri.
Il saved frame pointer (ovvero il valore generato da PUSH esp) può essere necessario o meno; in genere se la procedura non contiene array allocati sullo stack di dimensione non nota non è necessario - il compilatore sa esattamente di quanto ha spostato esp, e può quindi generare la RET di conseguenza.



Rispondi quotando