Lo stack è un’area della memoria che viene allocata dal sistema operativo quando viene creato il thread. Lo stack è organizzato in una struttura Last-In-First-Out (LIFO), che significa che i dati più recenti che metti nello stack saranno i primi a essere rimossi
dalla pila. Metti i dati (push) nello stack usando l’istruzione push, e rimuovi i dati ( popping) dallo stack usando l’istruzione pop. L’istruzione inserisce un valore di 4 byte nello stack e l’istruzione pop inserisce un valore di 4 byte dalla cima della pila.
Lo stack cresce da indirizzi superiori a indirizzi inferiori. Ciò significa che quando una pila è creata, il registro esp (chiamato anche lo stack pointer) punta in cima allo stack e mentre si inseriscono i dati nello stack, il registro esp diminuisce di 4 (esp-4) in a
indirizzo inferiore. Quando inserisci un valore, l’esp aumenta di 4 (esp + 4). Diamo un’occhiata al file seguire il codice assembly e cercare di capire il funzionamento interno dello stack:
Prima di eseguire le istruzioni precedenti, il registro esp punta in cima allo stack (ad esempio, all’indirizzo 0xff8c), come mostrato qui:
Dopo che la prima istruzione è stata eseguita (push 3), ESP viene decrementato di 4 (perché il push l’istruzione inserisce un valore di 4 byte nello stack) e il valore 3 viene posizionato sullo stack; ora, ESP punta in cima allo stack a 0xff88. Dopo la seconda istruzione (push
4), esp è diminuito di 4; ora, esp contiene 0xff84, che ora è il primo della pila. Quando viene eseguito pop ebx, il valore 4 dalla cima dello stack viene spostato in ebx register, ed esp viene incrementato di 4 (perché pop rimuove un valore di 4 byte dallo stack).
Quindi, esp ora punta allo stack su 0xff88. Allo stesso modo, quando l’istruzione pop edx è eseguito, il valore 3 dalla cima dello stack viene posto nel registro edx, e esp torna alla sua posizione originale in 0xff8c.