第四天开始正式的导入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,可以参考前面两天的博文最后给出的一个博文链接。
分享到:
相关推荐
《30天自制操作系统——用U盘启动自制系统》所用的工具 文章地址:http://blog.csdn.net/nonekey/article/details/8758715 以上工具均来自互联网!
操作系统课程设计报告,基于30天自制操作系统,内容为简单demo的实现,可参考学习
30天自制操作系统第1~15天实验日志,包括实验内容,问题及解决方式,描述创新点
操作系统之最内核部分,通常运行在最高特权级,负责提供基础性、结构性的功能。 3、支承库(亦作“接口库”) 是一系列特殊的程序库,它们职责在于把系统所提供的基本服务包装成应用程序所能够使用的编程接口(API...
《30天自制操作系统》源码中文版。自己制作一个操作系统(OSASK)的过程
自己制作一个操作系统的过程,阅读过程会一边汉化源码,一边执行还有根据一些相关的内容进行代码的书写,欢迎大家交流。 运行方法,在 tolset 中新建一个 run 文件夹,把代码拷贝进去,然后根据系统版本运行 !cons_...
30天自制操作系统最后的实验验收,将近两千行的代码,两点在于开机动画的帧数多,密码,双击,时钟绘制的好看,直线的绘制,可以用拖动的方式绘制矩形,还可以通过输入的方式改变绘制的大小,以及窗口颜色来改变颜色
自制软件————个人版自制软件————个人版自制软件————个人版
我是一个大二的学生,学C语言快两年了 这个程序是修改自《30天自制操作系统》的,作者有声明任何人使用它的程序可以不负任何费用,但是保留任何人修改并出售它的权利,而且这个并不是完整的操作系统。相反,其实我并...
30天自制操作系统书籍源程序文件
30天制作操作系统光盘内容,内容完整、代码清晰、适合初学者
《30 天自制操作系统》读书笔记.zip
管理系统系列--<30天自制操作系统>-----用GIT管理你的自制操作系统。
30天自制操作系统-川合秀实.docx
30天自制操作系统第2次,第3次实验验收,还包括窗口关闭与显示,完善任务栏被吃掉
改进版的30天自制操作系统-操作系统课程作业+源代码+文档说明 - 小白不懂运行,下载完可以私聊问,可远程教学 该资源内项目源码是个人的课程设计,代码都测试ok,都是运行成功后才上传资源,答辩评审平均分达到96分...
关于30天自作操作系统源码包,欢迎下载