DOSBox中Assembly清屏异常求助:画面缩放或光标丢失
DOSBox汇编清屏异常问题修复
问题根源
- 错误的清屏逻辑:原
clear_screen子程序通过滚动行模拟清屏,实际是将屏幕内容上移一行,最后一行残留旧内容,并非真正清空,导致显示异常(如画面残留、视觉上的“放大”感)。 - 冗余的中断调用:每次调用
clear_screen后额外执行的int 10h未指定功能号,会触发未知视频操作,干扰显示状态。 - 未重置光标:清屏后光标停留在原位置,可能超出可见区域,导致看似“消失”。
可靠的清屏实现
推荐使用BIOS中断实现标准清屏,同时重置光标到屏幕左上角,兼容性和稳定性更好:
clear_screen: ; 调用BIOS清屏功能 mov ah, 06h ; 功能:向上滚动窗口(0=全屏清除) mov al, 00h ; 滚动行数=0(全部清除) mov bh, 07h ; 新行属性:黑底白字(默认文本属性) mov ch, 00h ; 窗口左上角行号 mov cl, 00h ; 窗口左上角列号 mov dh, 19h ; 窗口右下角行号(25行模式对应19h) mov dl, 4Fh ; 窗口右下角列号(80列模式对应4Fh) int 10h ; 将光标重置到屏幕左上角 mov ah, 02h mov bh, 00h ; 显示页号0 mov dh, 00h ; 目标行号 mov dl, 00h ; 目标列号 int 10h ret
如果偏好直接操作显存,也可以用以下实现:
clear_screen: mov ax, 0B800h ; 文本模式显存基地址 mov es, ax xor di, di ; 初始化显存指针到起始位置 mov ax, 0720h ; 07h=黑底白字属性,20h=空格字符 mov cx, 25*80 ; 全屏字符总数 rep stosw ; 批量填充显存 ret
原代码其他修正点
删除所有call clear_screen之后的冗余int 10h调用,比如:
destination:标签后的int 10haddsnacks:、addbeverages:等标签后的int 10h
这些无功能号的中断调用会破坏视频状态,导致显示异常。
内容的提问来源于stack exchange,提问作者Joseph Lim
相关产品推荐
相关产品推荐

