版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、操作系统实验日志学号20160810520姓名甘昆禄专业年级班级智能1601实验日期2018.10.24实验项目第5天:结构体、文字显示与 GDT/IDT初始化、实验主要内容1、接收启动信息和结构体在上一章中,xsize和ysize的值都是直接赋值为320*200,但实际上我们需要从asmhead.nas先前保存下来的信中去。即:CYLSEQUOxOffO1EDSEOUOxOfflVMODEQxOff2*5CRNXEQU50 工 £4SCRNYEQU0x0ff6_VRAMEQUOxOffBCRG;国面干一产在IS定MOVAL, 0k13MOVAH, OxO.JINT0X10KOVBY
2、TE VMODE F B 一,MOVWORD SCRNXr320MOVWORD SCRNYr200MOVDWORD不然的话,当画面模式改变时系统就不能正确运行。所以试着用指针取得图像模式:void HariMain(void)(char *vram;int xsize, ysize;short *binfo_scrnx, *binfo_scrny;int *binfo_vram;init_palette(); /* 设定调色板 */ binfo_scrnx = (short *) 0x0ff4;binfo_scrny = (short *) 0x0ff6;binfo_vram = (int *
3、) 0x0ff8;xsize = *binfo_scrnx;ysize = *binfo_scrny;vram = (char *) *binfo_vram;for(;) io_hlt(); /* 就行 naskfunc 里的 _io_hlt*/谀这样是不是说就可以改变画面模式了?于是天真的我:MOV MOV INT MOV MOV MOV0X12;AH,OxOQ 0x10BYTE VMODE,4;WORD (SCRNX,43WORD SCRNY,450保存运行一下,以为画面会显示坐标在左上角的 320*200,结果发现画面显示错误,forgetabout it。谀然后发现结构体里这个在汇编里
4、没有定义,可能作者以后讲?:3O0T_INFCMfCYL5EQUuxuiruLEDSEQUGxGfflVMODEEQUOxOff2SCR2JXEQUEQU0x0ff6VRAMEQUDiOffSCRGGxc;2G036 E3738394041struct BOOTINFO char cyls, ledSj vmode short scrnxj scrny;char *vram;哦先说结构体可以看做结构体是将一堆变量集中声明,然后作为新的变量用于其他场合结构体的运用:(1)先声明结构体:如上图(2)后定义结构体变量:struct BOOTINFOabc;或者定义结构体指针变量:structBinf
5、o = (structBOOTINFO*binfo;这里binfo表示指针变量后应该首先给指针赋值,可写成:BOOTINFP)0x0ff0;加上(struct BOOTINFP)是对数字进行强制类型转换,告诉编译器这个数字 是一个BOOTINFOfe型的指针变量。info指针指向地址0x0ff0是结构体的起始地址,结构体内的地址则依次按其类型增加。所以可以不用直接使用内存地址,而是使用 *binfo来表示这个内存地址上12个字节的结构体。在表示结构体内变量的时候,使用":'表示:xsize = (*binfo).scrnx;因为binfo是指向结构体地址的指针变量,它表示其内
6、部变量的形式很多,可以用箭头表示: Xsieze = binfo->scrnx 或者用 binfo->scrnx 直接代替 xsize2、显示字符终于到写字了,谀果然有定义好的哪个字母让具体哪个像素指定颜色,比如A的显示如下:00000000 00011000 00011000 00011000 00011000 00100100 00100100 00100100 00100100 01111110 01000010 01000010 01000010 11100111 00000000 00000000学林的依附?用8x16的长方形像素点阵来表示,8位是一个字节,1个字符是16
7、个字节,然后将 字体主句写入主程序:static char font_A16 = 0x00, 0x18, 0x18, 0x18, 0x18, 0x24, 0x24, 0x24,0x24, 0x7e, 0x42, 0x42, 0x42, 0xe7, 0x00, 0x00;程序里就会有A的信息了,当然放在程序里总是不好的,后面就有改了。显示字符的 函数是这样:void putfont8(char *vram, int xsize, int x, int y, char c, char *font)(int i;char *p, d;/* data */for (i = 0; i < 16;
8、i+)(p = vram + (y + i) * xsize + x;d = fonti;if (d & 0x80) != 0) p0 = c; 第i行的第1个像素,如果信息里存储的是1,就显示颜色Cif (d &0x40)!=0)p1= c;if (d &0x20)!=0)p2= c;if (d &0x10)!=0)p3= c;if (d &0x08)!=0)p4= c;if (d &0x04)!=0)p5= c;if (d &0x02)!=0)p6= c;if (d &0x01)!=0)p7= c;return;这里就是将这个
9、字符的16个字节用for循环逐个位判断,修改像素颜色,最终显示字 符。然后再主函数中调用:putfont8(binfo->vram, binfo->scrnx, 10, 10, COL8_FFFFFF, font_A);运行结果如下:EE QEMUA3、增加字体刚刚程序里只有字符A的信息,只能方便地显示A,那其他字符当然也要存啊,将平 木敬太郎和圣人先生编辑好了的 OSAKA?体(hankaku.txt)加入到源程序中,然后用工具 (makefont.exe)将此文本读进来输出成 16x256=4096字节的文件。编译后生成hankaku.bin 文件,加上连接所必须的接口信息变成
10、目标文件(bin2obj.exe来完成)。翻译之后相当于 增加了此汇编语言:_hankaku:DB各种数据(共4096字节)然后像以前编译C语言写Makefile 一样修改Makefile,加上相关代码。如果要在C语言中使用这种字体数据,只需要写上:Extern char hankaku4096;像这种在源程序以外准备的数据,都需要加上externa属性。让编译器知道它是外部数据,并在编译时做出相应调整。OSASK的字体数据,依照一般的ASCH字符 编码,含有256个字符。A的字符编码是0x41,所以A的字体数据, 放在“hankaku + 0x41 * 16 ”开始的16字节里。C语言中A的
11、字符编码 可以用A 来表示,正好可以用它来代替0x41 ,所以也可以写 成 “hankaku+' A * 164、显示字符串和变量值在上一小节中,显示每次显示一个字母都会有这一句,比较繁琐:putfont8(binfo->vram, binfo->scrnx, 8, 8, COL8_FFFFFF, hankaku + 'A' * 16);像这种需要反复使用的语句,可以写成一个函数,再对此进行调用:函数需要的实际参数有 binfo->vram, binfo->scrnx, 8, 8, COL8_FFFFFF, hankaku + 'A
12、9; * 16 应 于止匕设计函数的形参为:char *vram, int xsize, int x, int y, char c, unsigned char *svoid putfont8_asc(char *vram, int xsize, int x, int y, char c, unsigned char *s)(extern char hankaku4096;for (; *s 1= 0x00; s+)(putfont8(vram, scrnx, x, y, c, hankaku + *s * 16);x += 8;)return;)然后在主函数进行调用:void HariMai
13、n(void)(struct BOOTINFO *binfo = (struct BOOTINFO *) 0x0ff0;init_palette();/* 设定调色板 */init_screen(binfo->vram, binfo->scrnx, binfo->scrny);putfont8_asc(binfo->vram, binfo->scrnx, 8, 8, COL8_FFFFFF, "ABC 123");putfont8_asc(binfo->vram, binfo->scrnx, 31,31, COL8_000000,
14、"Haribote OS.");putfont8_asc(binfo->vram, binfo->scrnx, 30, 30, COL8_FFFFFF, "Haribote OS.");io_hlt(); /* 就行 naskfunc 里的 Jo_hlt7)这里调用了三次,后面两次先显示的黑色,再在不同但临近坐标显示一次白色,达到立体效果。效果如下:然后这里作者说,要自制操作系统,现在就能自由显示变量很重要。因为这里没用 debug可以用,如果出现错误就会很麻烦,就迫切需要知道变量有没有弄错。这里用到一 个sprintf函数。sprintf函
15、数和printf函数的区别在于它不是按指定格式输出,只是将输出 内容作为字符串卸载内存中。sprintf函数的使用办法是:sprintf (地址,格式,值,值,值,)这里的地址指定所生成字符串的存放地址。格式基本上只是单纯的字符串,如果有 的这类标记,就置换成后面的值的内容。除了 d (将数值作为十进制数转化为字符串)还 有§ %x(将数值作为十六进制转化为字符用)等符号。这里看来,sprintf函数的效果不过是将相应格式的内容存到相应地址罢了,要显示输出还是靠putfont8 。5、显示鼠标指针显示指针跟显示字符思路一样,也是先准备 16*16=256字节的内存,然后往里面写入 指
16、针的数据。将这个程序写在函数里面:/绘制鼠标 void init_mouse_cursor8(char *mouse, char bc)/*准备鼠标指针(16x16) */static char cursor1616 = I* H"*OOOOOOOOOOO*.二 "*OOOOOOOOOO*二 "*OOOOOOOOO*.", "*OOOOOOOO*", "*OOOOOOO*.", "*OOOOOOO*.", "*OOOOOOOO*", "*OOOO*OOO*.&quo
17、t;, "*OOO*.*OOO*”, "*OO*.*OOO*.", "*O*OOO*.",*OOO*.", *OOO*",*OO*",*”);int x, y;for (y = 0; y < 16; y+) for (x = 0; x < 16; x+) if (cursoryx = '*') mousey * 16 + x = COL8_000000;)if (cursoryx = 'O') mousey * 16 + x = COL8_FFFFFF;)if (curs
18、oryx = '.') mousey * 16 + x = bc;) return;)课本说什么要将上面背景色显示出来,还要做下面这个函数,搞得我差点误解,看了 半天,这个不就是将整个鼠标显示出来吗。这里分开的合理之处我猜应该是方便以后鼠标 所到之处颜色的改变。void putblock8_8(char *vram, int vxsize, int pxsize,int pysize, int px0, int py0, char *buf, int bxsize)int x, y;for (y = 0; y < pysize; y+) for (x = 0; x <
19、; pxsize; x+) vram(py0 + y) * vxsize + (px0 + x) = bufy * bxsize + x;) return;)主函数对鼠标显示函数的调用:void HariMain(void)struct BOOTINFO *binfo = (struct BOOTINFO *) 0x0ff0;char s40, mcursor256;int mx, my;init_palette(); /* 设定调色板 */init_screen8(binfo->vram, binfo->scrnx, binfo->scrny);mx = (binfo-&g
20、t;scrnx - 16) / 2;/画面中央的坐标计算my = (binfo->scrny - 28 - 16) / 2;init_mouse_cursor8(mcursor, COL8_008484);putblock8_8(binfo->vram, binfo->scrnx, 16, 16, mx, my, mcursor, 16);sprintf(s, "(%d, %d)”, mx, my);putfonts8_asc(binfo->vram, binfo->scrnx, 0, 0, COL8_FFFFFF, s);for(;) io_hlt()
21、; /* 就行 naskfunc 里的_io_hlt*/显示结果:6、GDT和IDT的初始化(提及)让鼠标动起来需要将GDT和IDT初始化,他们都是与CPU有关的设定,是为了让操作 系统能够使用32位模式,需要对CPU做各种设定。分段:打个比方就是按照自己喜欢的范式,将合计4GB的内存分成很多块(block),每一块的起始地址都看做0来处理。如前面提到的ORG旨令明确声明程序要读入的内存地址。这里的分段使用的是前面讲 到过的段寄存器(16位),为了表示一个段,需要以下信息:1 .段的大小是多少2 .段的起始地址在哪里3 .段的管理属性(禁止写入,禁止执行,系统专用等)CPU用8个字节的数据来表
22、示这些信息。但是,用于指定段的寄存器只有16位。魔方图像调色板的做法:现有一个段号,存放在段寄存器里,然后预先设定好段号与段的对 应关系。段寄存器低三位不能用,能够处理的就只有位于08191的区域。因为能够使用08191的范围,即可以定义 8191个段,设定这么多段就需要8192x8=65536字节(64KB)。这 64KB的数据就称为 GDT, “global (segment) description table”的缩写,意思是全局短号记录表。将这些数据整齐地排列在内存的某个地方,然后 将内存的起始地址和有效设定个数房子啊 CPU内被称作GDTR的特殊寄存器中。IDT是“interrupt
23、 description tabel ”的缩写,表示“中断记录表”,用来执行CPU的中 断功能。各个设备有变化是就产生中断,中断发生后,CPU暂时停止正在处理的任务,保存现场,转而执行中断程序,执行完毕之后恢复现场。总结来就是要使用鼠标就需要中断机制, 所以必须设定IDT。IDT记录了 0255的中断 号码与调用函数的对应关系,其设定方法与GDT很相似。二、遇到的问题及解决方法1、尝试更改画面模式失败。刚用结构体的时候说如果直接代入 320*200的值,改模式会错,然后我看用了结构体,直 接引用存在汇编里的再改,失败了,目前没有找到原因::lude <stdio.h>d io hl
24、t(void);文帆F; 一的 携索 OCV)娟曲附 雷吉艮;BOOT1*TC 如 EC¥L5 "喀低忧的LED5三。二CaQZflvnotji£QU¥ - TSCR3%喀153P5T*同:”工.XU±±-MTFRE EW 0 二昌二 Eg II5EL2A.CD EQCC-XM2M0M CXQCIWQICOD MNQgQQQ-山(二 JrMCV%IMTGXlC/MOV3m (VMC.DE A 4 Jam彳MOVWORD SCRllxLc4O/MOVKDEO SCEtSY Jl,.-5D/a*;黄面无一会Sfe定:bocitp.;二1;
25、F w J帝液1*依忖,*Th*HbQ2曲£E卜"日.加工一 般僚僚3 ,7邑圻方.,本来修改为640*480*4模式的,但画面显示的乱码三、程序设计创新点1、事实上,我对作者这个字符的输出还是不满意,他要方便输出一个字符串的话,只能输出 字体里对应的ASCII码,也就是说只能输出 ASCII码里的,那么字体给的那么多字符都不能方 便的输出了 ?it_palette();it_$creen(binfo->vramJ binfo->$crnXj binfo->scrny)jtfonts8_asc(binfo->vramJ binfo->scrnxJ 8, 8j COL8_FFFFFFj "ABC 9 123tf O void put+cnt:sS_a&C (charlint xe.IzBj int 篁, Lnt y, cluir £> unsigned char *s"Haribote OS;tfonts8_asc(binfo->vram7 binfc->scrnx7市泰,COL8_FFFFFFj "Haribote OS *");ABC i 123iiiiHaribote OS
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024年度涂料行业市场调研与发展规划合同3篇
- 2024年智慧教育平台开发与运营合同
- 2024年特种涂料内墙刮大白施工与安全协议合同3篇
- 2025届北京市西城区高三第二次联考数学试卷含解析
- 2025届河南省许昌市高级中学高考全国统考预测密卷数学试卷含解析
- 2024版生物制药研发合作及成果转化合同3篇
- 2024年二手货架买卖合同3篇
- 2024年城市公园绿化养护与施工服务合同模板2篇
- 2025届贵州省铜仁市一中高三最后一卷英语试卷含解析
- 2024年水电暖工程质保期服务合同3篇
- 01685《动漫艺术概论》自考必背考试题库(含答案)
- 《THPJC-2型机床电气技能实训考核鉴定装置》-X62W万能铣床电气线路分析及故障排除与分析
- 《记念刘和珍君》高中语文选择性必修中册
- 2024年广东省高中学业水平合格性考试语文试卷真题(含答案解析)
- CJ/T 83-2016 水处理用斜管
- CJJ181-2012 城镇排水管道检测与评估技术规程
- 2024河北科技师范学院教师招聘考试笔试试题
- 劳动劳务合同模板
- 2024南宁学院教师招聘考试笔试试题
- 医师定期考核业务水平测试题库(5000题可查找)
- 部编版五年级上册道德与法治期末测试卷附参考答案【综合题】
评论
0/150
提交评论