2009-05-09 16 views
6

Ich versuche, mehr darüber zu lernen, wie Systeme wirklich unter all den schönen Grafiken an der Spitze funktionieren. Ich spiele gerade mit Speicher in den 512 Bytes, die das BIOS beim Start lädt, ich kann es im Moment nicht wirklich als Bootloader bezeichnen. Jedenfalls ersetze ich einen Interrupt-Vektor, habe aber Probleme damit. Nach dem Austausch von interupt 09h (der Tastatur) funktioniert es richtig, beim Tastendruck wird 'Memory messing' ausgegeben. Aber dann nichts. Jeder Tastendruck macht danach nichts. Ich weiß nicht, ob das System abstürzt oder wenn ich etwas von meinem Handler bin fehlt, hier ist der Code:Real Mode, Interrupt-Vektor-Ersatz 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 

Antwort

6

Es ist schon eine ganze Weile her, dass ich mit Tastatur-Interrupts gearbeitet habe, aber ich denke, was Sie vermissen, ist die Tastatur-Hardware, damit der Interrupt-Zustand aufgehoben und ein weiterer Interrupt erzeugt wird.

Etwas wie:

  in  al, 60h  ; Read input buffer 

könnte alles was man braucht sein.

Wenn ich eine Chance bekomme, werde ich sehen, ob ich irgendwelche alten Notizen oder Code herumliegen habe, als ich Tastaturtreiber geschrieben habe.

+0

Dieses es fixiert. Danke eine Ladung. – Dave

0

Dies ist nur eine wilde Vermutung, aber vielleicht das Problem ist, dass Sie int 10h rufen von der Int 9h Handler. Versuchen Sie, direkt in den Bildschirmspeicher zu schreiben (erhöhen Sie einfach das Byte bei 0b800h: 0 und prüfen Sie, ob das Zeichen oben links auf dem Bildschirm angezeigt wird). Wenn es für jeden Tastendruck inkrementiert wird, sollten Sie int 10h nicht von int 9h aufrufen.

1

Meine Vermutung (ich habe noch nie einen Tastaturinterrupthandler geschrieben) ist, dass Sie auch mit der Tastaturhardware sprechen müssen, um den Tastenanschlag abzurufen (andernfalls weiß die Tastatur nicht, wann ein nächster Interrupt generiert werden soll).

1

Ich fand ein anderes Problem. Wenn wir einen neuen Interrupt-Vektor für eine ISR mit zwei separaten move-Anweisungen setzen, dann ist es möglich, dass zwischen diesen beiden mov-Anweisungen ein Interrupt auftritt und dann die Adresse aus einem defekten Vektor mit einem Teil der alten Position und der anderer Teil des neuen Standorts des ISR. Aber an dieser Stelle gibt es keine ISR, keine Anweisungen für ein ENDE von Interrupt und auch keine IRET-Anweisung.

Um solche schlechten Ereignisse zu verhindern, müssen wir einen cli und sti um diese Bewegungsbefehle setzen, um einen neuen Interruptvektor zu setzen.

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

Dirk