汇编语言实验 5:显示缓冲区

563 阅读3分钟

1. 预备知识

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

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

  2. 一个字符在该显示缓冲区内共占两个字节,一个字节表示字符,另一个字节表示字符属性(包括前景色、背景色、高亮等)。

  3. 在 80×25 彩色字符模式下,显示器可以显示 25 行,每行 80 个字符、占用 160 个字节。一屏的内容在显示缓冲区占 160×25=4000 个字节,地址为 B8000H~B8F9FH。

  4. 字符属性共 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. 总结

  1. 本文介绍了 8086CPU 下的 80×25 彩色字符模式显示缓冲区结构,对应地址为 B8000H~BFFFFH,大小为 32 KB。向该地址空间写入数据,写入的内容将立即出现在显示器上

  2. 参考:汇编语言/王爽著.——北京:清华大学出版社,2003