【问题标题】:keyboard interrupt handler fire only once键盘中断处理程序只触发一次
【发布时间】: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


【解决方案1】:

解决了。 感谢 cmets。

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

它会按预期触发。

谢谢!

【讨论】:

    猜你喜欢
    • 2011-03-07
    • 2016-04-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-16
    • 2017-03-24
    • 1970-01-01
    • 2015-08-22
    相关资源
    最近更新 更多