Concetti Chiave
- Il codice è suddiviso in segmenti di memoria: CODE, DATA, STACK e HEAP, ciascuno con funzioni specifiche nel programma.
- Lo STACK gestisce i record di attivazione delle funzioni, che includono parametri, variabili locali e indirizzi di ritorno.
- I record di attivazione sono creati automaticamente all'attivazione della funzione e deallocati al termine della stessa.
- Le chiamate annidate di funzioni generano una pila di record di attivazione, che vengono gestiti in ordine di chiamata e deallocati in ordine inverso.
- Il risultato di una funzione può essere restituito al chiamante tramite un registratore della CPU o un'ulteriore cella nel record di attivazione.
Segmenti di memoria nel codice
CODE SEGMENT: contiene il codice del pgm.
DATA SEGMENT: contiene le variabili globali e statiche (static)
AREA STACK: contiene i record di attivazione delle funzioni(parametri e variabili locali)
AREA HEAP: disponibile per allocazioni dinamiche.
-
L'area stack contiene i record di attivazione delle funzioni.
Un record di attivazione rappresenta il "mondo" della funzione e contiene:
I paramentri ricevuti
Le variabili locali
L'indirizzo(del chiamante) a cui tornare alla fine
Un riferimento al record di attivazione del chiamante
Gestione dei record di attivazione
Ad ogni attivazione di funzione viene creato un nuovo record di attivazione specifico per quella chiamata.
Per catturare la semantica delle chiamate annidate(una funzione che chiama un'altra funzione che...), quest'area di memoria è gestita come una pila(stack):
La dimensione del record di attivazione:
varia da una funzione all'altra
ma,per una data funzione, è fissa e calcolabile a priori.
Il record di attivazione:
viene creato automaticamente nel momento in cui la funzione viene chiamata
rimane sullo stack per tutto il tempo in cui la funzione è in esecuzione
viene deallocato automaticamente quando la funzione termina.
Funzioni che chiamano altre funzioni danno luogo a una sequenza di record di attivazione:
allocati secondo l'ordine delle chiamate
deallocati in ordine inverso
Quando la funzione termina, il controllo torna al chiamante, che deve:
riprendere la sua esecuzione dall'istruzione successiva alla chiamata della funzione
trovare il suo "mondo" inalterato.
Per le funzioni, spesso il record di attivazione prevede una ulteriore cella,destinata a contenere il risultato della funzione.
Tale risultato viene copiato dal chiamante prima di deallocare il record della funzione appena terminata.
Altre volte, il risultato viene restituito dalla funzione al chiamante lasciandolo in un registro della CPU.
Domande da interrogazione
- Qual è la funzione principale del segmento di codice in un programma?
- Come viene gestita la memoria per le attivazioni delle funzioni?
- Qual è il ruolo del record di attivazione nella gestione delle funzioni annidate?
Il segmento di codice contiene il codice eseguibile del programma, essenziale per il suo funzionamento.
La memoria per le attivazioni delle funzioni è gestita come una pila (stack), dove ogni attivazione crea un nuovo record di attivazione che rimane finché la funzione è in esecuzione e viene deallocato automaticamente al termine della funzione.
Il record di attivazione rappresenta il "mondo" della funzione, contenendo parametri, variabili locali e l'indirizzo di ritorno, e viene allocato e deallocato in base all'ordine delle chiamate, permettendo la corretta gestione delle funzioni annidate.