|
 |
La
Tabella dei Vettori |
SCHEDA n° 04 [
13
di 15] |
 |
|
Modifica e sostituzione (rimappatura) di un Vettore [3 di
4] |
|
 |
|
Creazione di un Nuovo Gestore |
|
 | La creazione di una nuova
procedura di gestione può aver bisogno dell'indirizzo del
vecchio Gestore; per questa ragione
diamo per scontato che il programma che lo ospita contenga anche le variabili
di deposito definite nella pagina precedente, cioè la
variabile
DWORD (DD,
32 bit, 4bytes,
segment:offset del puntatore) e/o le 2
variabili
WORD (DW,
16 bit, 2bytes, parte
segment e parte offset del puntatore),
chiamate rispettivamente old_INT e
old_SEG/old_OFF:
|
old_INT
DD 00000000H |
|
old_SEG
DW 0000H
old_OFF DW 0000H |
|
 | Il nuovo Gestore associato al
Vettore può:
 | essere del tutto diverso dall'originale, assicurando servizi del tutto
alternativi; non sempre questa è la soluzione migliore dato che, in questo
caso, le caratteristiche originali vengono completamente perdute e il sistema
potrebbe non assicurare un corretto funzionamento. |
 | può chiamare
il vecchio Gestore, come se fosse una normale Procedura del
sistema, aggiungendo subito dopo il
nuovo servizio: in questo caso le caratteristiche originali vengono
comunque garantite, insieme a
quelle da noi desiderate; per lanciare regolarmente il Gestore originale si
usa questa tecnica: |
|
PUSHF
;Lancia regolarmente il Gestore
CALL
CS:[old_INT];originale che svolge i suoi
;normali compiti tradizionali
;
....
...... ;** Attiva il servizio desiderato
; |
 | può provvedere subito
alle esigenze del nuovo servizio e poi rientrare
nel vecchio Gestore, con un normale
Salto Far; anche in questo caso le caratteristiche originali
vengono comunque garantite, insieme
a quelle da noi desiderate: |
|
;
....
...... ;** Attiva il servizio desiderato
;
;Rientra regolarmente nel Gestore
JMP
CS:[old_INT];originale, che svolge i suoi
;normali compiti tradizionali |
|
 | In ogni caso è sempre opportuno salvare all'inizio
il
contesto con
PUSH
dei registri utilizzati (comprese le
flag del processore); supponendo che la
nuova procedura di servizio si chiami new_INT,
la sua parte iniziale potrebbe essere:
|
new_INT
PROC FAR
PUSH AX
;
PUSH BX
;Salvataggio dei registri, in accordo
PUSH CX
;con la migliore tradizione di
PUSH DX
;progetto delle procedure di
PUSH DI
;servizio delle interruzioni
PUSH SI
;
PUSH DS
;
PUSH ES
;
PUSHF
;
;
....
...... ;** Attiva il servizio desiderato
; |
|
 |
Se si tratta di un Nuovo Gestore
HardWare, dopo aver eseguito le desiderate operazioni di
servizio, è assolutamente necessario
ricordare che, prima di restituire il controllo, bisogna
avvisare il controllore delle interruzioni
(8259) che
la procedura di servizio è terminata spedendogli il
codice 20H di
Fine Interruzione. |
 | L'Integrato 8259 è
accessibile attraverso il registro di Comando
Interruzioni, di indirizzo 0020H
(_8259ct); al termine di ogni procedura di
servizio di interruzione Hardware è
necessario segnalarne la fine spedendogli la parola esadecimale
20H = EOI =
End Of Interrupt, con le seguenti
istruzioni:
|
PUSH AX
MOV
AL,EOI
OUT
_8259ct,AL
POP
AX |
|
 | Naturalmente la procedura dedicata al nuovo gestore
terminerà con il recupero del contesto iniziale
con
POP dei registri precedentemente salvati,
riabilitando le interruzioni
mascherabili (con
STI) e ricordandosi di
restituire il controllo con
IRET:
|
POPF
POP ES
POP
DS
POP
SI
POP
DI
POP
DX
POP
CX
POP
BX
POP
AX
STI
IRET
new_INT ENDP |
|
©
2001-2010 - Studio Tecnico
ing. Giorgio OBER
Tutti i diritti sono riservati
|