实验9 根据材料编程

实验任务

在屏幕中间分别显示绿色、绿底红色、白底蓝色的字符串“Welcome to masm!”。

  1. B8000H-BFFFFH共32KB空间为80x25彩色字符模式的显示缓冲区,向这个地址空间写入数据,写入的数据会立刻显示在显示器上。

  2. 显示器一次可以显示25行,每行80个字符,每个字符可设置256种属性。

  3. 一个字符在显示缓冲区中占2个字节,分别存放属性字段和ASCII码。

    image-20240301020128459

  4. 显示缓冲区分为8页,每页4KB(≈4000B)

分析思路

根据属性字段的含义可以确定绿色,绿底红色、白底蓝色分别对应0000 0010B、0010 0100B和0111 0001B。

完整程序

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
;实验9 根据材料编程
assume cs:code
data segment
db 'Welcome to masm!'
db 00000010B,00100100B,01110001B
data ends

stack segment
db 16 dup(0)
stack ends

code segment
start:
mov ax,data
mov ds,ax
mov ax,0B800H
mov es,ax
mov ax,stack
mov ss,ax
; si指向属性字段
mov si,10H
; bx指向当前要写入的字符
mov bx,0
; di指向显卡要写入的行
mov di,07c0h ; 160*12+160/5*2
; bp指向列
mov bp,0
mov cx,3
fi:
push cx
mov cx,10H
fii:
mov dh,byte ptr ds:[si]
mov dl,byte ptr ds:[bx]
mov word ptr es:[di+bp],dx
add bp,2
add bx,1
loop fii
pop cx
add si,1
sub bx,bx
add di,0A0H
sub bp,bp
loop fi
mov ax,4c00H
int 21H
code ends
end start

运行结果

image-20240301022644996