| 
      Sezione | 
      
       
   
    
      Indirizzi Base
    
    
    
      Registri Interni
    
      | 
    
| Schede del Tutorial | 
| Stack - Definizione e Gestione | 
      SCHEDA n° 06 [ 4 di 7]  | 
   
  | 
| 
     | 
    
  | 
  
Quando il processore esegue un'istruzione di
    chiamata (CALL ProcFar) di Procedura
    FAR provvede ai seguenti compiti:
  
  | |||||||||||||||
| Dopo l'esecuzione di CALL ProcFar, il processore si trova in tutt'altro ambiente, lontano dal programma principale da cui è partito, probabilmente addirittura in un altro segmento; si mette ad eseguire diligentemente tutte le istruzioni della procedura, in attesa della RET, che gli consentirà di tornare nel suo percorso nativo, naturalmente subito dopo l'istruzione CALL. | |||||||||||||||
Quando il processore esegue l'istruzione 
   
  RET
    (probabilmente l'ultima della Procedura FAR
    in cui è stato costretto a saltare) provvede ai seguenti compiti:
  
  | |||||||||||||||
| Dopo l'esecuzione di RET, il processore è dunque rientrato nei ranghi... | 
| 
     
  | 
      
| 
           | 
          Nonostante la apparente somiglianza con quello della pagina precedente l'istruzione RET è ora completamente diversa: recupera dallo Stack 4 bytes invece di 2. Poichè corrisponde ad una chiamata FAR è l'assemblatore stesso a codificarla in modo adeguato: dalle figure in dotazione possiamo vedere che la RET FAR ha codice operativo CBH, mentre quello della RET NEAR è C3H | 
| 
     
  | 
      
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 0DE0: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 0DE0:0103: il processore si accinge ad eseguire CALL 0DE0:010C: il puntatore di Stack non è stato influenzato dall'istruzione MOV: il suo valore è ancora SP=FFFE. | |||||||
Dopo l'esecuzione di          CALL
    0DE0:010C
    (punto *3*):
  
  | 
| Dopo l'esecuzione di ADD BX,AX , dentro la procedura (punto *4*), la coppia di registri CS:IP contiene 0DE0:010E: il processore si accinge ad eseguire RET: il puntatore di Stack non è stato influenzato dall'istruzione ADD: il suo valore è ancora SP=FFFA. | |||||
Dopo l'esecuzione di RET,
    naturalmente di tipo FAR, dentro la procedura (punto *5*):
  
  | 
| 
     
  | 
      
Riassumiamo la dinamica
    dello Stack, nella gestione di una chiamata
    di procedura extrasegmentale (FAR);
    quando il processore è finalmente rientrato nel programma principale (per
    l'azione della 
   
  RET far della procedura,
    dopo esserne uscito per l'azione di  
   
  CALL ProcFar):
  
  | 
| 
     
  | 
      
| SP:FFF8 ??
        non ancora utilizzato SP:FFF9 ?? non ancora utilizzato SP:FFFA 08 Lo Offset SP:FFFB 01 Hi Offset SP:FFFC E0 Lo Segment SP:FFFD 0D Hi Segment SP:FFFE 00 <- SP=FFFE SP:FFFF 00  | 
      
  | 
| 
      
       |     
    Scheda n° 06 | 
      
       | 
    Stack - Definizione e Gestione | 
     | 
    
    
     | 
    
     | 
 ||
| Scheda n° 06 - 4 | 
      
  | 
    
| 
     
  | 
  
        
  | 
    
        
  | 
    
| 
      
         
        Home 
     | 
      
  | 
    |||||||
      
  | 
       
          
        Motore Ricerca  | 
      
  |