Mettiamo un po' di ordine ...
Lo stack che, come dicevo prima, è un concetto che andrebbe studiato PRIMA di chiedere a cosa serva il registro Stack Pointer, è un'area di memoria che viene utilizzata dalla CPU per alcuni scopi particolari.
La CPU accede a tale area di memoria secondo le modalità LIFO e per farlo usa un registro che detiene il valore del prossimo indirizzo di memoria utilizzabile, appunto, lo Stack Pointer.
Molte istruzioni della CPU utilizzano lo Stack automaticamente, ad esempio, quelle che servono a chiamare le subroutine (CALL) che, prima di iniziare ad eseguire una sub depositano nello stack l'indirizzo attuale del codice chiamante. Così, le equivalenti istruzioni che terminano le funzioni (RET) possono estrarre l'indirizzo dallo stack e gestirlo per riportare l'esecuzione subito dopo la chiamata.
La struttura LIFO permette di effettuare chiamate nidificate in questo modo.
Ma non è l'unico modo in cui la CPU sfrutta lo stack.
Tramite istruzioni esplicite (PUSH) è possibile che il programma inserisca nello stack (in cima allo stack, tramite l'indirizzo depositato nello StacK Pointer) dei valori specifici, anche più di uno con diverse PUSH.
Una sub successivamente chiamata sarà in grado di estrarre dallo stack con altra istruzione (POP) questi valori per trattarli. In questo modo si implementa ad esempio, il passaggio di parametri ad una funzione C.
In più, mentre una funzione è in esecuzione, lo Stack Pointer può essere modificato esplicitamente in modo di riservare spazio per depositare valori utilizzati solo all'interno della funzione. Prima di terminare la funzione, lo Stack Pointer viene modificato nuovamente per rilasciare lo spazio prima riservato. Questo è il modo con cui il C alloca lo spazio delle variabili locali, appunto, allocate nello stack.
Nessuno vieta di andare anche a scrivere direttamente nello stack, tramite Stack Pointer ma, in questo caso, si deve sapere esattamente cosa si sta facendo per evitare crash.
Per finire, dato che lo Stack è un'area limitata di memoria, è possibile che termini e questo avviene appunto
1) se si fanno troppe chiamate innestate di sub (ad esempio nel caso delle funzioni ricorsive)
2) se si utilizzano troppe variabili locali
@AldoBaldo ... stiamo parlando delle basi che un programmatore dovrebbe conoscere ...
Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
---
Il grande studioso italiano Bruno de Finetti ( uno dei padri fondatori del moderno Calcolo delle probabilità ) chiamava il gioco del Lotto Tassa sulla stupidità. |