x86汇编程序运行结束后出现异常输出问题排查
问题:实模式屏幕改色程序在Win2000/XP下结束时出现异常输出
我编写了一段用于更改屏幕颜色的测试代码,虽知晓有更优的改色方案,但仅作测试用途。程序运行过程正常,但在Win2000和WinXP系统下,执行到末尾时都会出现异常输出。
测试代码
MOV AH,00H MOV AL,13H INT 10H MOV BH,00H MOV DX,0000H OuterLoop: MOV CX,0000H InnerLoop: MOV AL,2AH MOV AH,0CH INT 10H INC CX CMP CX,013FH JBE InnerLoop INC DX CMP DX,00C7H JBE OuterLoop MOV AH,00H INT 21H
现象说明
- 背景颜色显示正常:程序运行过程中屏幕能正确呈现预期的改色效果
- 程序结束时的异常输出:程序执行到末尾等待输入时,屏幕出现乱码或异常字符输出
问题原因与解决方法
问题根源
程序最后调用的INT 21H AH=00H是DOS中断的键盘输入功能,但在Win2000/XP的NTVDM虚拟环境下,当前显卡处于VGA图形模式(13H模式,320x200 256色),直接调用该中断会触发系统尝试恢复文本模式,但图形模式未提前切换,导致文本输出与显卡显示模式不匹配,从而出现乱码/异常输出。
修复方案
在调用键盘输入中断前,先将视频模式切换回标准文本模式(比如3号模式,80x25彩色文本),修改后的代码末尾如下:
; 先切换回文本模式 MOV AH,00H MOV AL,03H INT 10H ; 再等待键盘输入 MOV AH,00H INT 21H
这样就能保证系统在文本模式下处理键盘输入,避免模式冲突导致的异常输出。
内容的提问来源于stack exchange,提问作者Leonardo
相关产品推荐
相关产品推荐

