Assembly Language example 9

编程:在屏幕中间分别显示绿色,绿底红色,白底蓝色的字符串‘welcome to masm!’。 分析: 1.数据段定义字符串,用到DS和BX。 2.将字符串拷贝到显存的地址范围,选择ES和SI。 3.计算屏幕中间的位置,显存为B8000H~BFFFFH共32KB的空间,为80×25彩色字符模式的显示缓冲区,所以中间位置是80×13。输出三行,所以第一行开始位置80×12,总共要跳过80×11+((80-16)/2)=912个字符,一个显示字符在显示缓冲区占两个位置,那么要跳过1824个字节,即720H,开始位置为B8720H,ES为B8720。 代码:

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
assume cs:codesg,ds:datasg

data segment
db 'welcom to masm!'
data ends

code segment
start:
;move data address to ds register
mov ax, data
mov ds, ax

;display area is 0xb8000h - 0xbffffh, move data to this area
mov ax, 0b872h ;with hex, must a 0 before b800h
mov es, ax
mov si, 0
mov bx, 0
mov cx, 16
s:
mov al, ds:[bx]
mov es:[si], al
mov es:[si + 160], al ; newline
mov es:[si + 320], al ; newline
mov al, 02h;green property:00000010 = 2
mov es:[si + 1], al
mov al, 24h;backgroud green, word red, 00100100 = 36 = 24h
mov es:[si + 161], al
mov al, 71h;background white, word green, 01110001 = 71h
mov es:[si + 321], al
add bx, 1
add si, 2
loop s

mov ax,4c00h
int 21h
codesg ends
end start

运行结果: