Sezione

Indirizzi Base Registri Interni
Area Comunicazione BIOS Funzioni BIOS Funzioni DOS
Prefazione Capitolo 1 Capitolo 2 Schede
Libreria ASM Libreria MAC Palestra Progetti ASM
Info Download INDICE

Schede del Tutorial

Home » Programma il Computer » Tutorial Assembly

Le Schede del Tutorial

  La Tabella dei Vettori

SCHEDA n° 04 [ 14  di 15] 

    

    Modifica e sostituzione (rimappatura) di un Vettore [4 di 4]
  
   
bullet
    Installazione del Nuovo Gestore
bullet Installare il nuovo Gestore significa aggiornare la Tabella dei Vettori d'Interruzione con il suo indirizzo.
bulletData l'importanza di questa operazione il sistema operativo DOS prevede, nel suo kernel INT 21H, una specifica funzione, caratterizzata dal numero 25H, di solito passato tramite il registro AH; basta specificare il AL il numero del vettore da rimappare e caricare il suo indirizzo in DS:DX; la funzione fa tutto il necessario (cioè va a scriverlo nelle giuste locazioni  della Tabella dei Vettori, al posto di quello originale).
bulletMa nessuno vieta di espletare questo compito con le normali tecniche di lettura di memoria; da notare che, per la delicatezza di questa operazione, durante la modifica della Tabella dei Vettori conviene disabilitare (CLI) le interruzioni mascherabili, riabilitandole (STI) subito dopo.
bulletE' dunque possibile scrivere l'indirizzo in molti modi diversi: vediamone alcuni.
   
bullet 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 

     
bullet 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:
bullet 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
bulletindividua 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).
bullet 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.
bulletle 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.
bulletper 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  

     
bullet 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:
bulletla 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
bulletIl 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)
bulletil 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

    

Pagina Precedente Scheda n° 04 Pagina Successiva La Tabella dei Vettori Torna al Menu delle Schede del "Tutorial" Lezioni - Vai al DownLoad dei files DOC Torna al Menu del "Tutorial"
Scheda n° 04 -  14
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15

    

SCHEDE » 1.Header EXE 2.PseudoOp MASM 3.Differenza tra Macro e Procedure
4.
Tabella Vettori 5.PSP 6.Stack 7.Istruzioni 80x86
8.La misura dell'Informazione 9.Numeri e Logica Binaria
TUTORIAL » Indirizzi Base | Registri Interni | Area Comunicaz. BIOS | Funzioni BIOS | Funzioni DOS
Prefazione | CAP 1 | CAP 2 | Schede | Palestra
Libreria ASM | Libreria MAC | Progetti ASM | Download | Info | Indice
Home 
Pascal|Manuali|Tabelle|Schede
Tutorial Assembly|Palestra Assembler
Aggiungi Giobe®2000 ai preferiti  
Motore
Ricerca
  Rendi Giobe®2000 pagina di Default
© 2001-2010  -  Studio Tecnico ing. Giorgio OBER
Tutti i diritti sono riservati