2009-05-09 17 views
6

Estoy tratando de aprender más acerca de cómo los sistemas funcionan realmente debajo de todos los gráficos bonitos en la parte superior. Así que actualmente estoy jugando con la memoria en los 512bytes que carga el BIOS al inicio, realmente no puedo llamarlo cargador de arranque en este momento, supongo. De todos modos, estoy reemplazando un vector de interrupción pero teniendo problemas con él. Después de reemplazar interupt 09h (el teclado) funciona correctamente, al presionar la tecla 'Memory messing' se emite. Pero luego nada. Cada pulsación de tecla después no hace nada. No sé si el sistema se bloquea o si me falta algo de mi manejador, aquí está el código:Modo real, interrupción reemplazo de vector Crashing

jmp start 
times 100 db 0 ; Cleared space for stack 

start: 
xor ax, ax 
mov ax, start 
sub ax, 80 
mov sp, ax 

mov al, 0x09 ; Interupt number 
mov bl, 4 
mul bl 
mov bx, ax 
xor ax, ax 
mov es, ax 
mov [es:bx], word prints ; My interupt handler 
add bx, 2 
mov [es:bx], word 0x00 

bloader: 
    jmp bloader 

prints: 
    cli 
    push ax 
    push bx 
    push si 
    mov si, msg  ; Message to print 
    mov bl, 0x07 
    mov bh, 0x00 
    printnb: 
     lodsb  ; Grab byte from message 
     cmp al, 0 ; End of message 
     je printf 
     mov ah, 0x0E 
     int 0x10 ; Print byte 
     jmp printnb 
    printf: 
     mov al, 0x20 
     out 0x20, al ; Inform interupt controller interupt has been handled 
     pop si 
     pop bx 
     pop ax 
     sti 
     iret ; Interupt return 

msg db "Memory messing",0 

times 510 - ($ - $$) db 0 
dw 0xAA55 

Respuesta

6

Ha pasado mucho tiempo desde que trabajé para manejar las interrupciones del teclado, pero creo que lo que se está perdiendo es realmente manejar el hardware del teclado para que borre la condición de interrupción y esté listo para generar otra interrupción.

Algo así como:

  in  al, 60h  ; Read input buffer 

podría ser todo lo necesario.

Si tengo la oportunidad, veré si tengo notas viejas o algún código viejo cuando escribía controladores de teclado.

+0

Esta arreglado. Gracias una carga. – Dave

0

Esto sólo es una conjetura salvaje, pero tal vez el problema es que usted está llamando int 10h desde el controlador int 9h. Intente escribir en la memoria de la pantalla directamente (simplemente incremente el byte a 0b800h: 0 y verifique el carácter superior izquierdo en la pantalla). Si se incrementa para cada pulsación de tecla, no debe llamar a int 10h desde int 9h.

1

Mi suposición (nunca he escrito un controlador de interrupción de teclado) es que también necesita hablar con el hardware del teclado, para recuperar la pulsación de teclas (de lo contrario, el teclado no sabrá cuándo generar una próxima interrupción).

1

Encontré otro problema. Si establecemos un nuevo vector de interrupción para un ISR con dos instrucciones de movimiento separadas, entonces es posible que entre ambas instrucciones mov se produzca una interrupción y luego obtenga la dirección de un vector roto con una parte de la ubicación anterior y la otra parte de la nueva ubicación del ISR. Pero en esta ubicación no hay ISR, no hay instrucciones para un FIN de interrupción y tampoco ninguna instrucción iret.

Para evitar tales eventos malos, tenemos que colocar un cli y sti alrededor de esas instrucciones de movimiento para establecer un nuevo vector de interrupción.

cli 
mov [es:bx], word prints ; My interupt handler 
mov [es:bx+2], word 0x00 
sti 

Dirk