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

DOSBox中单字节打印字符后,如何移动光标至下一个位置?

解决DOSBox中逐个打印字符后光标不移动的问题

嘿,这个问题我之前帮人解决过好几次!你遇到的核心问题是:当你逐个打印字符时,如果没有主动更新光标位置,DOS/BIOS就不会自动移动光标,导致所有字符都叠在同一个位置显示。下面给你两种最实用的解决办法:

方法1:手动更新光标位置(适合直接操作显存的场景)

如果你是直接往显存地址(比如0xB8000)写入字符和属性,DOS完全不知道你修改了屏幕内容,所以必须手动调用BIOS中断来移动光标。步骤很简单:

  • 先获取当前光标所在的行和列
  • 计算下一个光标位置(列数+1,行尾时换行,屏幕底部时滚屏或回到顶部)
  • 设置新的光标位置

给你一段汇编代码示例:

; 假设你已经完成了单个字符的打印,现在要移动光标
mov ah, 0x03   ; BIOS中断0x10的功能3:获取光标位置
mov bh, 0x00   ; 指定显示页为0(绝大多数DOS场景用页0)
int 0x10       ; 调用后,dh=当前行号,dl=当前列号

; 计算下一个光标位置
inc dl         ; 列号加1,移到下一个字符位置
cmp dl, 80     ; 检查是否到达行尾(默认DOS屏幕宽度是80列)
jne set_new_cursor ; 没到行尾,直接跳去设置光标

; 到了行尾,换行处理
mov dl, 0      ; 列号重置为0
inc dh         ; 行号加1
cmp dh, 24     ; 检查是否到达屏幕底部(默认DOS屏幕高度是24行)
jne set_new_cursor

; 到了屏幕底部,回到第一行
mov dh, 0

set_new_cursor:
mov ah, 0x02   ; BIOS中断0x10的功能2:设置光标位置
mov bh, 0x00   ; 还是用页0
int 0x10       ; 调用后光标就移动到新位置了

方法2:用自带光标移动的DOS中断(最简单的方案)

如果你不是直接操作显存,其实可以用DOS自带的字符打印中断——int 0x21的功能号0x02,这个功能不仅会打印dl寄存器中的字符,还会自动把光标往后移动一位,完全不用你手动处理!

代码示例超简单:

; 打印单个字符,自动移动光标
mov ah, 0x02   ; DOS中断0x21的功能2:打印单个字符
mov dl, 'X'    ; 把你要打印的字符放到dl里
int 0x21       ; 调用后,字符会显示在当前光标位置,然后光标自动后移

要是你用的是其他打印方式(比如某些自定义的显存操作),可以补充细节,我再帮你调整方案~

内容的提问来源于stack exchange,提问作者Fro-Yo

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 07:45:46