L'esecuzione di un programma necessita di tre aree di memoria (che in UNIX sono chiamate regioni):
Area di testo: contiene il testo del programma, cioè le istruzioni in linguaggio macchina. Non è modificabile dal programma stesso.
Area dati: contiene le variabili globali (cioè quelle condivise da tutte le procedure) e le strutture dati dinamiche. Queste ultime si trovano in una parte di quest'area chiamata area heap, alla quale puntano quindi le variabili che fanno riferimento alle strutture dinamiche.
L'area dati ha:
Area di stack: contiene i record di attivazione (frame) delle procedure già chiamate ma non ancora terminate. L'indirzzo della cima (top) dello stack, dove è situato il record di attivazione della procedura corrente, è contenuto nel registro di controllo SP (Stack Pointer). Ciascun record di attivazione contiene varie informazioni, tra cui:
L'area di stack ha:
#include <stdio.h>
//Variabili globali -> area dati
int a = 5;
int b = 6;
int f2(int h){
int k = h+15; //Variabile locale
// (punto 3)
return k;
}
int f1(int s, int t){
int u = a + s + t; //Variabile locale
// (punto 2)
int v = f2(u); //Variabile locale
// (punto 4)
return v;
}
int main(void){
int x = 10; //Variabile locale
// (punto 1)
int y = f1(x, b); //Variabile locale
// (punto 5)
printf("ecco il valore di y: %d\\n", y);
}
Per questo esempio, si assume che:
main che segue la chiamata a f1 si trova all'indirizzo A12E;f1 che esegue la chiamata a f2 si trova all'indirizzo A39F.
main, con la variabile locale x inizializzata (al valore 10), mentre y non è ancora stata inizializzata (qui indicato con ??). Invece, le variabili globali a e b, memorizzate nell'area dati, sono state inizializzate ancora prima dell'esecuzione di main.main è stato aggiunto quello di f1, nel quale:
x e b) sono stati assegnati ai parametri formali s e t (copiandoli tali valori dal frame di main a quello di f1)u è già stata inizializzata, mentre v non ancoramain successiva alla chiamata di f1mainf2, è stato aggiunto un ulteriore record di attivazione in cima alla pila:
h è stato assegnato il valore del parametro attuale (u)k è stata inizializzataRA è l'indirizzo dell'istruzione macchina di f1 successiva alla chiamata di f2f2 è terminata:
k è stato copiato in v (nel frame di f1)f2 è stato rimosso logicamente dallo stack, assegnando al registro SP l'indirizzo in cima alla pila (che è l'indirizzo del frame di f1);f1 dal punto successivo alla chiamata appena terminata.f1, il suo record di attivazione viene rimosso dallo stack, lasciando solo quello di main, e il valore restituito è stato assegnato a y. L'esecuzione di main continuerà dall'istruzione macchina successiva alla chiamata di f1.Il codice di memoria contiene indirizzi di memoria, che si riferiscono: