TASM调用int 10h切换13h图形模式时左上角残留命令行提示符问题
问题原因
mov ax, 13h 搭配 int 10h 的VGA模式切换代码本身没有错误,出现提示符残留、仍可输入DOS命令的核心原因是程序结构不完整:
- 仅执行模式切换指令后,代码没有阻断执行流的逻辑,CPU运行完这两行指令后会继续向下执行内存中的后续指令,很快触发程序退出流程,将控制权交还给DOS的
command.com命令解释器。 - 切换到图形模式后没有主动清空对应显存,之前文本模式下显存中存储的命令提示符点阵数据会直接被VGA硬件渲染显示;
command.com拿到控制权后,会默认在当前活动显示页输出提示符、接收键盘输入——本质上此时你的汇编程序已经运行结束,系统已经回到DOS命令行交互状态,只是显示模式还停留在13h图形模式,才会出现异常残留现象。
修复方法
- 补全DOS汇编程序的标准结构,在模式切换代码后增加执行流阻断逻辑(比如等待用户按键、进入业务逻辑死循环),避免程序立刻退出把控制权交还给命令行。
- 切换到13h图形模式后,主动清空该模式对应的显存段(起始段地址为
0A000h,总长度为320*200=64000字节),消除之前文本模式的显存残留内容。 - 程序需要退出时,先调用BIOS中断切回默认的80*25文本模式(模式号3),再调用DOS中断的退出功能正常返回命令行。
可直接在TASM下编译运行的最小修复示例代码如下:
; 按COM程序格式编译,TASM编译链接命令:tasm test.asm; tlink /t test.obj; code segment assume cs:code, ds:code org 100h entry: ; 切换至13h 320*200 256色图形模式 mov ax, 13h int 10h ; 清空图形模式显存,全填0实现黑屏 mov ax, 0A000h mov es, ax xor di, di xor al, al mov cx, 320*200 rep stosb ; 等待用户按任意键,阻断执行流提前返回DOS mov ah, 0 int 16h ; 切回默认80*25文本模式 mov ax, 3 int 10h ; 调用DOS功能退出程序,返回命令行 mov ah, 4ch int 21h code ends end entry
内容的提问来源于stack exchange,提问作者ThErOmAnEmPiRe
相关产品推荐
相关产品推荐

