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

DOSBox中Assembly清屏异常求助:画面缩放或光标丢失

DOSBox汇编清屏异常问题修复

问题根源

  1. 错误的清屏逻辑:原clear_screen子程序通过滚动行模拟清屏,实际是将屏幕内容上移一行,最后一行残留旧内容,并非真正清空,导致显示异常(如画面残留、视觉上的“放大”感)。
  2. 冗余的中断调用:每次调用clear_screen后额外执行的int 10h未指定功能号,会触发未知视频操作,干扰显示状态。
  3. 未重置光标:清屏后光标停留在原位置,可能超出可见区域,导致看似“消失”。

可靠的清屏实现

推荐使用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 10h
  • addsnacks:、addbeverages:等标签后的int 10h

这些无功能号的中断调用会破坏视频状态,导致显示异常。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 10:59:49