| 
      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  | 
      
  |