我想更多地了解系统如何真正发挥作用下在上面所有漂亮的图形。所以,我目前正与记忆播放在启动时加载BIOS,真的不能称之为一个引导程序在我想此刻的512字节。无论如何,我更换一个中断向量,但与它有问题。替换interupt 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
有帮助吗?

解决方案

这是一个很长一段时间,因为我的工作是处理键盘中断,但我认为你错过了什么是真正处理键盘硬件所以它会清除中断状态,并准备产生另一个中断。

是这样的:

         in     al, 60h     ; Read input buffer 

可能是所有需要。

如果我有机会,我会看,如果我有任何旧钞或代码的方式躺在附近回来时,我写的键盘驱动程序。

其他提示

我的猜测(我从来没有写过键盘中断处理程序)是你还需要交谈的键盘硬件,检索按键(否则,键盘会不知道到时产生一个中断)。

我发现了另一个问题。如果我们设置了两个独立的举动,指令的ISR一个新的中断向量,则有可能是这两个MOV的指令中断之间进行,然后将其与原来的位置的一个部分和获取来自一个破碎的向量地址ISR的新位置的另一部分。但是在这个位置没有ISR,中断的端部没有说明,还没有IRET指令。

有关防止此类事件的恶劣,我们必须把围绕这些举动指令的CLI和STI要设置的新的中断向量。

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

德克

这只是胡乱猜测,但也许问题是,你在呼唤从INT 9h的处理程序INT 10H。尝试直接写入屏幕内存(就在0b800h递增字节:0,并检查屏幕上方左字符)。如果它被递增每个按键,那么你不应该从int 9H调用INT 10H。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top