我用自定义中断替换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
答案 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
它按预期发射。
谢谢!