Stack frame
# Stack frame

In informatica, uno stack frame è una zona di memoria del call stack che contiene i dati necessari alla subroutine (o funzione) attualmente in esecuzione.

Esso ha, a sua volta, una struttura a stack (pila) e contiene, alla sua base, i dati per ripristinare i registri puntatore del processore (come ad esempio i registri EBP e ESP nell'architettura IA-32), facendoli tornare all'istruzione immediatamente successiva alla chiamata della funzione in esecuzione, nel flusso del programma principale (o della funzione chiamante).

## Introduzione

Quando un programma compilato viene eseguito su un calcolatore, questo deve allocare della memoria per la sua esecuzione.

La memoria per l'esecuzione è una porzione di memoria divisa in zone (segmentazione della memoria):

* text : che contiene le istruzioni del programma, in linguaggio macchina
* BSS : usato per immagazzinare variabili globali e/o statiche, contiene le parti corrispondenti alle variabili globali NON inizializzate
* data : usato per immagazzinare variabili globali e/o statiche, riempito con variabili globali inizializzate (definite in partenza), stringhe e altre costanti che sono usate in tutto il programma.
* heap : utilizzato per le rimanenti variabili di programma
* stack : utilizzato per tenere traccia dei punti in cui ogni subroutine attiva dovrebbe restituire il controllo quando termina l'esecuzione e per le variabili locali e parametri delle funzioni.

Lo stack (o Call Stack) viene ulteriormente frammentato con l'utilizzo di stack frame, poiché l'esecuzione del programma non è più lineare nel momento stesso in cui viene richiamata una funzione. Questa deve seguire il suo flusso di comandi, residenti in indirizzi di memoria non sequenziali rispetto a quelli del programma "chiamante". Si crea quindi la necessità di uno "stack nello stack", perché la funzione possa seguire il suo flusso e, terminando, permettere al processore di riprendere il flusso del programma principale laddove si era interrotto (all'indirizzo, quindi, del comando immediatamente successivo a quello di chiamata della funzione, in assembly: "call").

## Funzionamento di esempio (architettura IA-32)

Quando viene richiamata una funzione, diversi elementi vengono inseriti nello stack, in una struttura chiamata stack frame. il registro EBP, chiamato talvolta frame pointer (FP) o local base pointer (LB), viene utilizzato per riferirsi a variabili presenti nel frame dello stack corrente.

Ciascuno stack frame contiene i parametri della funzione, le sue variabili locali e due puntatori che sono necessari per ripristinare la situazione iniziale:

* il saved frame pointer (SFP)
* l'indirizzo di ritorno

il SFP viene utilizzato per ripristinare EBP sul suo valore precedente, mentre l'indirizzo di ritorno serve ad impostare EIP all'indirizzo dell'istruzione immediatamente successiva a quella di richiamo della funzione.

Se una funzione venisse richiamata dall'interno di un'altra, un nuovo stack frame verrebbe inserito nello stack e il suo indirizzo di ritorno sarebbe l'indirizzo dell'istruzione successiva al richiamo della funzione chiamata, nella funzione chiamante.

