PC 机的硬件系统
Intel 公司设计出来了 8088 CPU,它有一套机器语言,虽然它的寄存器都是 16 位的,但是利用段和偏移的方法,它可以管理 1M 空间的存储器。
IBM 用它设计制造了(一系列的) PC 机。微软公司为 PC 机设计了操作系统 MSDOS、Windows。
IBM 设计硬件系统的时候,把一部份存储器空间,分配给了显示器、把一部份分配给了硬盘、一部份分配给了ROMBIOS、...。
显存
从 0B800H:0000H 开始,就是显示器的存储空间,这就是显存。
在 DOS 流行的时候,屏幕的显示,基本上都是文本模式。
在文本模式下,屏幕上共有 25 行、80 列,可显示 2000 个字符。
当对 0B800H:0000H 开始的内存空间写入数据的时候,字符将立即在屏幕上显示出来,这就是直接写屏。
要在屏幕上显示一个字符,需要连续写入两个字节,第一字节就是字符的 ASCII 码,第二字节是显示属性字节。
那么,要想写入一满屏的字符,就需要连续写入 4000 字节。这个数字就是“显存”的大小。
显示属性字节
属性字节的格式如下:
+---+---+---+---+---+---+---+---+
| F | R | G | B | I | R | G | B |
+---+---+---+---+---+---+---+---+
其中高四位是控制背景颜色(8种)和字符闪烁,低四位控制字符的显示颜色(16种)。
低四位所控制的颜色如下所示:
I R G B 颜色
0 0 0 0 黑
0 0 0 1 蓝
0 0 1 0 绿
0 0 1 1 青
0 1 0 0 红
0 1 0 1 品红
0 1 1 0 棕
0 1 1 1 灰
1 0 0 0 深灰
1 0 0 1 浅蓝
1 0 1 0 浅绿
1 0 1 1 浅青
1 1 0 0 浅红
1 1 0 1 粉红
1 1 1 0 黄
1 1 1 1 白
背景色,原来说是仅有上面列出的前8种,F是控制字符闪烁的。但是,F的功能,在目前的XP系统中,发挥不出来了,那么它也能就使背景色显示出来16种。
一个直接写屏的程序
做而论道回答了一个关于直接写屏的问题,并获得了最佳。
题目链接:http://zhidao.baidu.com/question/370792173.html
最佳答案:
assume cs:codesg,ds:datasg
;------------------------
datasg segment ;定义字符和属性
DB 'w', 06H ;黑色背景、棕色文字
DB 'e', 02H ;黑色背景、绿色文字
DB 'l', 07H ;黑色背景、灰色文字
DB 'c', 26H ;绿色背景、棕色文字
DB 'o', 85H ;深灰色背景、品红色文字
DB 'm', 74H ;灰色背景、红色文字
DB 'e', 98H
datasg ends
;------------------------
codesg segment
start:
MOV AX, datasg
MOV DS, AX
mov bx, 0b800h
mov es, bx
mov bx, 0
mov cx, 6 ;设定循环次数
s:
mov ax, [BX] ;取来字符和属性
mov es:[BX], ax ;直接写屏
add BX, 2 ;每次写两个字节,显示一个字符
loop s ;循环6次
mov ax, 4c00h ;退出
int 21h
codesg ends
end start
;------------------------
程序运行后,显示如下图:
显示位置的控制
在前面的程序中已经看到,对 0B800H:0000H 开始的空间连续写入数据的时候,字符是在屏幕的左上角连续显示出来的。
如果连续写入 160 字节后,第一行(80个字符)就显示满了,再接着写入的字符,将显示在屏幕的第二行。
那么,在 12 * 160 + 36 * 2 = 12 * (80 * 2) + 36 * 2 字节的位置写入,就将在第 12 行第 36 列上显示。
其它位置可以自行推算。
常见的微机原理教材中,有这方面的简介。
不过,这知识,太老了,没有必要深入研究,早就没有用了。呵呵
==========================================================