ASM Quanti stack ci sono? D:

lollissimo37

Utente Electrum
13 Febbraio 2018
334
18
81
141
Salve a tutti,
Nel linguaggio asm scrivere questa istruzione:
ADD ESP, 16
Significa eliminare 4 celle dallo stack dal momento che una cella è uno spazio di memoria di 4 byte, giusto?
Ma i registri sono altri stack che stanno nella CPU invece che nella RAM?
 
Nono attento, non esiste lo stack nella ram, noi realizziamo concettualemente lo stack. E la immaginiamo come una struttura dati.
In memoria non c'è niente del genere c'è solo un insieme di byte liberi da un indirizzo 0 a un indirizzo N.
Noi partiamo da M e sottraiamo per allocare e sommiamo per deallocare.
Per ricordarci l'indirizzo dello stack usiamo un registro che è una cella di memoria nel processore che ha però dimensione fissa (32 bit ad esempio).
Il registro che dedichiamo a questo scopo è lo stack pointer ovvero il registro puntatore allo stack che si ricorda il punto a cui facciamo riferimento sullo stack.
Quando fai quella istruzione semplicemente aggiungi un valore 16 al puntatore a stack quindi quando accediamo alla ram accediamo all'indirizzo ESP + 16 quindi in un altro punto dello stack.
 
Come Informaticage ha detto sopra lo stack è più un'astrazione utilizzata e gestita dal sistema operativo che altro, alla creazione di ogni processo il sistema operativo alloca una determinata porzione di RAM per il suo utilizzo come stack per quel processo specifico, quindi tecnicamente parlando esiste uno stack per ogni processo in esecuzione, tutti risedenti nella RAM, in indirizzi diversi. Il registro ESP è speciale perchè contiene sempre l'indirizzo dell'ultimo elemento aggiunto sullo stack, ma non rappresenta lo stack in se', ne contiene solo l'indirizzo.

I registri in se' sono molto limitati, possono contenere solo una manciata di byte in base all'architettura del processore di cui fanno parte, mentre lo stack è dinamico e si può dire cresca o diminuisca in dimensioni in base alle esigenze di ciascun programma. (quando in realtà anche questa è solo un'astrazione)
 
Confermo quanto già detto nelle altre 2 risposte, ed aggiungo che volendo è anche possibile creare uno stack personalizzato perchè, come detto, basta conoscerne la quantità di memoria necessaria.
Si usa raramente uno stack diverso da quello assegnato dal loader di sistema, ma ci sono casi particolari in cui può servire, come ad esempio il caso in cui si emuli il codice di un'altra architettura.