You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

x86汇编自定义Interrupt 09处理异常:KeyList无数据存储排查

问题分析与解决

你的自定义Int 09h处理程序无法正确更新KeyList数组,主要存在以下几个关键问题:

1. 中断处理程序未设置数据段寄存器DS

CPU触发中断时,仅自动保存CS、IP和FLAGS,不会保留当前DS的值。此时DS指向的内存段大概率不是你程序的数据段,导致mov KeyList + [bx], ah指令实际写入的是错误内存区域,根本无法更新你定义的KeyList数组。

解决方法:在中断处理程序开头保存原DS,再加载程序的数据段地址:

onKeyEvent proc   ; custom handler for int 09h
    push ax 
    push bx
    push ds       ; 保存原DS值
    mov ax, @data ; 加载程序数据段地址到AX
    mov ds, ax    ; 将DS指向程序数据段

    in   al, 60h
    mov  ah, 0
    mov  bx, ax
    and  bx, 127           ; 提取7位扫描码到BX
    shl  ax, 1             ; 将按键状态位移到AH
    xor  ah, 1             ; 转换为:AH=1表示按下,AH=0表示释放
    mov  KeyList + [bx], ah
    mov  al, 20h           ; 发送非特定EOI结束中断
    out  20h, al

    pop ds        ; 恢复原DS值
    pop  bx
    pop ax
    iret
onKeyEvent endp 

2. 恢复原中断向量的代码顺序错误

你保存原中断向量时执行了push es bx,但恢复时却用pop dx和pop ds,栈操作完全不匹配,会导致栈混乱,既无法正确恢复原中断向量,还可能引发程序崩溃。

正确的恢复代码:

exitt:
    pop bx       ; 弹出原中断处理程序的偏移地址
    pop es       ; 弹出原中断处理程序的段地址
    mov dx, bx   ; 将偏移地址传入DX
    mov ax, 2509h
    int 21h      ; 恢复原Int 09h中断向量

3. 图形模式下错误使用DOS文本输出功能

你切换到了13h图形模式,但print部分调用int 21h ah=9是DOS的文本模式字符串输出功能,在图形模式下无法正常显示内容。如果需要在图形模式输出字符,应该使用int 10h的相关功能(比如ah=0Ah写字符)。


内容的提问来源于stack exchange,提问作者zizo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 11:52:40