Questo significa che il puntatore di base o il puntatore dello stack si stanno effettivamente spostando verso il basso gli indirizzi di memoria anziché salire? Perché?
Sì, le push
istruzioni diminuiscono il puntatore dello stack e scrivono nello stack, mentre pop
fanno il contrario, leggono dallo stack e incrementano il puntatore dello stack.
Questo è un po 'storico in quanto per le macchine con memoria limitata, lo stack è stato posizionato in alto e cresciuto verso il basso, mentre l'heap è stato posizionato in basso e cresciuto verso l'alto. C'è solo una lacuna di "memoria libera" - tra l'heap e lo stack, e questa lacuna è condivisa, o uno può crescere nel divario secondo necessità individuali. Pertanto, il programma esaurisce la memoria solo quando lo stack e l'heap si scontrano senza lasciare memoria libera.
Se lo stack e l'heap crescono entrambi nella stessa direzione, allora ci sono due spazi vuoti e lo stack non può davvero crescere nello spazio dell'heap (il viceversa è anche problematico).
Inizialmente, i processori non avevano istruzioni di gestione dello stack dedicate. Tuttavia, poiché il supporto dello stack è stato aggiunto all'hardware, ha assunto questo modello di crescita verso il basso e i processori seguono ancora questo modello oggi.
Si potrebbe sostenere che su una macchina a 64 bit vi è spazio di indirizzi sufficiente per consentire più spazi vuoti - e come prova, più spazi vuoti sono necessariamente il caso in cui un processo ha più thread. Sebbene questa non sia una motivazione sufficiente per cambiare le cose, dal momento che con i sistemi a gap multipli, la direzione della crescita è probabilmente arbitraria, quindi tradizione / compatibilità punta sulla scala.
Dovreste modificare le istruzioni della CPU di gestione dello stack in modo da cambiare la direzione della pila, oppure rinunciare a uso degli dedicati spingere e popping istruzioni (ad esempio push
, pop
, call
, ret
, altri).
Si noti che l'architettura del set di istruzioni MIPS non ha dedicato push
& pop
, quindi è pratico far crescere lo stack in entrambe le direzioni - potresti comunque desiderare un layout di memoria a spazio vuoto per un singolo processo di thread, ma potresti far crescere lo stack verso l'alto e l'heap verso il basso. Se lo hai fatto, tuttavia, alcuni codici C varargs potrebbero richiedere una regolazione nel passaggio dei parametri sorgente o sottostante.
(In effetti, poiché non esiste una gestione dello stack dedicata su MIPS, potremmo utilizzare il pre o post increment o pre o post decrement per spingere sullo stack fintanto che abbiamo usato il contrario esatto per saltar fuori dallo stack e anche supponendo che il il sistema operativo rispetta il modello di utilizzo dello stack scelto. In effetti, in alcuni sistemi embedded e in alcuni sistemi educativi, lo stack MIPS è cresciuto verso l'alto.)
-4(%rbp)
non sposta affatto il puntatore di base e che+4(%rbp)
non avrebbe potuto funzionare.