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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 08:43:31