鉴于不断学习王爽老师的《汇编语言》,越往后的章节的题目,多有在屏幕中显示XX字符或者string的问题。前面对屏幕显示的部分没有详细的看,也就一直比较乱。
现在总结一下汇编语言中如何在屏幕上显示内容的问题。关键是显示字符的结构及所在的内存空间。
首先,需要明确我们想要显示的内容主要存放在什么位置,是以什么样的结构存放的。
在内存地址空间中,B8000H~BFFFFH空间用来存放显示缓冲区的内容,共32KB。
显示缓冲区以页的形式存放要显示的内容,就像日历一样,每一页都有内容,但是只显示最上面那一页(默认情况下)。这种日历只有共有8页,也就是每页包含4KB的内容。而每一页中,可以显示25行,每一行80个字符。(这里需要注意一下字符个概念,在屏幕上每一个字符由两个字节构成,一个字节代表要显示的ASCII值,一个字节代表要显示的属性(即颜色,亮度,背景,闪烁等)。所以一行有160个字节)
属性字节的格式为:
7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | |
含义 | BL | R | G | B | I | R | G | B |
闪烁 | 背景红 | 背景绿 | 背景蓝 | 高亮 | 前景红 | 前景绿 | 前景蓝 |
因此,要显示的属性为高亮的前景色为红色,背景色为绿色,属性值可以设置:mov al,00101100b。将al赋给指定的位置,就可以显示该位置的ASCII值的属性了
基于以上知识,要在第五行的中间位置显示大写字母A,则可以如下表示:
mov ax,0
mov es,ax
mov al,41H
mov byte ptr es:[160 * 5 + 40 * 2],al;要在第几行显示,160*该行号,中间位置是80
;如果要显示颜色,如上例子
mov bl,00101100b
mov byteptr es:[160*5 + 40*2 + 1],bl;显示的是高亮的绿底红字的大写字母A