如何在 DOS 中打印彩色字符串?

Posted

技术标签:

【中文标题】如何在 DOS 中打印彩色字符串?【英文标题】:How to print colored string in DOS? 【发布时间】:2015-04-05 17:46:36 【问题描述】:

我想以不同于通常的白色文本颜色的不同颜色打印以下数据块集,这可以通过使用另一个 DOS 中断 (dx:string-address; ah,08H; int 21h) 来实现。

Jan             db  "         January$          "     
string          db  "Sun Mon Tue Wed Thu Fri Sat$"
string1         db  "                 1   2   3$"
string2         db  " 4   5   6   7   8   9  10$"
string3         db  "11  12  13  14  15  16  17$"
string4         db  "18  19  20  21  22  23  24$"
string5         db  "25  26  27  28  29  30  31$"

【问题讨论】:

你用什么语言写的?有许多不同的汇编语言。 你的汇编程序不做任何事情,它只是定义了一些字符串。你试过什么? Don't know how to print an entire Calendar at once的可能重复 如果我理解正确,您上一个问题的答案包括颜色。 标签上写着“windows”,但美元符号让我觉得你可能想要 DOS。美元符号不起作用,但这个 Bios 中断可能会做你想做的事:ctyme.com/intr/rb-0210.htm 【参考方案1】:

有几种方法可以实现您的目标IN TEXT MODE

    逐字符显示:这样您可以为每个字符选择一种颜色。 访问屏幕内存:在段 0B800:0。 用相同的颜色显示整个字符串。

下一个代码使用第三个选项(最简单)完成这项工作。它是用 EMU8086 制作的:

.stack 100h
.data

Jan   db  "         January           ",13,10 
      db  "Sun Mon Tue Wed Thu Fri Sat",13,10 
      db  "                 1   2   3 ",13,10 
      db  " 4   5   6   7   8   9  10 ",13,10 
      db  "11  12  13  14  15  16  17 ",13,10 
      db  "18  19  20  21  22  23  24 ",13,10 
      db  "25  26  27  28  29  30  31 "       
color db 181

.code          
;INITIALIZE DATA SEGMENT.
  mov  ax,@data
  mov  ds,ax 

;DISPLAY STRING WITH COLOR.
  mov  es,ax ;ES SEGMENT MUST POINT TO DATA SEGMENT.
  mov  ah,13h ;SERVICE TO DISPLAY STRING WITH COLOR.
  mov  bp,offset Jan ;STRING TO DISPLAY.
  mov  bh,0 ;PAGE (ALWAYS ZERO).
  mov  bl,color
  mov  cx,201 ;STRING LENGTH.
  mov  dl,0 ;X (SCREEN COORDINATE). 
  mov  dh,5 ;Y (SCREEN COORDINATE). 
  int  10h ;BIOS SCREEN SERVICES.  

;FINISH THE PROGRAM PROPERLY.
  mov  ax,4c00h
  int  21h

请注意,我删除了 $ 符号(因为 13h 服务需要字符串长度,而不是 $)。对于不同的颜色,只需更改数据段中“颜色”变量的值 (181)。

要为不同的字符串显示不同的颜色,请复制粘贴每个字符串的显示块。

让我们知道它是否对您有用。

选择颜色的公式如下:

文字背景 * 16 + 文字颜色

接下来是颜色:

Black         =  0
Blue          =  1
Green         =  2
Cyan          =  3
Red           =  4
Magenta       =  5
Brown         =  6
LightGray     =  7
DarkGray      =  8
LightBlue     =  9
LightGreen    = 10
LightCyan     = 11
LightRed      = 12
LightMagenta  = 13
Yellow        = 14
White         = 15

使用给定的公式,如果您想要红色背景和黄色文本,您需要颜色 78:

4 * 16 + 14 = 78

现在,让我们在 图形模式 中进行:

.stack 100h
.data

Jan   db  "         January           ",13
      db  "Sun Mon Tue Wed Thu Fri Sat",13
      db  "                 1   2   3 ",13
      db  " 4   5   6   7   8   9  10 ",13
      db  "11  12  13  14  15  16  17 ",13
      db  "18  19  20  21  22  23  24 ",13
      db  "25  26  27  28  29  30  31 ",0
color db 181
x     db 0     ;SCREEN COORDINATE (COL).
y     db 0     ;SCREEN COORDINATE (ROW).

