6

我正在尝试更多地了解系统是如何在上面所有漂亮的图形下真正工作的。因此,我目前正在使用 BIOS 在启动时加载的 512 字节内存,目前我猜还不能真正将其称为引导加载程序。无论如何,我正在替换一个中断向量,但有问题。更换中断 09h(键盘)后,它可以正常工作,按键时会输出“内存混乱”。但后来什么都没有。之后的每一次按键都无济于事。我不知道系统是否崩溃,或者我的处理程序是否遗漏了一些东西,下面是代码:

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
4

4 回答 4

6

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

就像是:

         in     al, 60h     ; Read input buffer 

可能就是全部。

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

于 2009-05-09T00:39:12.377 回答
1

我的猜测(我从未编写过键盘中断处理程序)是您还需要与键盘硬件交谈,以检索击键(否则键盘将不知道何时生成下一个中断)。

于 2009-05-09T00:44:29.260 回答
1

我发现了另一个问题。如果我们为具有两个单独的移动指令的 ISR 设置一个新的中断向量,那么有可能在这两个 mov 指令之间发生一个中断,然后它从一个损坏的向量中获取地址,其中包含旧位置的一部分和ISR 的新位置的其他部分。但是在这个位置上没有 ISR,没有中断结束指令,也没有 iret 指令。

为了防止此类不良事件,我们必须在这些移动指令周围放置一个 cli 和 sti 以设置新的中断向量。

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

短剑

于 2014-02-24T11:01:10.300 回答
0

这只是一个疯狂的猜测,但问题可能在于您正在从 int 9h 处理程序调用 int 10h。尝试直接写入屏幕内存(只需在 0b800h:0 处增加字节并检查屏幕左上角的字符)。如果每次按键都增加,那么你不应该从 int 9h 调用 int 10h。

于 2009-05-09T00:37:54.393 回答