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
相关产品推荐
相关产品推荐

