哎呀,说来惭愧,差不多有一个月没有写学习笔记了。倒也不是因为懒散了,前段时间深感在《微机》课上学的那点汇编语言不够,于是买了王爽老师的《汇编语言》,花了二十多天,学了一遍,耽搁了二十多天,再加上过年,就一个多月没写了。但虽说耽搁了一点时间,回头再看这本《30天自制操作系统》,我觉得这种程度的汇编基础还是需要的。本书虽说是零基础,但若真是汇编和c都啥不懂,肯定会越看越迷糊。
现在觉得,学了汇编之后再看此书真是再正确不过的选择。因为在制作操作系统的第一步,或者说前面的最基础的几部,都是用汇编写的,而且整个操作系统也是与底层打交道的,虽说后期以c为主,但时而穿插着汇编,这样也能更好地理解c。
打个比方来说吧,本书制作操作系统的第一步,其实是设置bios为软盘启动,然后就涉及到用软中断进行软盘(磁盘)的读写问题,要是没系统地学过,第一遍看,还真是迷糊。
文归正题,开始第四天的笔记。
第四天一开始给出了一个用汇编编写的函数:_write_mem8即void write_mem8 (int addr ,int data)。这个函数非常简单,就是往指定内存空间传指定数据。虽然很简单,但在后文会经常被用到,而且也有很多类似形式的函数,因此提一嘴。
这里作者用_write_mem8是用于后面的图案绘制。将数据直接用函数写入显存,使其予以显示。具体的方法就不细说了。
后面作者为了帮助读者理解指针,给出了一个诀窍,即把指针直接理解地址变量。
接下来便是操作系统背景颜色的工作。在上一天的笔记中我落了一个信息,那就是调用bios里的函数来切换显示模式。int 0x10 ,ah=0x00 设置显卡模式,al=模式,0x03:16色字符模式,80*25(最基础) 0x13:VGA图形模式,320*200*8位彩色模式,调色板模式。本系统采用后者。8位彩色模式,就是有程序员随意指定0~255的数字所对应的颜色。如25号颜色对应#ffffff,26号对应#123456,这种方式叫做调色板palette。调色板的访问步骤:(1)首先在一连串的访问中屏蔽中断(比如CLI)。
(2)将想要设定的调色板号码写入0x03c8端口,紧接着,按RGB的顺序写入0x03c9。若还想继续设定下个调色板,就省略调色板的号码,再按RGB的顺序写入0x03c9就行了。
(3)若想读出当前调色板的状态,首先要将调色板的号码写入0x03c7,再从0x03c9中读取3次,顺序为RGB。若要继续读下一个,则省略调色板号码设定,继续按RGB读出。
(4)若开始执行了CLI,则最后执行STI。
说实话,初次接触这个调色板,还真是有点不习惯。像汇编教材中,使用80*25的模式时,直接往显存写颜色字,ascii码。可是这回换成320*200*8之后,变成了往显存里写调色板号(如1,2,...)!这简直是太神奇了,真是让人不习惯。
上网查了查资料,做如下引用:
调色板只有图片的颜色小于等于256色的时候才有,16位高彩和24位32位真彩是没有调色板的.
调色板的存在的意义只是在当初486以前为了节省空间的一种采用索引的压缩算法,现在没有人这种东西。
调色板是为了节约空简所用的,相当于一个索引。只有16位以下的才用调色板,真彩色不用调色板。
让我们来看看下面的例子。
有一个长宽各为200个象素,颜色数为16色的彩色图,每一个象素都用R、G、B三个分量表示。因为每个分量有256个级别,要用8位(bit),即一个字节(byte)来表示,所以每个象素需要用3个字节。整个图象要用200×200×3,约120k字节,可不是一个小数目呀!如果我们用下面的方法,就能省的多。
因为是一个16色图,也就是说这幅图中最多只有16种颜色,我们可以用一个表:表中的每一行记录一种颜色的R、G、B值。这样当我们表示一个象素的颜色时,只需要指出该颜色是在第几行,即该颜色在表中的索引值。举个例子,如果表的第0行为255,0,0(红色),那么当某个象素为红色时,只需要标明0即可。
让我们再来计算一下:16种状态可以用4位(bit)表示,所以一个象素要用半个字节。整个图象要用200×200×0.5,约20k字节,再加上表占用的字节为3×16=48字节.整个占用的字节数约为前面的1/6,省很多吧?
这张R、G、B的表,就是我们常说的调色板(Palette),另一种叫法是颜色查找表LUT(Look Up Table),似乎更确切一些。Windows位图中便用到了调色板技术。其实不光是Windows位图,许多图象文件格式如pcx、tif、gif等都用到了。所以很好地掌握调色板的概念是十分有用的。
有一种图,它的颜色数高达256×256×256种,也就是说包含我们上述提到的R、G、B颜色表示方法中所有的颜色,这种图叫做真彩色图(true color)。真彩色图并不是说一幅图包含了所有的颜色,而是说它具有显示所有颜色的能力,即最多可以包含所有的颜色。表示真彩色图时,每个象素直接用R、G、B三个分量字节表示,而不采用调色板技术。原因很明显:如果用调色板,表示一个象素也要用24位,这是因为每种颜色的索引要用24位(因为总共有224种颜色,即调色板有224行),和直接用R,G,B三个分量表示用的字节数一样,不但没有任何便宜,还要加上一个256×256×256×3个字节的大调色板。所以真彩色图直接用R、G、B三个分量表示,它又叫做24位色图。
原来是这样呀,这样看来,这个操作系统还真是有点弱呀,哈哈。哦了,结束今天的工作,期待第五天笔记。