如何在DOS/BIOS/VGA汇编中保持背景始终为蓝色?
解决VGA汇编程序重复执行后背景色异常问题
核心原因
重复运行时没彻底初始化VGA显示环境,导致显存残留、调色板寄存器状态没重置,或者BIOS默认设置干扰了当前程序的显示配置。
具体修复方案
1. 强制锁定目标VGA模式
程序开头必须显式设置你要用的VGA模式,覆盖之前的残留状态:
mov ax, 0x13 ; 切换到VGA 320x200 256色图形模式 int 0x10 ; 调用BIOS显示中断生效
如果是文本模式(比如0x03),替换对应模式号即可。
2. 硬编码设置蓝色背景
图形模式(0x13):
VGA 256色模式的背景色由调色板索引0控制,直接写入寄存器强制设为纯蓝:
; 设置调色板索引0(背景色)为纯蓝 mov dx, 0x3C8 ; 调色板索引选择端口 mov al, 0x00 ; 选中索引0 out dx, al inc dx ; 切换到调色板数据端口0x3C9 mov al, 0x00 ; 蓝色分量拉满 out dx, al mov al, 0x00 ; 绿色分量为0 out dx, al mov al, 0x3F ; 红色分量为0(纯蓝) out dx, al
文本模式(0x03):
通过清屏指令直接设置全屏幕属性,高4位是背景色,低4位是前景色:
mov ax, 0x0600 ; 清屏+设置属性 mov bh, 0x10 ; 背景蓝、前景黑(属性字节格式:BBBBFFFF) mov cx, 0x0000 ; 屏幕左上角坐标 mov dx, 0x184F ; 屏幕右下角坐标(25行80列) int 0x10
3. 清空显存残留
启动时彻底清空显存,避免上次运行的图形/字符残留:
- 图形模式:
mov ax, 0xA000 ; VGA图形显存段地址 mov es, ax xor di, di mov cx, 0xFA00 ; 320*200=64000字节,刚好填满显存 mov al, 0x00 ; 用背景色(索引0)填充 rep stosb
- 文本模式:用上面的
int 0x10清屏指令即可。
4. 可选:不要自动恢复BIOS模式
有些DOS环境会在程序退出时自动恢复默认显示模式,如果不需要退出后恢复,删掉程序末尾的mov ax, 0x03; int 0x10指令就行。
你之前错误的排查
你提到的前景蓝、背景黑+大量心形问题,大概率是这两个原因:
- 文本模式下属性字节搞反了(把背景色设成了低4位,前景设成了高4位)
- 显存填充时误用了ASCII 0x03(对应心形字符)作为填充值
完整示例片段(图形模式)
org 0x100 start: ; 切换到VGA图形模式 mov ax, 0x13 int 0x10 ; 设置背景为纯蓝 mov dx, 0x3C8 mov al, 0 out dx, al inc dx mov al, 0 ; B分量 out dx, al mov al, 0 ; G分量 out dx, al mov al, 63 ; R分量(纯蓝) out dx, al ; 清空显存 mov ax, 0xA000 mov es, ax xor di, di mov cx, 64000 mov al, 0 rep stosb ; 这里放你的图形绘制代码... ; 等待按键后退出 mov ah, 0x00 int 0x16 ; 可选:恢复文本模式,不需要就删掉 mov ax, 0x03 int 0x10 ret
内容的提问来源于stack exchange,提问作者Chocol8
相关产品推荐
相关产品推荐

