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

x86 16位模式下修改调色板后更改文本背景与颜色

回答:当然可以调整文本颜色与背景!

在VGA 13h(320x200 256色)模式下,你完全能通过修改调色板+配置DOS文本输出参数来实现需求——毕竟你已经处理过BMP调色板,这一步其实是顺理成章的。下面给你拆解具体操作:

1. 先明确颜色映射逻辑

DOS的int 21h / ah=09h(打印字符串)和int 21h / ah=02h(打印单个字符)在图形模式下,是通过调色板索引来指定颜色的:

  • 前景色:由BL寄存器的值直接对应调色板中的索引(比如BL=5就用调色板第5项的颜色)
  • 背景色:这是全局设置,需要通过视频BIOS的int 10h函数来指定,而不是int 21h的参数

2. 修改文本前景色

针对int 21h / ah=02h(打印数字)

调用函数前,把BL设为你想要的调色板索引即可。比如你想让数字用调色板第6项的绿色:

mov ah, 02h
mov dl, '7'       ; 要打印的数字字符
mov bh, 0         ; 视频页号,一般用0
mov bl, 6         ; 前景色对应调色板索引6
int 21h

针对int 21h / ah=09h(打印"score: ")

同样设置BL为目标调色板索引,其他参数正常配置:

mov ah, 09h
mov dx, offset score_str  ; 指向"score: "的内存地址
mov bh, 0                 ; 视频页号
mov bl, 5                 ; 前景色对应调色板索引5
mov cx, 1                 ; 字符串重复打印次数
int 21h

score_str db 'score: ', 0  ; 定义字符串

3. 修改文本背景色

背景色是全局的,需要调用int 10h / ah=0Bh来设置,参数里的BL就是背景色对应的调色板索引:

mov ah, 0Bh
mov bh, 0         ; 子功能:设置背景色(bh=0对应背景,bh=1对应边框,这里无需关注边框)
mov bl, 2         ; 背景色对应调色板索引2
int 10h

执行完这个后,所有后续的DOS文本输出都会用这个背景色填充字符块的区域。

4. 关键注意事项

  • 确保你的调色板已经正确写入VGA硬件:你处理BMP时应该已经用int 10h / ah=10h系列函数(比如al=12h批量加载调色板)完成了这一步,否则颜色不会生效。
  • 如果需要不同文本用不同背景色:全局背景色设置做不到,这时候你得先直接操作显存绘制对应区域的背景色块,再在上面打印文本。
  • 13h模式下的文本是8x8像素块:背景色会填满整个字符块,而不是只填充文本周围的空白。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 07:04:07