题目要求来自王爽著《汇编语言》。
子程序描述:Show_str
功能:在指定的位置,用指定的颜色,显示一个用0结束的字符串。
参数:(dh)=行号(取值范围0~24),dl=列号(取值范围0~79),(cl)=颜色,ds:si指向字符串的首地址
返回:无
应用举例:在屏幕的8行3列,用绿色显示data段中的字符串
assume cs:codesg data segment db 'welcome to masm!',0 data ends codesg segment start: mov dh,8 ;行号,可以尝试改变(0~24) mov dl,50 ;列号,可以尝试改变(0~79) mov cl,2 mov ax,data mov ds,ax mov si,0 mov ch,0 call show_str mov ax,4c00h int 21h show_str: ;根据参数显示字符串 ;根据行,列号,计算行*80+列 mov al,dh mov bl,80 mul bl mov dh,0 add ax,dx mov bx,ax mov ax,0B800H ;显示缓冲区内存地址 mov es,ax mov dh,cl display: mov cl,[si] mov ch,0 jcxz ok mov es:[bx],cl ;写入字符 mov es:[bx+1],dh ;写入颜色 add bx,2 inc si jmp short display ok: ret codesg ends end start
读上面代码需要了解以下内容:
- 如何在屏幕上显示 内存空间中地址B8000H~BFFFFH共32KB,为80*25彩色字符模式的显示缓冲区。;向这个地址空间写入数据,写入的数据会立即显示在显示器上,显示缓冲区分为8页,每页4KB,显示器默认显示第一页的内容。每页25行,每行80个字符160个字节。
- 如何设置字符颜色屏幕上显示字符,具有前景(字符色)和背景色(底色)两种颜色,字符还可以高亮和闪烁显示。这些信息被记录在属性字节中。
属性字节的格式为
7 65 4 3 2 10 属性字节从左住右共8位,7代表最左位,0代表最右位
含义 BL R G BI R G B
R:红色,G: 绿色,B::蓝色,I:高亮,BL:闪烁
按位设置属性字节,可以配出各种不同的前景色和背景色
如:红底黑字 01000010B 即42h
红底闪烁绿字 11000010B 即C2h
本文中 要求显示字符串的颜色是绿色,0000010B,即02h,换成十进制是2。
颜色属性字节在显示缓冲区中的存储位置是放在字符所在字节的后面:
例如,在显示器的0行0列显示黑底绿色的字符串'ABCDEF'
显示器缓冲区内容如下:(A的ASII码值为41H,02H表示黑底绿色)
B800:0000 4102 42 02 43 0244 02 45 02 4602 00 00 00 0000
B800:00A0 0000 00 00 00 0000 00 00 00 0000 00 00 00 0000
可以看出,偶地址存放字符,奇地址存放字符的颜色属性
.
最后提醒:如果是在虚拟8086模式下采用debug命令进行调试会发现写入显示缓冲区的字节和调用d命令查看写入位置时不一致,如写入'a' 可能显示其它字节。这是因为此时操作系统有其它程序在使用该缓冲区,只要保证其它部分正确,在dos命令行中直接运行编写好的exe程序就可以。