|
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 |
|