Sezione |
Indirizzi Base
Registri Interni
|
Schede del Tutorial |
Stack - Definizione e Gestione |
SCHEDA n° 06 [ 6 di 7] |
|
Aggiornato 11 gennaio 2009 |
|
Il set delle istruzioni di un processore prevede altre possibilità di scrittura e lettura dello stack, non legate a fatti strutturali come quelli descritti nelle pagine precedenti; in sostanza anche il programmatore è messo in condizione di condividere con la Cpu questa importante risorsa. | |||||
Non va comunque dimenticato che lo Stack è una struttura delicata e degna della massima attenzione: un piccolo errore di gestione può distruggere il programma in esecuzione e bloccare il computer.. ed è noto che l'errore lo può compiere solo il programmatore.... | |||||
Dunque:
| |||||
L'oggetto XX coinvolto nelle operazioni è generalmente un registro a 16 bit (come AX, DI, ecc.) ma può essere anche il contenuto di una locazione di memoria. | |||||
Lo Stack è nato per garantire l'eseguibilità dei programmi, a beneficio sostanzialmente esclusivo del processore che li esegue: se, bontà sua, ne tollera la condivisione dobbiamo come minimo rispettare le sue regole; una di queste è già stata data in fase di presentazione ma non guasta ricordarla ancora: |
|
Nello Stack: quello che si scrive deve essere, prima o poi, tolto, cioè per ogni PUSH deve esserci un POP ! |
|
La coppia PUSH/POP è ideale quando è necessario usare un registro senza rischiare di perderne il contenuto; può succedere infatti di avere tutti i registri caricati con valori importanti e, non avendone altri (dato il loro limitato numero...) di non sapere che santi pigliare... | |
In effetti è sempre possibile salvare il valore di ciascun registro nello stack, riutilizzare a sazietà ciascuno di essi, e ripristinarlo alla fine, prelevandolo nei registri di partenza dallo stack. | |
Tutte le procedure fatte a regola d'arte (personali e di sistema) dovrebbero come prime istruzioni salvare nello Stack tutti i registri da esse utilizzati, e recuperarli alla fine, prima di tornare. |
|
Con tecnica PUSH/POP è comunque possibile salvare (nello Stack) un registro, per esempio AX, e recuperare (dallo Stack) in un altro registro, per esempio BX (nel caso proposto otterremo lo stesso risultato di MOV BX;AX). Questa opportunità si dimostra l'unica strada perseguibile con registri (o altro) che non possono essere travasati con MOV, come quelli di segmento. |
|
Quando il processore esegue un'istruzione
PUSH XX provvede ai seguenti compiti:
| |||||
Se non si provvede altrimenti lo Stack rimane sporco, cioè con 2 bytes in più rispetto alla condizione precedente l'esecuzione dell'istruzione: la cosa è fastidiosa ma non ancora critica... ma se l'operazione fosse ripetuta sciaguratamente troppe volte si rischia, scrivendo all'indietro, di sovrascrivere il programma mentre è in esecuzione... |
|
Quando il processore esegue un'istruzione
POP XX provvede ai seguenti compiti:
| |||||||
L'azione di POP è benedetta e dovrebbe essere esercitata nella misura dei PUSH effettuati in precedenza; ma è facile pensare che anche l'esecuzione di un POP senza aver prima spinto qualcosa nello Stack è sciagurata: in questo caso, pur non essendo traumatica per il programma in esecuzione, sono i dati recuperati in XX ad essere inattendibili, con inevitabili malfunzionamenti. |
|
I movimenti del processore e dei suoi registri
possono essere monitorati, sviluppati e analizzati in ambiente Debug,
con l'aiuto di una semplice sequenza di istruzioni usata come banco di
prova; a sinistra osserviamo i valori dei registri
e a destra l'aspetto dello Stack, nelle
varie fasi:
|
All'inizio (punto *1*),
poichè la coppia di registri CS:IP
contiene 1192:0100,
il processore si trova costretto ad eseguire l'istruzione MOV
AX,0102
| |||||
Dopo l'esecuzione di MOV AX,0102 (punto *2*), la coppia di registri CS:IP contiene 1192:0103: il processore si accinge ad eseguire PUSH AX: il puntatore di Stack non è stato influenzato dall'istruzione MOV: il suo valore è ancora SP=FFFE. | |||||
Dopo l'esecuzione di PUSH
AX
(punto *3*):
|
Dopo l'esecuzione di NOP (punto *4*), la coppia di registri CS:IP contiene 1192:0105: il processore si accinge ad eseguire POP BX: il puntatore di Stack non è stato influenzato dall'istruzione NOP: il suo valore è ancora SP=FFFC. | |||||||
Dopo l'esecuzione di POP
BX (punto *5*):
|
|
Riassumiamo la dinamica
dello Stack, dopo
la gestione di una coppia PUSH/POP:
|
|
Scheda n° 06 | Stack - Definizione e Gestione | |||||||
Scheda n° 06 - 6 |
|
|
|
|
Home |
|
|||||||
|
Motore Ricerca |
|