`
923723914
  • 浏览: 637969 次
文章分类
社区版块
存档分类
最新评论

《30天自制操作系统》之——第04天

 
阅读更多

第四天开始正式的导入C语言,并且进行画面的显示。今天的内容倒不是很多,但我觉的对于c语言的指针的进一步理解有很大的帮助,而且今天终于可以摆脱一片漆黑的界面了。

切入正题!

-------------------------------------------------------------------------------------------------------------------------------

我觉得今天比较重要的内容是,作者从汇编的角度让我们重新认识了C语言中指针。对于之前C语言学习当中指针部分一些模棱两可的概念做了透彻的解析。

1.显示条纹图案:

int i;
char *p;
for(i = 0xa0000; i <= 0xaffff; i++)
{
    p = i;
    *p = i & 0x0f;   //相当于write_mem3(i, i & 0x0f);
}

或者也可以写成

int i;
for(i = 0xa0000 ; i <= 0xaffff; i++)
{
    *( (char *) i ) = i & 0x0f;
}


2.挑战指针:

write_mem3(i, i & 0x0f);

*i = i & 0x0f

通过书中可以知道,这两条语句并不是等价的,后一句在编译时会报错。后一句的错误与下面的汇编代码出现的错误类似:
MOV     [0x1234], 0x56
错误原因是在向内存中写数据时并不知道是BYTE、WORD还是DWORD。

3.p[i]是数组吗?

虽然*(p + i) 可以写成p[i],但它并不是数组。(这里需要注意,p[i]是书中特定上下文中的p[i])。

4.色号设定

开发过程中使用的是320*200的8位颜色模式,即色号使用8位二进制数。但一般指定颜色使用的是#ffffff之类的数,在这本书中我们只是用16中不同的颜色,所以我们可以按照个人喜好将这些以#开头的24位数与16个的8位的色号(0x00 - 0x0f)对应。

void init_palette(void)
{
	static unsigned char table_rgb[16 * 3] = {
		0x00, 0x00, 0x00,	/*  0:黑  */
		0xff, 0x00, 0x00,	/*  1:亮红 */
		0x00, 0xff, 0x00,	/*  2:亮绿 */
		0xff, 0xff, 0x00,	/*  3:亮黄 */
		0x00, 0x00, 0xff,	/*  4:亮蓝 */
		0xff, 0x00, 0xff,	/*  5:亮紫 */
		0x00, 0xff, 0xff,	/*  6:浅亮蓝 */
		0xff, 0xff, 0xff,	/*  7:白 */
		0xc6, 0xc6, 0xc6,	/*  8:亮灰 */
		0x84, 0x00, 0x00,	/*  9:暗红 */
		0x00, 0x84, 0x00,	/* 10:暗绿 */
		0x84, 0x84, 0x00,	/* 11:暗黄 */
		0x00, 0x00, 0x84,	/* 12:暗青 */
		0x84, 0x00, 0x84,	/* 13:暗紫 */
		0x00, 0x84, 0x84,	/* 14:浅暗蓝 */
		0x84, 0x84, 0x84	/* 15:暗灰 */
	};
	set_palette(0, 15, table_rgb);
	return;

}

5.调色板的设定:(即把前面设定好的色号和颜色之间的关系写入到特定的设备当中)

void set_palette(int start, int end, unsigned char *rgb)
{
	int i, eflags;
	eflags = io_load_eflags();	         /* 记录中断许可标志的值 */
	io_cli(); 			         /* 将中断许可标志置为0,禁止中断 */
	io_out8(0x03c8, start);
	for (i = start; i <= end; i++) {
		io_out8(0x03c9, rgb[0] / 4);
		io_out8(0x03c9, rgb[1] / 4);
		io_out8(0x03c9, rgb[2] / 4);
		rgb += 3;
	}
	io_store_eflags(eflags);	/* 复原中断许可标志 */
	return;
}

其中io_cli()、io_out8()、io_store_eflags()等函数使用汇编实现的。

7.上面的内容完成以后,就可以绘制一些简单的各种颜色的图像了,今天的内容到此就算是完成了!


PS:

1.这一节中的C语言指针专栏写的很不错,如果不能理解可以多看几遍。

2.色号的设定是第一次接触到,感觉比较陌生,多花了一些时间。

3.最终做出来了一个带任务条的界面,没想到操作系统的界面真的是“画出来”的!

4.如果你的开发环境是linux,可以参考前面两天的博文最后给出的一个博文链接。


分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics