【发布时间】:2014-09-05 03:38:32
【问题描述】:
我用自定义中断替换 0x09 中断
如下图
问题是 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 $ 上方时,中断触发 5 次。 所以看来中断本身并没有错。
int 9
int 9
int 9
int 9
int 9
【问题讨论】:
-
只是一个旁注:我会小心在你给你的代码中使用
cs。因为您明确使用org 0x7c00,所以您应该在执行任何其他操作之前将cs设置为零。虽然这对于您的特定设置不是问题,但对于其他设置(即不同的虚拟机)可能是一个问题。此外,问题可能在于原始的int 9例程做了一些你没有做的事情,即确认按键。 -
你在哪里确认中断?
-
你会改写“确认中断”吗?我不明白。
-
你的意思是 mov 20h, al;al =20h 吗?我没有放那个代码。我需要吗?我不知道为什么它需要那个代码。
标签: assembly keyboard handler interrupt