1. 预备知识
80×25 彩色字符模式显示缓冲区的结构为:
- 内存地址空间中,B8000H~BFFFFH 共 32 KB 的空间为 80×25 彩色字符模式的显示缓存区。向这个地址空间写入数据,写入的内容将立即出现在显示器上。
- 在 80×25 彩色字符模式下,显示器可以显示 25 行,每行 80 个字符,每个字符可以有 256 种属性(背景色、前景色、闪烁、高亮等组合信息)。
- 这样,一个字符在该显示缓冲区内占两个字节,一个字节表示字符的 ASCII 码、另一个表示字符的属性。
- 80×25 模式下,显示缓冲区一共 8 页,一屏的内容在显示缓冲区总共占 4000 个字节,即表示一页,第 0 页的地址为 B8000H~B8F9FH。
- 在显示器中每行 80 字符共占 160 字节,一个字符占两个字节的存储空间,低位字节存储字符的 ASCII 码、高位字节存储字节的属性值。如在显示器的 0 行 0 列显示黑底绿色的字符串 ABCDEF,字符 A 的 ASCII 码值为 41,02 表示黑底绿色字体:
B800:0000 41 02 42 02 43 02 44 02 45 02 46 02 ...
- 在屏幕上显示的字符,具有前景和背景两种颜色,字符还可以有高亮度和闪烁的显示方式,这些都是表示字符的属性。各属性的表示方法如下:
[7] [6 5 4] [3] [2 1 0]
闪烁 背景(RGB) 高亮 前景(RGB)
我们可以按位设置表示字符属性的字节,如:
红底绿字:0100 0010
红底闪烁绿字:1100 0010
红底高亮绿字:0100 1010
黑底白字:0000 0111
白底蓝字:0111 0001
2. 实验任务
编程:在屏幕中间分别显示绿色、绿底红色、白底蓝色的字符串 ‘welcome to masm!’。
- 绿色字体对应的属性编码为 0000 0010,绿底红色对应的属性编码为 0010 0100,白底蓝色对应的属性编码为:0111 0001,十六进制分别为 02H,24H,71H。
- 题目要求在屏幕中间显示字符串,80×25 彩色模式下,显示器可以显示 25 行数据,每行 80 个字符。一屏幕为 4000 字节。一共写入字节数为 16*2*3=96,所以字节写入范围为 1952~2047,即字符起始偏移地址为 1952(偏移地址本应为 1953,但规定偶数地址存放字符、奇数地址存放字符属性)。
- 由于每个字符串需要用 16*2=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 ;控制字符的写入,起始偏移地址为1946
mov cx,16 ;循环次数
s:
mov al,ds:[bx] ;将当前处理字符放到寄存器AL中
mov es:[si],al ;当前字符的第一个位置
mov ah,02h ;第一种属性,绿色字体
mov es:[si+1],ah ;当前字符的第一个属性
mov es:[si+32],al ;当前字符的第二个位置,相对于第一个字符串偏移32
mov ah,24h ;第二种属性,绿底红色
mov es:[si+32+1],ah ;当前字符的第二种属性
mov es:[si+64],al ;当前字符的第三个位置,相对于第一个字符串偏移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
3. 总结
在 80×25 彩色模式下,每个字符使用两个字节表示,偶数地址字节存放字符的 ASCII 码值、奇数地址字节存放字符的属性。