第四天开始正式的导入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,可以参考前面两天的博文最后给出的一个博文链接。