实模式,中断向量替换崩溃

Dav*_*ave 6 x86 assembly interrupt-handling bootloader

我正在尝试更多地了解系统如何真正在顶部所有漂亮的图形下工作.所以我现在正在使用BIOS在启动时加载的512字节内存,在我猜的时候真的不能称之为引导加载程序.无论如何,我正在替换一个中断向量,但有问题.更换中断09h(键盘)后,它正常工作,在按键上输出"Memory messing".但没什么.之后的每一个按键都什么都不做.我不知道系统是否崩溃,或者我是否遗漏了我的处理程序中的内容,这里是代码:

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
Run Code Online (Sandbox Code Playgroud)

Mic*_*urr 6

自从我处理键盘中断以来已经有很长一段时间了,但我认为你所缺少的实际上是处理键盘硬件所以它将清除中断条件并准备好生成另一个中断.

就像是:

         in     al, 60h     ; Read input buffer 
Run Code Online (Sandbox Code Playgroud)

可能只需要一切.

如果我有机会,当我编写键盘驱动程序时,我会看到我是否有任何旧笔记或代码.