  | Le prime 92
    locazioni del PSP (da 
  0000H  a 005BH)
    sono a disposizione nostra e del programma per cui sono state create; sono
    state scritte dal DOS nel momento in cui l'eseguibile è stato allocato in
    memoria e non devono in alcun modo essere modificate. Vediamo la prima parte
    di esse: 
	
   | Offset | 
   
   N°
    bytes°
    
     | 
   
     
       Descrizione 
    | 
 
                   
    |  
       
   
       
0000
     | 
     
       
   
       
2
     | 
    
        
          
             | 
          Contiene i 2 bytes 
          CDH,
            20H, corrispondenti al codice
            operativo dell'istruzione INT 20H
            che, nella normale programmazione in ambiente 80x86, consente ai
            programmi eseguibili di restituire il
            controllo al DOS. | 
         
        
          
             | 
          La presenza di questi 2 bytes è un retaggio
            del vetusto CP/M, un glorioso sistema operativo in
            voga quando i personal computer dovevano ancora nascere; in quel
            tempo per porre fine all'esecuzione di un programma e restituire il
            controllo al sistema operativo era sufficiente eseguire l'istruzione
            RET.  | 
         
        
          
             | 
          Se si forza l'esecuzione di una  RET
            dall'interno dei nostri eseguibili scritti per 80x86 il processore
            preleva coerentemente dallo  stack l'indirizzo a cui tornare, dando
            per scontato che qualcuno abbia provveduto a memorizzarlo in esso prima di eseguire la
             RET; è facile prevedere cosa
            succede se nessuno ha predisposto questo indirizzo: il processore
            cede il controllo chissà a chi! e il computer probabilmente si
            blocca. | 
         
        
          
             | 
          Invece no!
            Proprio per venire incontro agli sprovveduti neofiti il progettista DOS ha mantenuto la possibilità di
            tornare al prompt anche eseguendo  RET, montando un meccanismo tanto
            semplice quanto diabolico: | 
         
        
          |   | 
          -
            il loader, subito dopo aver creato il PSP (proprio ciò di cui ci
            occupiamo in queste pagine),  scrive i valori 00H
            nelle ultime locazioni del segmento riservato al programma, cioè
            quelle puntate da FFFEH, e
            obbliga il registro SP a puntarle. | 
         
        
          |   | 
          - è chiaro, dunque, che
            l'eventuale esecuzione di una  RET (illogica nella norma) obbliga il
            processore a prelevare il contenuto corrente dello stack, appunto
            l'indirizzo 0000H, e a saltarci;
            poiché l'indirizzo 0000H è
            proprio l'inizio del PSP , se in quelle locazioni sono presenti i
            bytes CDH, 
          20H, il processore eseguirà una
             INT 20H restituendo il controllo al DOS. | 
         
        
          
             | 
          MAGIA:
            con un  RET ho comunque eseguiti
            l'istruzione
            INT 20H e sono comunque tornato
            al DOS.  | 
         
        | 
    
      
 
      
 
    | 
      
 
     
       
 
    0002
     | 
    
      
 
     
       
 
    2
     | 
    
        
          
             | 
          Contiene l'indirizzo in paragrafi del  primo
            
            paragrafo libero nella ram del computer (per esempio 9FFFH), cioè
            l'indirizzo di  segmento della memoria aldilà dei blocchi allocati
            per il programma; l'esempio suggerito (per altro letto dal prefisso
            di un eseguibile, dopo la sua allocazione) indica che il Dos ha
            destinato al programma tutta la ram disponibile. | 
         
        
          
             | 
          L'indirizzo fisico della prima
            locazione libera si ottiene moltiplicando questo numero per 16; nel
            nostro esempio vale 9FFF0H,
            proprio a ridosso della Ram Video Grafica, il che ribadisce che
            tutta la memoria è stata assegnata al programma. | 
         
        
          
             | 
          Non dimenticare che, comunque, taluni programmi usano anche locazioni alte
            di memoria, il ché‚ rende inattendibile questo valore; se
            desideri avere maggiori certezze  conviene riferirsi alle
            funzioni DOS 48H (Allocate Memory),
            49H (Free Allocated Memory)
            e 4AH (Modify Memory Allocation). | 
         
        | 
    
      
      
    | 
      
   
      
    0004 | 
    1 | 
    
        
          
             | 
          
 
Byte riservato al DOS, di norma a 00H.
            | 
         
        | 
 
      
      
       
      
    | 
      
      
     
       
      
    0005
     | 
    1 | 
    
        
          
             | 
          Contiene il codice
            operativo dell'istruzione CALL FAR
            (cioè 9AH) il ché fa presumere
            che i successivi 4 bytes siano pronti ad ospitare i 4 bytes di
            un indirizzo logico completo, segment:offset,
            naturalmente scritti con la logica Lo-Hi, cioè in sequenza parte
            passa e parte alta dell'offset,
            parte bassa e parte alta del segment,
            per esempio 9A  F0FE 1DF0 per
             CALL F01D:FEF0).  | 
         
        
          
             | 
          Si tratta di un'altra paranoia intesa a facilitare la chiamata di una procedura lontana con una struttura preconfezionata; la letteratura parla di
             struttura per implementare la  chiamata di una funzione DOS
            (INT 21H) intendendo che l'operando sia quello della procedura di servizio delle funzioni DOS.  | 
         
        | 
 
       
      
    | 
      
      
     
       
      
    0006 | 
    2 | 
    
        
          
             | 
          Se riferita alla definizione data
            all'offset 0005 si tratta
            dell'indirizzo di offset dell'operando dell'istruzione  CALL
            FAR.   | 
         
        
          
             | 
           Il valore di default indica
            però anche la  quantità di memoria (in bytes)
             ancora  utilizzabile  nel segmento dal programma fino a
            FFF0H (sedici  bytes  prima del termine del
            segmento), per esempio FEF0H. | 
         
        | 
 
      
      
     
       
      
    | 
      
      
     
       
      
    0008 | 
    
      
      
     
       
      
    2
   | 
    
        
          
             | 
          Se riferita alla definizione data
            all'offset 0005 si tratta
            dell'indirizzo di segment dell'operando dell'istruzione  CALL
            FAR.   | 
         
        
          
             | 
          Altrimenti i 2 bytes sono da
            ritenersi riservati. | 
         
        | 
 
        
  |