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 [ 12  di 15] 

    

    Modifica e sostituzione (rimappatura) di un Vettore [2 di 4]
  
bullet
    Predisposizione delle variabili locali destinate a ricordare il vecchio Vettore
bulletIl programma chiamato ad installare la nuova procedura deve anzitutto provvedere a leggere l'indirizzo (Vettore) della procedura di servizio originale che sta per essere sostituita
bulletA partire dal numero xyH dell'Interrupt Software (INT) che si desidera rimappare si individuano le 4 locazioni della Tabella dei Vettori che lo contengono, al fine di copiarne il valore in un posto sicuro; la prima cosa da fare è dunque definire una variabile DWORD (DD, 32 bit, 4bytes, adatta a contenere in blocco la coppia segment:offset del puntatore) o 2 variabili WORD (DW, 16 bit, 2bytes, ciascuna adatta a contenere o la parte segment o la parte offset del puntatore).
bulletOsserviamo come sia necessario stabilire un nome per queste varabili: abbiamo deciso old_INT per quella a 32bit e old_SEG/old_OFF per le 2 a 16 bit; le tecniche assembly che discuteremo in seguito daranno per scontata la presenza o della prima o delle seconde, ma entrambe le soluzioni sono perfettamente intercambiabili e valide, e il nostro programma riserverà comunque 4 locazioni di memoria RAM:

      

old_INT     DD    00000000H

old_SEG     DW    0000H
old_OFF     DW    0000H

     
bullet
    Recupero del Vettore originale e sua memorizzazione
bulletData l'importanza di questa operazione il sistema operativo DOS prevede, nel suo kernel INT 21H, una specifica funzione, caratterizzata dal numero 35H, di solito passato tramite il registro AH; basta specificare il AL il numero del vettore da rimappare e la funzione fa tutto il necessario (cioè va a leggere le giuste locazioni  in tabella), lasciando il risultato nei 2 registri ES:BX.
bulletMa nessuno vieta di assumere questa informazione con le normali tecniche di lettura di memoria; è dunque possibile recuperare l'indirizzo in molti modi diversi: vediamone alcuni.
   
bullet Lettura della Tabella dei Vettori con la funzione 35H 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 assume in ES:BX l'indirizzo effettivo (vettore di interruzione) della procedura di servizio associata all'Interrupt il cui numero xy è predisposto in ingresso in AL; il resto del codice assembly deve provvedere al salvataggio di questa preziosa informazione.
La prima variante assume e salva il puntatore del Gestore originale nelle 4 locazioni locali [old_INT]; da notare che, essendo le locazioni destinazione di tipo DWORD (32 bit), l'inserimento di un dato più piccolo (il contenuto di registri a 16 bit) produrrà segnalazione d'errore da parte del compilatore se non si specifica l'operatore Word Ptr:

      

            PUSH  ES
            PUSH  AX
            PUSH  BX

            MOV   AL,xy
            MOV   AH,35H
            INT   21H


            MOV   Word Ptr [old_INT],BX
            MOV   Word Ptr [old_INT][2],ES
                                         
            POP   BX
            POP   AX
            POP   ES

      

la seconda variante salva il puntatore del Gestore originale nelle 4 locazioni locali [old_SEG]/[old_OFF]; da notare che essendo ora entrambe le locazioni destinazione di tipo WORD non è necessario specificare l'operatore Word Ptr per le istruzioni MOV, essendo BX e ES della stessa loro dimensione:

      

            PUSH  ES
            PUSH  AX
            PUSH  BX

            MOV   AL,xy
            MOV   AH,35H
            INT   21H


            MOV   [old_OFF],BX
            MOV   [old_SEG],ES
                                         
            POP   BX
            POP   AX
            POP   ES

     
bullet Lettura della Tabella dei Vettori con tecniche tradizionali [1 di 2]
Il secondo modo di assumere  l'indirizzo desiderato è legato alle tecniche tradizionali di lettura della memoria; in questo caso però utilizza un metodo piuttosto sofisticato (e probabilmente eccessivo...) per localizzare le informazioni desiderate:
bullet con l'aiuto della pseudooperazione SEGMENT AT, definisce un segmento (la solita 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 cattura vettore saranno quelle che inizializzano anche fisicamente registro di segmento ES per puntare la Tabella dei Vettori, operazione realizzata con l'aiuto si AX.

      

Con questa premessa, per salvare il vettore originale sono disponibili le stesse 2 varianti di prima; la prima variante assume e salva il puntatore del Gestore originale nelle 4 locazioni locali [old_INT]; da notare che essendo sia le locazioni sorgente che quelle destinazione di tipo DWORD (32 bit), l'inserimento di un dato più piccolo (i 16 bit del registro AX) 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

            MOV   Word Ptr AX,[INT_xy]
            MOV   Word Ptr [old_INT],AX
            MOV   Word Ptr AX,[INT_xy][2]
            MOV   Word Ptr [old_INT][2],AX
            POP   ES

      

La seconda variante salva il puntatore del Gestore originale nelle 4 locazioni locali [old_SEG]/[old_OFF]; da notare che essendo sia le locazioni sorgente che quelle destinazione di tipo WORD non è necessario specificare l'operatore Word Ptr per le istruzioni MOV, essendo AX della stessa loro dimensione:

      

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

            MOV   AX,[INT_xy]
            MOV   [old_OFF],AX
            MOV   AX,[INT_xy][2]
            MOV   [old_SEG][2],AX
            POP   ES  

     
bullet Lettura della Tabella dei Vettori con tecniche tradizionali [2 di 2]
Anche il terzo modo di assumere  l'indirizzo desiderato è legato alle tecniche tradizionali di lettura 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ù autonomo:
bulletla localizzazione delle locazioni da cui estrarre 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 Gestore originale, [INT_xx+02]:[INT_xx], segment:offset, viene salvato nelle 4 locazioni locali [old_SEG]/[old_OFF]; poichè tutte le locazioni (sorgente e destinazione) di tipo WORD non è necessario specificare l'operatore Word Ptr per le istruzioni MOV, essendo AX della stessa loro dimensione; è invece necessario aggiungere esplicitamente il segment-override ES: per le locazioni sorgente, mentre per le locazioni destinazione si può aggiungere facoltativamente il segment-override CS::

      

TABint      EQU   0000H
INT_xy      EQU   0009*4            

            PUSH  ES
            MOV  AX,TABint
            MOV  ES,AX

           
            MOV   AX,ES:[INT_xy]
            MOV   [old_OFF],AX
            MOV   AX,ES:[INT_xy][2]
            MOV   [old_SEG],AX           
            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 -  12
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