Alter Interrupt in modalità reale a 16 bit
Domanda
Sto cercando di modificare la mia tabella di interrupt per assumere l'interrupt di tastiera. Il mio obiettivo finale è scrivere la mia nuova routine di interrupt, copiarmi nella RAM e fare in modo che la tabella degli interrupt in modalità reale mi punti.
Ho trovato casuale codice di esempio online ma mancano spiegazioni su come ottenere l'indirizzo dell'interrupt originale. Hanno semplicemente delle variabili al loro posto e come mettersi in memoria.
Quindi la mia domanda è: come faccio a capire o stampare sul mio schermo la tabella degli interrupt in modalità reale?
E / O se qualcuno ha qualche buon esempio di codice per farlo per disabilitare determinate chiavi o emettere un segnale acustico su certe chiavi lo apprezzerei davvero.
Grazie!
Soluzione
Nella modalità reale a 16 bit, la tabella degli interrupt inizia all'indirizzo 0, con 256 voci a 4 byte. Ciascuno dei 256 vettori di interrupt ottiene un indirizzo di 4 byte (segmento + offset) in quella tabella.
http://en.wikipedia.org/wiki/Interrupt_descriptor_table ha qualche dettaglio in più .
Altri suggerimenti
Se il tuo programma è in esecuzione in DOS, puoi (e probabilmente dovresti) usare l'API fornita da DOS:
MOV AH,35H ; function 35H is Get Vector
MOV Al,9 ; slot in IDT for keyboard interrupt
INT 21H ; call DOS, contents of old vector in ES:BX (save them somewhere)
.
.
MOV AH,25H ; function 25H is Set Vector
MOV AL,9
PUSH CS ; the new vector is passed in DS:DX, so copy CS to DS
POP DS : (assuming your new handler is in the same seg as other code)
MOV DX,NewHandler
INT 21H