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
War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top