Real Mode, Interrupt Vektor Ersatz Crashing
-
20-08-2019 - |
Frage
Ich versuche, mehr darüber zu erfahren, wie die Systeme wirklich unter arbeiten alle hübschen Grafiken auf. So spiele ich zur Zeit mit dem Gedächtnis in dem 512bytes, dass der BIOS lädt beim Start, kann es nicht wirklich einen Bootloader ruft im Moment, denke ich. Wie dem auch sei, ich bin zu ersetzen einen Interrupt-Vektor aber mit Probleme mit ihm. Nach Ersetzen Interrupt 09h (die Tastatur) er funktioniert richtig, auf keypress ‚Memory Messing‘ ausgegeben. Aber dann nichts mehr. Jeder Tastendruck danach tut nichts. Ich weiß nicht, ob das System abstürzt oder wenn ich etwas von meinem Handler bin fehlt, hier ist der Code:
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
Lösung
Es ist schon eine lange Zeit, da ich auf den Umgang mit Tastatur Unterbrechungen gearbeitet, aber ich denke, was er verpasst hat tatsächlich die Tastatur Hardware-Handling, damit es die Interrupt-Bedingung klar werden und bereit sein, eine weitere Unterbrechung zu erzeugen.
So etwas wie:
in al, 60h ; Read input buffer
könnte alles was man braucht sein.
Wenn ich eine Chance sehe ich werde, wenn ich irgendwelche alte Notizen oder Code um vom Weg liegend zurück, wenn ich Tastatur-Treiber geschrieben.
Andere Tipps
Meine Vermutung (ich habe noch nie eine Tastatur-Interrupt-Handler geschrieben) ist, dass Sie auch auf der Tastatur Hardware müssen reden, den Tastendruck abrufen (sonst wird die Tastatur nicht wissen, wann eine nächste Unterbrechung erzeugen).
fand ich ein anderes Problem. Wenn wir einen neuen Interrupt-Vektor für eine ISR mit zwei getrennten move-Befehlssatz, dann ist es möglich, dass zwischen diesen beiden mov-Anweisungen ein Interrupt auftreten und dann bekommen sie die Adresse von einem gebrochenen Vektor mit einem Teil des alten Standort und die anderer Teil der neuen Position des ISR. Aber an diesem Ort gibt es keine ISR, keine Anweisungen für ein Ende der Unterbrechung und auch keine iret Anweisung.
Für solche schlechte Ereignisse zu verhindern, dass wir eine cli und sti um diesen Schritt Anweisungen platzieren müssen, um einen neuen Interrupt-Vektor zu setzen.
cli
mov [es:bx], word prints ; My interupt handler
mov [es:bx+2], word 0x00
sti
Dirk
Das ist nur eine wilde Vermutung, aber vielleicht das Problem ist, dass Sie int 10h vom int 9h-Handler aufrufen. Versuchen Sie, Bildschirmspeicher zu schreiben direkt (nur das Byte bei 0b800h erhöhen: 0 und überprüfen links Zeichen auf dem Bildschirm nach oben). Wenn es für jeden Tastendruck erhöht wird, dann sollten Sie nicht int 10h von int 9h nennen.