.code          
;INITIALIZE DATA SEGMENT.
  mov  ax,@data
  mov  ds,ax 

;SWITCH SCREEN TO GRAPHICS MODE.
  mov  ah,0
  mov  al,13h  ;320x240x256.
  int  10H

  mov  di, offset jan
while:      
  call gotoxy  ;SET CURSOR POSITION FOR CURRENT CHAR.
  mov  al, [ di ]  ;CHAR TO DISPLAY.
  cmp  al, 13    ;IF CHAR == 13
  je   linebreak ;THEN JUMP TO LINEBREAK.
  cmp  al, 0   ;IF CHAR == 0
  je   finish  ;THEN JUMP TO FINISH.
  call char_display  ;DISPLAY CHAR IN AL WITH "COLOR".
  inc  x  ;NEXT CHARACTER GOES TO THE RIGHT.
  jmp  next_char
linebreak:  
  inc  y  ;MOVE TO NEXT LINE.    
  mov  x, 0  ;X GOES TO THE LEFT.
next_char:
  inc  di  ;NEXT CHAR IN "JAN".
  jmp  while

finish:

;WAIT FOR ANY KEY.
  mov  ah,7
  int  21h

;FINISH THE PROGRAM PROPERLY.
  mov  ax,4c00h
  int  21h        

;-------------------------------------------------     
;DISPLAY ONE CHARACTER IN "AL" WITH "COLOR".

proc char_display
  mov  ah, 9
  mov  bh, 0
  mov  bl, color  ;ANY COLOR.
  mov  cx, 1  ;HOW MANY TIMES TO DISPLAY CHAR.
  int  10h
  ret
endp    

;-------------------------------------------------     
proc gotoxy
  mov dl, x
  mov dh, y
  mov ah, 2 ;SERVICE TO SET CURSOR POSITION.
  mov bh, 0 ;PAGE.
  int 10h   ;BIOS SCREEN SERVICES.  
  ret
endp

我的图形算法要求使用 char(13) 进行换行符(不是 13,10),字符串以 0 结尾。

【讨论】:

如果我必须在视频模式下编写这些字符串怎么办? 视频模式?你的意思是图形非文本模式? 我的意思是写入显存 哦,你是说图形模式。正在努力。 . .【参考方案2】:

所有前景色和背景色组合的代码:

Include Irvine32.inc

.data

str1 byte "F",0dh,0ah,0          ;character initialized (0dh,0ah for next line)

foreground Dword ?               ;variable declaration
background Dword ?
counter Dword ?

.code

main PROC

mov ecx,16                     ; initializing ecx with 16

l1:                             ;outer loop
mov counter,ecx
mov foreground,ecx
dec foreground
mov ecx,16



l2:                            ;inner loop

mov background , ecx
dec background

mov eax,background      ; Set EAX = background
shl eax,4               ; Shift left, equivalent to multiplying EAX by 16
add eax,foreground      ; Add foreground to EAX

call settextcolor       ;set foreground and background color


mov edx, offset str1    ; string is moved to edx for writing
call writestring


loop l2                  ;calling loop

mov ecx,counter

loop l1
    exit
main ENDP
END main

【讨论】:

【参考方案3】:
Include Irvine32.inc

.data

str1 BYTE "different color string",0dh,0ah,0        ;string initializing

counter dword ?                                     ;save loop value in counter

.code

main PROC

mov ecx,4                                          ;loop repeated 4 times

l1:
    mov counter,ecx                                ;counter save loop no

    mov eax,counter                          ;eax contain loop no 
                                                ;which is equal to counter
                                                                           ; color no

    call    SetTextColor                           ;Call color library

    mov edx,offset  str1                       ;string reference is moved to edx

    call    WriteString                            ;string is write from reference

loop l1                                            ; calling loop l1

    exit
main ENDP
END main

【讨论】:

以上是关于如何在 DOS 中打印彩色字符串?的主要内容,如果未能解决你的问题,请参考以下文章

使用 python 将彩色字符串打印到控制台

汇编语言实现在80*25彩色字符模式下显示字符串

如何将彩色文本输出到 Linux 终端?

如何打印单个 ASCII 字符?

使用 ANSI / VT100 代码在 PowerShell 控制台中输出彩色文本

为啥 termcolor 在 Windows 控制台中输出控制字符而不是彩色文本?