Stack frame: differenze tra le versioni

Contenuto cancellato Contenuto aggiunto
Ho pubblicato la prima versione della voce, dato che nessuno lo aveva fatto prima. Ho citato il libro che sto ristudiando, dato che ne da una definizione chiara. Ho cercato di essere il più chiaro possibile nello spiegare il concetto.
 
m rimossa Categoria:Informatica usando HotCat
 
(12 versioni intermedie di 10 utenti non mostrate)
Riga 1:
{{F|programmazione|dicembre 2019}}
Quando viene richiamata una funzione, diversi elementi vengono inseriti nello stack, in una struttura chiamata ''stack frame''. il [[IA-32|registro]] EBP, chiamato talvolta ''frame pointer'' (FP) o ''vocal base pointer'' (LB), viene utilizzato per riferirsi a variabili presenti nel frame dello stack corrente.<ref>{{Cita libro|cognome=Erickson, Jon, criptologo.|titolo=L'arte dell'hacking : le idee, gli strumenti, le tecniche degli hacker|url=https://www.worldcat.org/oclc/799623398|accesso=2019-12-01|data=2004|editore=Apogeo|OCLC=799623398|ISBN=88-503-2280-1}}</ref>
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 [[Pila (informatica)|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 [[Computer|calcolatore]], questo deve allocare della memoria per la sua esecuzione.
 
La memoria per l'esecuzione è una porzione di memoria divisa in zone ([[Segmentazione (memoria)|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), [[Stringa (informatica)|stringhe]] e altre [[Costante (informatica)|costanti]] che sono usate in tutto il programma.
* heap : utilizzato per le rimanenti variabili di programma
*[[Call stack|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|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 [[IA-32|registro]] EBP, chiamato talvolta ''frame pointer'' (FP) o ''vocallocal base pointer'' (LB), viene utilizzato per riferirsi a variabili presenti nel frame dello stack corrente.<ref>{{Cita libro|cognome=Erickson, Jon, criptologo.|titolo=L'arte dell'hacking : le idee, gli strumenti, le tecniche degli hacker|url=https://www.worldcat.org/oclc/799623398|accesso=1º dicembre 2019-12-01|data=2004|editore=Apogeo|OCLCoclc=799623398|ISBNisbn=88-503-2280-1}}</ref>
 
Ciascuno stack frame contiene i parametri della funzione, le sue variabili locali e due puntatori che sono necessari per ripristinare la situazione iniziale:
Line 6 ⟶ 25:
* l'indirizzo di ritorno
 
il SFP viene utilizzato per ripristinare EBP sul suo valore precedente, mentre l'indirizzo di ritorno serve ad impostare EIP (l'Instruction Pointer) 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.
 
== Note ==
<references/>
 
== Voci correlate ==
* [[Call stack]]
* [[IA-32]]
* [[linguaggio macchina]]
* [[Segmentazione (memoria)]]
 
{{portale|informatica}}
 
[[Categoria:Microprocessori Intel]]
[[Categoria:Programmazione]]
[[Categoria:Gestione della memoria]]