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
相关产品推荐
相关产品推荐

