键盘中断处理程序只触发一次

时间:2014-09-05 03:38:33

标签: assembly keyboard handler interrupt

我用自定义中断替换0x09中断

如下所示

问题是int fire只有一次。

即使我多次按键,它也只会触发一次。

我在Virtualbox上测试过。

org 0x7c00

jmp start

handler:
jmp handler_code
cur_x:
db 0
handler_code:   
    mov bh,0
    mov dh, 5
    mov dl, [cur_x]
    mov ah, 2
    int 0x10

    mov al, 'A'
    mov cx, 1
    mov bh, 0
    mov ah, 0x0a
    int 0x10
    add byte [cur_x], 1

    iret

start:
push cs
pop ds

push 0
pop es
mov bx, 36

mov word [es:bx], handler
mov word [es:bx+2], cs

jmp $

times 510 - ($-$$) db 0
db 0x55
db 0xaa

times 1474560 - ($-$$) db 0

加载在0x7c00上的代码。 跳到开始部分。 启动部分有中断替换例程。 它jmp到当前地址所以它永远循环。 即使它是无所事事的永恒循环,我也可以通过按键来触发处理程序。 当我按下一个键时,它会发射。但下次没有发生任何事情。

奇怪的是那个 当我把以下代码放在jmp $之上时,中断会触发5次。 所以看起来中断本身并没有错。

int 9
int 9
int 9
int 9
int 9

1 个答案:

答案 0 :(得分:1)

它解决了。 感谢您的评论。

handler:
jmp handler_code
cur_x:
db 0
handler_code:
    mov bh,0
    mov dh, 5
    mov dl, [cur_x]
    mov ah, 2
    int 0x10


    mov al, 'A'
    mov cx, 1
    mov bh, 0
    mov ah, 0x0a
    int 0x10
    add byte [cur_x], 1

    push ax
    in al, 0x60

    mov al, 0x20
    out 0x20, al
    pop ax
    iret

问题是中断确认。 我添加了

push ax
in al, 0x60
mov al, 0x20
out 0x20, al
pop ax

它按预期发射。

谢谢!