2014-09-05 61 views
1

我更换×09的自定义中断中断键盘中断处理火一次

像下面

的问题是,INT火一次。

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

我在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 
+0

只是一个方面说明:我会小心使用'cs'在你的代码中给你。因为您明确使用'org 0x7c00',所以在执行其他任何操作之前,您应该将'cs'设置为零。虽然这对您的特定设置不是问题,但对于其他设置(即不同的虚拟机)可能会造成问题。 另外,问题可能是原始的'int 9'例程做了一些你不知道的事情,即确认按键。 – 2014-09-05 03:45:12

+0

你在哪里承认中断? – 2014-09-05 07:54:20

+0

你会改写'承认中断'吗?我不明白。 – Taeyun 2014-09-05 07:57:22

回答

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 

,并触发预期。

谢谢!