1. 预备知识
80×25 彩色字符模式显示缓冲区的结构:
-
内存地址空间中,B8000H~BFFFFH 共 32 KB 的空间,为 80×25 彩色字符模式的显示缓冲区。向这个地址空间写入数据,写入的内容将立即出现在显示器上。
-
一个字符在该显示缓冲区内共占两个字节,一个字节表示字符,另一个字节表示字符属性(包括前景色、背景色、高亮等)。
-
在 80×25 彩色字符模式下,显示器可以显示 25 行,每行 80 个字符、占用 160 个字节。一屏的内容在显示缓冲区占 160×25=4000 个字节,地址为 B8000H~B8F9FH。
-
字符属性共 256 种,通过 8 位编码控制:
[7] [6 5 4] [3] [2 1 0]
闪烁 背景(RGB) 高亮 前景(RGB)
如,01000010b 表示红底绿字、11000010b 表示红底闪烁绿色、00000111b 表示黑底白字。
2. 实验任务
在屏幕中间分别显示绿色、绿地红色、白底蓝色的字符串 welcome to masm!。
2.1 实验分析
首先,实验要求在屏幕中间显示三个字符串,即共写入 16*2*3=96 个字符。一屏共 4000 个字节,所以居中显示该 96 个字节的地址范围为 1950~2047。
根据预备知识,三种字符属性的表示分别为 0000 0010b、0010 0100b 和 0111 0001b,对应的十六进制分别为 02H、24H 和 71H。
由于每个字符需要的存储空间为 32 个字节,所以两两字符串间的偏移为 32。借助循环完成,循环次数为字符串长度,同时写入三个字符串。整体代码为:
assume cs:codesg
data segment
db 'welcome to masm!'
data ends
codesg segment
start:
mov ax,data
mov ds,ax ;段寄存器DS指向数据段
mov ax,0B800h
mov es,ax ;段寄存器ES指向彩色模式区域
mov bx,0 ;控制字符的读取
mov si,1952 ;控制字符的写入,起始偏移地址为1952
mov cx,16 ;循环次数
s:
mov al,ds:[bx] ;将待处理字符放到寄存器AL中
mov es:[si],al ;写入第1个子符串的字符
mov ah,02h
mov es:[si+1],ah ;写入字符属性,绿色
mov es:[si+32],al ;写入第2个子符串的字符,相对于第1个字符串偏移32
mov ah,24h
mov es:[si+32+1],ah ;写入字符属性,绿底红色
mov es:[si+64],al ;写入第3个子符串的字符,相对于第1个字符串偏移64
mov ah,71h
mov es:[si+64+1],ah ;写入字符属性,白底蓝色
add bx,1 ;每次偏移1个字节处理1个字符
add si,2 ;每次偏移2个字节写入1个字符
loop s
mov ax,4c00h
int 21h
codesg ends
end start
2.2 实验结果
3. 总结
-
本文介绍了 8086CPU 下的 80×25 彩色字符模式显示缓冲区结构,对应地址为 B8000H~BFFFFH,大小为 32 KB。向该地址空间写入数据,写入的内容将立即出现在显示器上
-
参考:汇编语言/王爽著.——北京:清华大学出版社,2003