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

  1. Qual è la funzione principale del segmento di codice in un programma?
  2. Il segmento di codice contiene il codice eseguibile del programma, essenziale per il suo funzionamento.

  3. Come viene gestita la memoria per le attivazioni delle funzioni?
  4. 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.

  5. Qual è il ruolo del record di attivazione nella gestione delle funzioni annidate?
  6. 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.

Domande e risposte

Hai bisogno di aiuto?
Chiedi alla community