在DOS环境下,可通过直接操作显存地址或调用BIOS中断INT 10H来修改控制台文本颜色,前者需向显存特定地址写入颜色属性字节,后者则使用AH=09H等功能设置字符颜色。
核心原理
显存地址 B800h
(彩色文本模式)存储屏幕内容,每个字符由 ASCII码 + 属性字节 组成,属性字节结构如下:
位 7 6 5 4 3 2 1 0
[B] [背景色] [前景色]
- 前景色(低4位):字符颜色(0-15)
- 背景色(中3位):背景颜色(0-7)
- 闪烁位(最高位):1=闪烁,0=不闪烁(通常设为0)
颜色代码表
值 | 颜色 | 值 | 颜色 |
---|---|---|---|
0 | 黑色 | 8 | 深灰 |
1 | 蓝色 | 9 | 亮蓝 |
2 | 绿色 | 10 | 亮绿 |
3 | 青色 | 11 | 亮青 |
4 | 红色 | 12 | 亮红 |
5 | 品红 | 13 | 亮品红 |
6 | 棕色 | 14 | 黄色 |
7 | 浅灰 | 15 | 白色 |
方法1:直接写显存(高效)
org 100h ; .COM程序起始 start: mov ax, 0B800h ; 显存段地址 mov es, ax ; ES = B800h xor di, di ; DI=0(屏幕左上角) ; 设置属性:蓝色背景(1) + 黄色前景(14) + 不闪烁(0) mov ah, 00011110b ; 二进制属性:背景001(蓝) + 前景1110(黄) mov cx, 80*25 ; 80列×25行=2000字符 loop_fill: mov al, ' ' ; 用空格填充 stosw ; 写入[ES:DI]:AL=字符, AH=属性 loop loop_fill ; 循环填充整个屏幕 ; 退出程序 mov ax, 4C00h int 21h
方法2:BIOS中断(兼容性好)
org 100h start: ; 清屏并设置颜色 (INT 10h/AH=06h) mov ax, 0600h ; AH=06h(滚动), AL=0(全屏) mov bh, 1Eh ; 属性:蓝背景(001b) + 黄前景(1110b) mov cx, 0000h ; 左上角(0,0) mov dx, 184Fh ; 右下角(24,79) int 10h ; 设置光标位置 (INT 10h/AH=02h) mov ah, 02h mov bh, 0 ; 第0页 mov dx, 0 ; 行=0, 列=0 int 10h ; 退出程序 mov ax, 4C00h int 21h
自定义颜色组合公式
属性字节 = (背景色 × 16) + 前景色
示例:
- 红背景(4) + 白字(15) →
4*16 + 15 = 79 (4Fh)
- 绿背景(2) + 蓝字(1) →
2*16 + 1 = 33 (21h)
注意事项
- 环境要求:需在实模式环境运行(如DOSBox或旧版Windows CMD)。
- 现代系统:Windows/Linux终端需调用系统API(非本文范围)。
- 闪烁控制:属性字节最高位=1时启用闪烁(如
10011110b
=9Eh)。
效果验证
- 用NASM编译:
nasm prog.asm -o prog.com
- DOSBox中运行:
prog.com
- 屏幕将变为蓝底黄字(方法1/2)或自定义颜色。
通过修改属性字节值,可自由组合256种颜色方案(16背景×16前景),满足个性化需求。
引用说明:本文技术细节参考自《PC Assembly Language》(Paul Carter)、IBM BIOS中断手册及实模式内存映射规范。
原创文章,发布者:酷番叔,转转请注明出处:https://cloud.kd.cn/ask/7695.html