  | 
  Scrittura 
    della Tabella dei Vettori con la funzione 25H del DOS 
  
        La prima tecnica è senz'altro la più efficiente, avendo a che 
        fare direttamente con un servizio assicurato dal sistema operativo; 
        come detto la funzione scrive 
        in tabella l'indirizzo effettivo (predisposto 
        in DS:DX, vettore di interruzione) della procedura di servizio associata all'Interrupt 
        il cui numero  xy è predisposto in ingresso 
        in AL;  supponendo che la nuova 
    procedura di servizio si chiami new_INT, 
    il codice necessario per la sua installazione potrebbe essere questo:
  
    
    
      
        | 
                     CLI  
            PUSH  CS  
            POP   
        DS
         
            LEA   
        DX,new_INT 
         
            MOV   
        AL,xy 
                    MOV   
        AH,25H 
            INT  
        21H 
  
            STI   | 
       
     
   
     | 
    | 
  Scrittura della Tabella dei Vettori con 
        tecniche tradizionali [1 di 
        2] 
        
        Il secondo modo di scrivere l'indirizzo desiderato 
        è legato alle tecniche tradizionali di scrittura della memoria; 
    per localizzare le locazioni da scrivere si utilizza lo stesso sofisticato metodo 
    proposto per la lettura del vettore originale: 
    
        | 
   con l'aiuto della pseudooperazione 
  
  SEGMENT AT,  definisce 
  un segmento (un'area di 64k) tale da coprire 
  le prime 65536 locazioni della memoria Convenzionale in cui trova posto 
  appunto la Tabella dei Vettori, e lo chiama TABint |  
        | individua al tempo stesso, con l'etichetta INT_xy, 
  l'esatta locazione del vettore associato al servizio 
   
  INT 
  xyH; nelle 2 varianti che seguono questa etichetta (LABEL) è 
  prima di tipo 
  
  DWORD (4bytes) e poi di tipo 
  
  WORD (2bytes). |  
        | 
   con 
  la pseudooperazione 
  
  ASSUME sovrappone 
  logicamente l'area di memoria appena definita (TABint) al 
  registro di segmento ES, consentendo 
  all'assemblatore di calcolare con correttezza l'indirizzo effettivo di 
  ciascuna etichetta inclusa nel segmento stesso; così ogni riferimento a
  INT_xy sarà realmente un riferimento a 
  ES:[INT_xy], anche se 
  non esplicitamente dichiarato con il
  
  segment-override. |  
        | le prime istruzioni del codice di scrittura vettore saranno 
  quelle che inizializzano anche fisicamente registro di segmento  ES 
  per puntare la Tabella dei Vettori, operazione realizzata con l'aiuto si 
  AX. |  
        | per individuare l'indirizzo 
      logico del nuovo Gestore sono proposti 
      2 metodi (naturalmente
      solo uno va poi realmente utilizzato):
  
        | 
    in entrambi la parte segment viene 
    assunta 
    direttamente da CS, come è 
    naturale, essendo la nuova procedura nel medesimo segmento di codice del 
    programma che si occupa di installarlo | 
   
  
       | 
    per la parte 
    offset nel primo caso si incarica l'assemblatore di 
    predisporre il giusto valore con l'aiuto della pseudooperazione 
  
  OFFSET, mentre nel secondo caso l'indirizzo della 
    nuova procedura si predispone in SI con l'aiuto dell'istruzione 
   
  LEA, pensata proprio per questo scopo. | 
   
    |  
   
  
  
    | 
              | 
       
  
       Con questa premessa, per 
    scrivere il nuovo vettore nelle 4 locazioni locali [INT_xy] 
    della Tabella dei Vettori, sono 
        disponibili 2 varianti. 
    La prima variante associa loro una sola 
    variabile di tipo 
  
  DWORD (32 bit), 
    per cui l'inserimento di un dato più piccolo (i 16 bit del registro
    CS o dell'OFFSET
        new_INT) produrrà segnalazione d'errore da parte 
    del compilatore se non si specifica l'operatore 
  
  Word Ptr: | 
   
 
  
    
    
      
        | 
         TABint      
        SEGMENT AT 0000H 
            ORG   
        00xy*4 
        INT_xy      LABEL DWORD 
        ;<<<<<< NB  
         
        TABint      ENDS 
            ASSUME ES:TABint 
           
        ;------------------------------ 
         
            PUSH  ES 
                    
        MOV  AX,TABint 
            MOV  ES,AX 
         
                   
        ;------[primo Metodo]------------------ 
            
        CLI  
        ;<<<<<<<<<<<<< NB 
            MOV   
        Word Ptr [INT_xy],OFFSET
        new_INT 
            MOV   
        Word Ptr [INT_xy][2],CS 
            
        STI  
        ;<<<<<<<<<<<<< NB 
         
         
                   
        ;------[secondo Metodo]---------------- 
            
        CLI  
        ;<<<<<<<<<<<<< NB 
         
            PUSH  SI 
         
                    LEA   
        SI,new_INT 
            MOV   
        Word Ptr [INT_xy],SI 
            MOV   
        Word Ptr [INT_xy][2],CS 
            POP   
        SI 
            
        STI  
        ;<<<<<<<<<<<<< NB 
         
         
            POP   
        ES    | 
       
     
   
    
  
    |    La seconda variante 
    associa loro 2 variabili di tipo 
  
  WORD per cui, essendo le 
    locazioni destinazione e i 
    registri sorgente (CS 
    e SI o l'OFFSET
        new_INT) della stessa dimensione, non è necessario 
  specificare l'operatore 
  
  Word Ptr per le istruzioni 
   
  MOV:  | 
   
  
    | 
              | 
       
 
  
    
    
      
        | 
         TABint      
        SEGMENT AT 0000H 
            ORG   
        00xy*4 
        INT_xy      LABEL 
        WORD  
        ;<<<<<< NB  
         
        TABint      ENDS 
            ASSUME ES:TABint 
           
        ;------------------------------ 
         
            PUSH  ES 
                    
        MOV  AX,TABint 
            MOV  ES,AX 
         
                   
        ;------[primo Metodo]------------------ 
            
        CLI  
        ;<<<<<<<<<<<<< NB 
            MOV   
        [INT_xy],OFFSET new_INT 
            MOV   
        [INT_xy][2],CS 
            
        STI  
        ;<<<<<<<<<<<<< NB 
         
         
                   
        ;------[secondo Metodo]---------------- 
            
        CLI  
        ;<<<<<<<<<<<<< NB 
         
            PUSH  SI 
         
                    LEA   
        SI,new_INT 
            MOV   
        [INT_xy],SI 
            MOV   
        [INT_xy][2],CS 
            POP   
        SI 
            
        STI  
        ;<<<<<<<<<<<<< NB 
         
         
            POP   
        ES    | 
       
     
   
     | 
    | 
  Scrittura della Tabella dei Vettori con 
  tecniche tradizionali [2 di 
        2] 
  
        
        Anche il terzo modo per scrivere 
  l'indirizzo desiderato è legato alle tecniche tradizionali di 
  scrittura della memoria, 
  ma in questo 
        caso evita di definire ed assegnare particolari segmenti per localizzare 
  la Tabella dei Vettori; lo sviluppo del programma è certamente più immediato:
      | la localizzazione delle locazioni in cui scrivere il 
  vettore è fatta ora in modo immediato 
  con l'aiuto di 2 assegnazioni costanti, 
  con la pseudooperazione 
  
  EQU associata alle etichette TABint 
  e
  INT_xy  |  
      | Il registro di segmento ES è caricato fisicamente con 
  l'indirizzo del segmento (area di 64k) che copre 
  le prime 65536 locazioni della memoria Convenzionale in cui trova posto 
  appunto la Tabella dei Vettori, definito TABint 
  (=0000H) |  
      | il puntatore del nuovo Gestore originale viene salvato 
    nelle 4 locazioni [INT_xx+02]:[INT_xx], 
  segment:offset; poichè le locazioni destinazione 
    e i registri sorgente (CS 
    e SI o l'OFFSET
        new_INT) sono di tipo 
  
  WORD non è necessario 
  specificare l'operatore 
  
  Word Ptr per le istruzioni  
        MOV; è invece necessario aggiungere 
  esplicitamente il
  
  segment-override ES: 
  per le prime: |  
   
  
  
    
    
      
        | 
         TABint      
        EQU   0000H  
        INT_xy      EQU   
        0009*4 
                   
        ;------------------------------ 
         
            PUSH  ES 
                    
        MOV  AX,TABint 
            MOV  ES,AX 
         
                   
        ;------[primo Metodo]------------------ 
            
        CLI  
        ;<<<<<<<<<<<<< NB 
            MOV   
        ES:[INT_xy],OFFSET new_INT 
            MOV   
        ES:[INT_xy][2],CS 
            
        STI  
        ;<<<<<<<<<<<<< NB 
         
         
                   
        ;------[secondo Metodo]---------------- 
            
        CLI  
        ;<<<<<<<<<<<<< NB 
         
            PUSH  SI 
         
                    LEA   
        SI,new_INT 
            MOV   
        ES:[INT_xy],SI 
            MOV   
        ES:[INT_xy][2],CS 
            POP   
        SI 
            
        STI  
        ;<<<<<<<<<<<<< NB 
         
         
            POP   
        ES  | 
       
     
   
   |