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

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

关键说明:

  1. 颜色属性字节:

    • 字节结构:位7 位6 位5 位4 | 位3 位2 位1 位0
    • 高4位控制背景色,低4位控制前景色,位7用于控制字符是否闪烁(0=不闪烁,1=闪烁)
    • 颜色值范围是0-15,对应不同的基础色和亮色(如0=黑色,2=绿色,4=红色,15=白色)
  2. 核心实现:

    • 使用int 10h 09h中断直接输出带属性的字符,替代DOS的int 21h 09h,这样可以精确控制每个字符的颜色
    • 编写了print_str_with_attr子程序,自动处理字符串中的回车、换行符,并管理光标位置
    • 先设置al=03h的彩色文本模式,确保程序在彩色环境下运行
  3. 修改颜色:

    • 只需修改NAME_ATTR、AGE_ATTR等常量的二进制值,即可调整对应消息的背景和前景色
    • 例如,要设置闪烁的红色背景+黄色前景,可写为11001110b(位7=1闪烁,高4位=1100对应亮红背景,低4位=1110对应黄色前景)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 23:50:02