Alter interrupção em 16 bit modo real
Pergunta
Eu estou tentando alterar a minha mesa de interrupção para assumir a interrupção do teclado. Meu objetivo final é escrever minha nova rotina de interrupção, copie-me em RAM e fazer de modo real de interrupção ponto de mesa para mim.
Eu encontrei aleatória amostra de código online, mas está faltando explicações sobre como obter o endereço da interrupção originais. Eles simplesmente têm variáveis ??em seu lugar, e como colocar-se na memória.
Então, minha pergunta é como faço para descobrir ou imprimir à minha tela de modo real interrupção mesa?
e / ou se alguém tem quaisquer exemplos de código boas de se fazer isso a qualquer certas teclas desativar ou beep em determinadas chaves Eu realmente aprecio isso.
Obrigado!
Solução
Em modo real de 16 bits, a tabela de interrupção começa no endereço 0, com entradas 256 de 4 bytes. Cada um dos vectores de interrupção 256 recebe um endereço de quatro bytes (segmento + offset) no mesmo quadro.
http://en.wikipedia.org/wiki/Interrupt_descriptor_table tem mais algum detalhe .
Outras dicas
Se o seu programa está sendo executado em DOS, você pode (e provavelmente deve) usar a API DOS fornecido:
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