如何在DOS汇编程序中为不同消息字符串常量设置不同颜色?
为DOS汇编程序的不同消息行设置不同颜色
要实现不同行消息用不同颜色(背景+前景),需要利用BIOS中断int 10h来控制文本属性,因为DOS的int 21h 09h输出功能仅使用当前视频内存的默认属性,无法直接指定颜色。以下是修改后的代码,每个消息行都可以设置独立的颜色属性:
.model small .stack 100h .data ; 定义带回车换行的消息,以$结尾 name_msg db "Name:", 13, 10, "$" age_msg db "Age:", 13, 10, "$" birthdate_msg db "Birthdate:", 13, 10, "$" course_msg db "Course:", 13, 10, "$" ; 定义颜色属性:高4位=背景色,低4位=前景色,位7为闪烁位(0=不闪烁) ; 颜色值:0=黑,1=蓝,2=绿,3=青,4=红,5=洋红,6=棕,7=浅灰,8=深灰,9=亮蓝,10=亮绿,11=亮青,12=亮红,13=亮洋红,14=黄,15=白 NAME_ATTR equ 00101111b ; 绿色背景,白色前景 AGE_ATTR equ 01001111b ; 红色背景,白色前景 BIRTH_ATTR equ 00011111b ; 蓝色背景,白色前景 COURSE_ATTR equ 01101111b ; 黄色背景,白色前景 .code main proc mov ax, @data mov ds, ax ; 设置80x25彩色文本显示模式(确保支持彩色) mov ah, 00h mov al, 03h int 10h ; 输出Name消息,绿色背景 mov bl, NAME_ATTR lea dx, name_msg call print_str_with_attr ; 输出Age消息,红色背景 mov bl, AGE_ATTR lea dx, age_msg call print_str_with_attr ; 输出Birthdate消息,蓝色背景 mov bl, BIRTH_ATTR lea dx, birthdate_msg call print_str_with_attr ; 输出Course消息,黄色背景 mov bl, COURSE_ATTR lea dx, course_msg call print_str_with_attr ; 退出程序 mov ah, 4Ch int 21h main endp ; 子程序:输出带指定属性的字符串 ; 输入:DS:DX = 字符串地址(以$结尾),BL = 文本属性字节 print_str_with_attr proc push ax push bx push cx push dx push si mov si, dx ; SI指向字符串起始地址 print_loop: mov al, [si] cmp al, '$' ; 检查是否到字符串结束符 je print_exit ; 处理回车符(ASCII 13) cmp al, 13 je handle_carriage_return ; 处理换行符(ASCII 10) cmp al, 10 je handle_line_feed ; 输出普通字符,带指定属性 mov ah, 09h ; int10h功能09h:在光标位置写字符(带属性) mov cx, 1 ; 输出次数 int 10h call move_cursor_right ; 光标右移一位 jmp next_char handle_carriage_return: ; 将光标移到当前行的开头 mov ah, 03h ; int10h功能03h:获取光标位置 int 10h mov dl, 0 ; 列号设为0 mov ah, 02h ; int10h功能02h:设置光标位置 int 10h jmp next_char handle_line_feed: ; 将光标移到下一行开头 mov ah, 03h int 10h inc dh ; 行号+1 mov dl, 0 mov ah, 02h int 10h jmp next_char next_char: inc si ; 指向字符串下一个字符 jmp print_loop print_exit: ; 恢复寄存器 pop si pop dx pop cx pop bx pop ax ret print_str_with_attr endp ; 子程序:将光标向右移动一位(自动换行) move_cursor_right proc push ax push dx mov ah, 03h int 10h inc dl cmp dl, 80 ; 超过屏幕宽度(80列)则换行 jl set_cursor_pos mov dl, 0 inc dh set_cursor_pos: mov ah, 02h int 10h pop dx pop ax ret move_cursor_right endp end main
关键说明:
颜色属性字节:
- 字节结构:
位7 位6 位5 位4 | 位3 位2 位1 位0 - 高4位控制背景色,低4位控制前景色,位7用于控制字符是否闪烁(0=不闪烁,1=闪烁)
- 颜色值范围是0-15,对应不同的基础色和亮色(如0=黑色,2=绿色,4=红色,15=白色)
- 字节结构:
核心实现:
- 使用
int 10h 09h中断直接输出带属性的字符,替代DOS的int 21h 09h,这样可以精确控制每个字符的颜色 - 编写了
print_str_with_attr子程序,自动处理字符串中的回车、换行符,并管理光标位置 - 先设置
al=03h的彩色文本模式,确保程序在彩色环境下运行
- 使用
修改颜色:
- 只需修改
NAME_ATTR、AGE_ATTR等常量的二进制值,即可调整对应消息的背景和前景色 - 例如,要设置闪烁的红色背景+黄色前景,可写为
11001110b(位7=1闪烁,高4位=1100对应亮红背景,低4位=1110对应黄色前景)
- 只需修改
内容的提问来源于stack exchange,提问作者Dirk
相关产品推荐
相关产品推荐

