Stack & Funzioni

Lo Stack è una semplice struttura LIFO (last in first out), o più volgarmente “a pila”, che si occupa di passare sequenzialmente istruzioni al processore. Sebbene sia più semplice per noi umani immaginare una pila che cresce dal basso all’alto, per ragioni di
performance, i computer “trovano” la scelta di farlo crescere verso il basso più conveniente.

Il processore è dotato di numerosi registri (variabili interne estremamente veloci), che gli permettono di tenere conto dell’indice di esecuzione e completare tutte
le operazioni, aritmetiche e non, a lui necessarie. Quando la una nuova funzione sta per essere aggiunta nella lista di esecuzione del processore (la nostra pila), è necessario che lo Stack venga “spostato” verso il basso di alcuni byte (per la precisione, x*n
byte per gli argomenti passati alla funzione e x byte per il valore di ritorno); a questo punto, si viene a creare il cosiddetto “Stack frame”, che appartiene alla funzione che si sta aggiungendo. La sua dimensione varia a seconda del numero di variabili locali
necessarie all’esecuzione della stessa, ed al loro tipo. In questo preciso momento, uno dei registri del processore – denominato ESP (Stack pointer) – segna il punto d’inizio per la lettura della funzione, e quindi il punto più alto dello Stack stesso. Una volta
completate tutte le operazioni contenute nel frame, il valore di ritorno, allocato appena dopo (più in alto) il frame della funzione chiamante, viene “riempito”, e ESP viene spostato di x bytes (dimensione del frame della funzione completata + argomenti) verso il basso, scartando così tutte le informazioni utilizzate nella computazione del valore di ritorno. Infine, la funzione chiamante esegue un operazione di POP sul valore di ritorno
per ottenere i dati richiesti. Sebbene questo processo non sia standard per tutte le architetture di processori, è una buona approssimazione di ciò che accade nei modelli Intel x86 (32bit).

Leonardo Cascianelli

Ultimi post di Leonardo Cascianelli (vedi tutti)

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *