蒙珣的博客

活好当下,做好今天该做的事情。

0%

实验9 根据材料编程

实验9 根据材料编程

编程:在屏幕中间分别显示绿色、绿底红色、白底蓝色的字符串 ‘welcome to masm!’。

编程所需的知识通过阅读、分析下面的材料获得。

80*25彩色字符模式显示缓冲区的结构:

内存地址空间中,B8000H~BFFFFH共32KB的空间,为80*25彩色字符模式的显示缓冲区。向这个地址空间写入数据,写入的内容将立即出现在显示器上。

在80*25彩色字符模式下,显示器可以显示25行,每行80个字符,每个字符可以有256中属性(背景色、前景色、闪烁、高亮等组合信息).

这样,一个字符在显示缓冲区中就要占两个字节,分别存放字符的ASCLL码和属性。80*25模式下,一屏的内容在显示缓冲区共占4000个字节。

显示缓冲区分为8页,每页4KB,显示器可以显示任意一页的内容。一般情况下,显示第0页的内容。也就是说通常情况下,B8000H~B8F9FH中的4000个字节的内容将出现在显示器上。

在一页显示缓冲区中:

偏移000~09F对应显示器上的第1行(80个字符占160个字节);

偏移0A0~13F对应显示器上的第2行;

偏移140~1DF对应显示器上的第3行;

以此类推,可知偏移F00~F9F对应显示器上的第25行。

在一行中,一个字符占两个字节的存储空间(一个字),低位字节存储字符的ASCLL码,高位字节存储字符的属性。一行共有80个字符,占160个字节。

即在一行中:

00~01单元对应显示器上的第1列;

02~03单元对应显示器上的第2列;

04~05单元对应显示器上的第3列;

依此类推,可知,9E~9F单元对应显示器上的第80列。

例如:在显示器的0行0列显示黑底绿色的字符串’ABCDEF’

(‘A’的ASCLL码值为41H,02H表示黑底绿色)

显示缓冲区里的内容为:

img

可以看出,在显示缓冲区中,偶地址存放字符,奇地址存放字符的颜色属性。

一个在屏幕上显示的字符,具有前景(字符色)和背景(底色)两种颜色,字符还可以以高亮度和闪烁的方式显示。前景色、背景色、闪烁、高亮等信息被记录在属性字节中。

属性字节的格式:

img

可以按位设置属性字节,从而配出各种不同的前景色和背景色。

比如:

红底绿字,属性字节为:01000010B;

红底闪烁绿字,属性字节为:11000010B;

红底高亮绿字,属性字节为:01001010B;

黑底白字,属性字节为:00000111B;

白底蓝字,属性字节为:01110001B。

例如:在显示器的0行0列显示红底高亮闪烁绿色的字符串’ABCDEF’

(红底高亮闪烁绿色,属性字节为:11001010B, CAH)

显示缓冲区里的内容为:

img

注意:闪烁的效果必须在全屏DOS方式下才能看到。

一行可以放80个字符,也就是160个字节(一个字符两个字节,一个存放ASCII码,一个存放属性)。一页可以显示25行,一页也就有160*25=4000个字节

那么第一行的最后一个字节为158[9EH](第一个字节从零开始)

则第二行最后一个字符的地址为158+160[13EH]

首先我们先处理一行数据,将 ‘welcome to masm!’ 显示为绿色

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
assume cs:code,ds:data,ss:stack

data segment
;0123456789ABCDEF
db 'welcome to masm!' ;ds:[si]

db 00000010B ;0000 0000 绿色
db 00100100B ; rgb rgb 绿底红色
db 01110001B ; 白底蓝色

data ends

stack segment stack
db 128 dup (0)
stack ends

code segment

;编程:在屏幕中间分别显示 绿色、绿底红色、白底蓝色的字符串 'welcome to masm!'
;数据的组织
;数据的处理 一个字符在屏幕上占用2个字节,低地址放字符的ASCII码,高地址放字符的属性

start: mov ax,stack
mov ss,ax
mov sp,128

mov bx,data
mov ds,bx

mov bx,0B800H ;彩色字符显示缓冲区
mov es,bx

mov si,0
mov di,160*10 + 30*2 ;偶数地址
mov bx,16
mov dx,0

mov cx,16
mov dh,ds:[bx] ;高地址控制字符属性 mov es:[di],dx es:[di+0],dl es:[di+1],dh

showRow:mov dl,ds:[si] ;低地址显示字符
mov es:[di],dx
inc si
add di,2
loop showRow

mov ax,4C00H
int 21H

code ends

end start

设置外循环,显示其他两行

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
assume cs:code,ds:data,ss:stack

data segment
;0123456789ABCDEF
db 'welcome to masm!' ;ds:[si]

db 00000010B ;0000 0000 绿色
db 00100100B ; rgb rgb 绿底红色
db 01110001B ; 白底蓝色

data ends

stack segment stack
db 128 dup (0)
stack ends

code segment

;编程:在屏幕中间分别显示 绿色、绿底红色、白底蓝色的字符串 'welcome to masm!'
;数据的组织
;数据的处理 一个字符在屏幕上占用2个字节,低地址放字符的ASCII码,高地址放字符的属性

start: mov ax,stack
mov ss,ax
mov sp,128

mov bx,data
mov ds,bx

mov bx,0B800H ;彩色字符显示缓冲区
mov es,bx

mov si,0
mov di,160*10 + 30*2 ;偶数地址
mov bx,16
mov dx,0

mov cx,3

Masm: push bx
push cx
push si
push di

mov cx,16
mov dh,ds:[bx] ;高地址控制字符属性 mov es:[di],dx es:[di+0],dl es:[di+1],dh

Row: mov dl,ds:[si] ;低地址显示字符
mov es:[di],dx
inc si
add di,2
loop Row

pop di
pop si
pop cx
pop bx

add di,160 ;换行
inc bx
loop Masm

mov ax,4C00H
int 21H

code ends

end start