1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
|
assume cs:code,ds:data
data segment
db 'welcome to masm!' ; 声明需要显示的文字内容
db 2,36,113 ; 声明3种颜色,如果需要打印更多颜色可以直接添加,并修改下面cx,3与这里的颜色数量相同
data ends
stack segment
db 16 dup (0) ; 声明16个字节的栈空间
stack ends
code segment
start:
mov ax,0B800H ; 0B800H~0BFFFHF共32K空间为80x25彩色字符显示缓冲区
mov es,ax
mov ax,data
mov ds,ax
; 遍历3种颜色,输出三行文字
mov di,0
mov cx,3
mov bp,0
s:
mov ah,ds:16[di]
push cx
; 为了把字符打印到屏幕中央, 把前32字单元填充上空值,不显示内容
mov si,0
mov cx,32
s0:
mov word ptr es:[si][bp],0000H
add si,2
loop s0
; 从屏幕中间开始打印文字, 共16个字符
mov bx,0
mov cx,16
s1:
mov byte ptr al,ds:[bx] ; 从ds段中取出需要的字符
mov byte ptr es:[si][bp],al ; 向缓冲区输入字符
mov byte ptr es:[si][bp][1],ah ; 向缓冲区输入颜色
add si,2
inc bx
loop s1
; 屏幕后32字单元填充上00数据,清空后面的屏幕内容
mov cx,32
s2:
mov word ptr es:[si][bp],0000H
add si,2
loop s2
pop cx ; 恢复最外层的,颜色遍历计数
inc di ; 颜色偏移位置加一个字节
add bp,160 ; 屏幕行数加1 = 缓冲偏移地址+160个字节
loop s
; 保持程序不退出, 以方便查看输出的内容
sss:
mov cx,5
loop sss
mov ax,4c00h
int 21h
code ends
end start
|