30天自制操作系统第4天

30天自制操作系统第4天

ID:44870500

大小:484.11 KB

页数:17页

时间:2019-10-31

30天自制操作系统第4天_第1页
30天自制操作系统第4天_第2页
30天自制操作系统第4天_第3页
30天自制操作系统第4天_第4页
30天自制操作系统第4天_第5页
资源描述:

《30天自制操作系统第4天》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库

1、操作系统实验日志学号20160810520姓名甘昆禄专业年级班级智能1601实验日期2018.10.17实验项目第4天:C语言与画面显示练习一、实验主要内容1、让C语言读写内存上次实验隐约知道画面显示与vram有关,但具体的对应关系未知。这次我们用C语言来改写vram看看。作者首先用了汇编语言辅助函数,用了简单的方法,便于我们理解。Naskfunc.nas中增加了一个函数可供C语言调用的函数_write_mem8,用于实现直接写入指定内存地址的语句。如果C语言中write_mem8(0x1234,0x56);语句,则动

2、作上相当于汇编的MOVBYTE[0x1234],0x56。第一个数字在内存里的存放地址[ESP+4],下一个数字的存放就依次累加4。这里两个参数,一个地址,一个数据。汇编与C语言结合时能自由使用的寄存区只有EAX,ECX,EDX3个,其他寄存区用于记忆非常重要的值,只能读不能写。这段代码中还增加了INSTRSET指令,是用来告诉nask这个程序是给486使用的,不然会被默认解释成8086机器使用(偶尔使用)的标签(label)或者常数。C语言代码:voidio_hlt(void);voidwrite_mem8(inta

3、ddr,intdata);voidHariMain(void){inti;for(inti=0xa0000;i<=0xaffff;i++){write_mem8(i,15);/*将数据15写入地址i*/}for(;;){io_hlt();}}2、绘制条纹只需要在bootpack.c中修改写入值”15”为”i&0x0f”:write_mem8(i,i&0x0f);对图形来说,0和1并不是作为数字来使用,重点是0和1的排列方式。对于0和1的互相变化,有位运算”或”(OR)运算、”与”(AND)运算和”异或”(XOR)运算。

4、这些我们在数字逻辑和离散数学里都学过。这样,写入的值就高四位变为0,其余不变。就这样,每隔16个像素,色号就反复一次。3、直接用C语言写内存用指针写。指针符号是”*”,*p中的p是地址,而*p是p指向地址的内容。使用*i=i*0x0f可直接将i*0x0f写入i指向的内存地址中。*i=i*0x0f对应汇编的MOV[i],(i*0x0f),但如果直接这样写就不清楚[i]到底是BYTE还是WORD还是DWORD。由于MOV指令的两个对象必须是相同字节长度,即同类型(BYTE/WORD/DWORD),除非另一方是寄存器才可以省

5、略。同理,在使用指针时需要事先声明它的类型,即指针所指向内容的类型。chari是类似AL的1字节变量,shorti是类似于AX的2字节变量,inti是类似于EAX的4字节变量。charp;/用于BYTE类地址*/shortp;/用于WORD类地址*/intp;/用于DWORD类地址*/以上指针中的p都是4字节,因为p是用于记录地址的变量。在汇编语言中,地址也像ECX一样,用4字节的寄存器来指定,所以也是4字节。p=i;/带入地址/p=i&0x0f;/这可以替代write_mem8(i,i&0x0f)*/在执行maker

6、un之后出现了“warning:assignmentmakespointerfromintegerwithoutacast”这句话。在C语言中,普通数值和表示内存地址的数值被认为是两种不同的东西。如果将普通整数值赋给内存地址变量就会有警告,可以在赋值的时候使用强制类型转换:p=(char*)i;/*注意i的类型要和p类型一样*/指针应用p=(char*)0xa0000;/*给地址变量赋值*/for(inti=0;i<=0xffff;++i){*(p+i)=i&0x0f;}在声明p的时候给它赋值为写入内存的起始地址,之后

7、i作为地址增量,由p+i来指定写入内存的地址。C语言中,*(p+i)还可以改写成p[i]这种形式:p=(char*)0xa0000;/*给地址变量赋值*/for(inti=0;i<=0xffff;++i){p[i]=i&0x0f;}p[i]与*(p+i)意思相同,这两者的差距只有前者4个字符,后者6个字符。但是p[i]并不能说是数组,只是一个看起来像是数列的使用了地址变量的省略写法而已。加法运算可以交换顺序,于是(p+i)和(i+p),p[i]和i[p],a[2]和2[a]都是一个意思,这更能说明它们与数组没有关系。4

8、、调色板这次我们使用的是320*200的8位颜色模式,只有256种颜色,而计算机表示表示颜色时,都是用#ffffff一类的数,就是RGB表示法,可以表示256*256*256种颜色。那么我们现在8位数怎么表示颜色呢,其实我们这次只用到了16种。给每种颜色编上号码,像这样就可以使用了。再根据作者讲解修改完bootpack.c中的代码

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。