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