30天自制操作系统——Day8实验报告

一. 主要内容

1、 内容1:鼠标解读(1)

重点总结:在Day7中,我们已经从鼠标中取得了数据。现在我们要来解读这些数据
(1)bootpack.c
在这里插入图片描述
1、 函数功能:读取鼠标数据
a. 首先把最初读到的0xfa舍弃掉
b. 将从鼠标读取的数据按照3个字节为一组,当数据累积到3个字节,就把它显示在屏幕上
(2)结果
在这里插入图片描述
1、 结果解读
屏幕上会显示“08 00 02”等三字节数字。
第一个字节:”08”
第一个数字会在0~3范围内变化(0000 ~ 0011),移动鼠标时回复发生变化
第一个数字会在8~f范围内变化(1000 ~ 1111),点击鼠标时会发生变化

第二个字节:”00”,与鼠标左右移动相关
第三个字节:“02”,与鼠标上下移动相关
在这里插入图片描述

工作总结:对从鼠标获取的数据进行了初步的处理,并以3个字节为一组。三个字节各自的含义如上表所示

2、 内容2: 稍事整理

重点总结:整理代码,创建一个结构体保存解读鼠标所需要的变量,并将数据读取处理过程封装为一个函数
(1)bootpack.c
在这里插入图片描述
1、 内容说明
将鼠标数据处理函数封装为mouse_decode函数,如下:
在这里插入图片描述
当成功处理了鼠标传来的数据,将3个字节凑齐后,执行return1在主函数中将鼠标星系显示出来

3、内容3: 鼠标解读(2)

重点总结:在结构体中增加几个变量存放解读结果,并通过增加数据处理内容获得更加精细的数据内容
(1) bootpack.c:MOUSE_DEC结构体
在这里插入图片描述
1、内容说明
新增加了3个变量x, y, btn。分别表示位置信息(后2个字节)与鼠标按键状态(第1个字节)
(2) bootpack.c:mouse_decode函数
首先在phase == 1情况下增加如下语句,做数据检查
在这里插入图片描述
1、 内容说明
Dat的前半个字节范围为(0000 ~ 0011),即前两位始终为0. 后半个字节范围为(1000 ~1111),第一位始终为1. 因此可以与0xc8(1100 1000)做与运算,当dat正常输入时,与运算的结果为0x08。否则这一字节数据不在范围内,应当舍去。

下面是解读处理的核心,将会获得鼠标按键与位移的状态
在这里插入图片描述
1、内容说明
① 鼠标状态”btn”:
鼠标状态放在第一个字节buf[0]的低三位(按键状态)
②③ 鼠标移动状态”x, y”:
鼠标水平、竖直移动信息x, y保存在第二位和第三位。另外还需要第一个字节中显示位移的信息(前半个字节0~3)来正确表示移动信息。将x和y第8位及第8位以后(0x <-00)全部设为一(当第一位移动信息为1-3时)或全设为0
④ 对y符号进行取反操作

下面修改显示部分
在这里插入图片描述
1、内容说明
Btn为三位按键信息,当btn=001时,表示按下右键。当btn=010时,表示按下左键。当btn=100时,表示按下中间滑轮
(2)结果展示
在这里插入图片描述

4、 内容4: 移动鼠标指针

重点总结:已完成鼠标解读工作,现在让鼠标指针动起来
(1)bootpack.c
Mdec.x, mdec.y表示鼠标向横向、纵向移动的大小。可以用此实现鼠标移动
在这里插入图片描述

1、 内容说明:坐标与鼠标位置更新
坐标与鼠标位置更新分为三个步骤
Step1:覆盖原有鼠标图案
Step2:计算移动后鼠标位置坐标mx, my。并对鼠标移动进行限制,鼠标不能移动超出屏幕。因此 0<(mx+x)<scrnx-16, 0<(my+y)<scrny-16。超出界限时,让鼠标到达极限位置
Step3:覆盖原有坐标并产生新坐标与新鼠标图案

(2)结果展示
在这里插入图片描述
成功实现鼠标移动,但是没有考虑叠加处理

5、 内容5: 通往32位模式之路

重点总结:说明asmhead.nas中大约100行的代码
第一部分:PIC关闭一切中断
第二部分:允许访问1MB以上的内存空间
第三部分:切换到保护模式
第四部分:bootpack的传递
第五部分:bootpack的启动
第六部分:waitkbdout函数
第七部分:memcpy函数

(1) PIC关闭一切中断
在这里插入图片描述
1、 内容说明
因为在CPU进行模式转换与PIC进行初始化时,不允许中断发生。所以要把中断全部屏蔽掉。其中NOP使CPU简单休息,避免连续的OUT操作。C语言表示如下:

(2) 允许访问1MB以上的内存空间
在这里插入图片描述
1、内容说明
Waitkbdout功能是往键盘控制电路发送指令。此处是使键盘控制电路的附属端口输出0xdf从而让A20GATE信号线变成ON的状态。A20GATE信号线能使内存1MB以上的部分变成可使用状态。

(3) 切换到保护模式
在这里插入图片描述
1、内容说明
① INSTRSET指令:为了使用386以后的LGDT, EAX, CR0指令
② 进入保护模式:将CR0的最高位设为0,第一位设为1即可进行模式切换,进入保护模式
③ JMP pipelineflush:
切换到保护模式后,机器语言的解释发生了变化。因为CPU为了加快执行速度使用了管道,提前解释后面的语言。因此模式改变后需要重新解释
同时切换到保护模式后,除了CS以外的所有段寄存器都从0x0000变成了0x0008

(4)bootpack的传递
在这里插入图片描述
1、 内容说明
在这里插入图片描述
1.在asmhead结束的地方,紧连着bootpack最前面部分
将bootpack.hrb开始的512KB内容复制到BOTPAK(0x00280000号)地址处理

2.将启动扇区复制到1MB以后的内存从0x7c00复制512个字节到DSKCAC(0x00100000)处理

3.将出去启动区的部分复制到1MB以后的内存
从DSKCAC0+512(0号扇区后512MB即第一号扇区开始的地址)复制减取启动区512MB部分个字节到DSKCAC+512处理(前512被启动区占用

(5) bootpack的启动

1、内容说明
对bootpack.hrb的headre进行解析,将执行所必须的数据传送过去。即将bootpack.hrb第0x10c8字节开始的0x11a8字节复制到0x00310000号地址去。
在这里插入图片描述
① 设置转移数据的大小:
数据的大小是以双字为单位的,因此鼠标传来的数据大小为传来字数/4。但从鼠标传来的数据以3个字节为一组,如果直接除以4,超出4的部分(字节数除以4的余数)会被忽略。因此在计算前使字节数+3.
但是当ECX为0,即没有需要传送的数据时,会跳转到Skip

② 设置转送源地址:
[EBX + 20]是bootpack.hrb之后的20号地址,值为0x10c8

③ 设置转送目的地址
[EBX + 12]是bootpack.hrb之后的12号地址,值位0x00310000
同时介绍了“纸娃娃系统”的内存分布图
在这里插入图片描述
(6) waitkbdout
在这里插入图片描述
1、内容说明
Waitkbdout功能是往键盘控制电路发送指令,与wait_KBC_sendready相同,也添加了指令,从0x60号设备进行IN的处理,如果控制器有键盘代码或者已经累积了鼠标数据,就把他们读出来。当数据不为空时,继续跳转到waitkbdout读取数据

(7)memcpy
在这里插入图片描述
1、内容说明
在这里插入图片描述
其中源地址、目的地址、数据大小分别保存在ECX, ESI, EDI三个寄存器中

(8)GDT0与GDTR
在这里插入图片描述
1、内容说明
① ALIGNB指令:一直添加DBO,直到时机合适为止
② GDT0
GDT0是一种特定的GDT,0号是空区域不能定义段。1,2号由下式设定:
在这里插入图片描述
在GDT0内写入了16位的段上限和32位的段起始地址

最初状态时,GDT在asmhead.nas里,并不在0x00270000 ~ 0x0027ffff范围里。
在这里插入图片描述
因此应尽快开放中断,接收数据。因此需要在调色盘初始化和画面准备之前重现创建GDT和IDT

二、遇到的问题及解决方法

填写说明:分条目列出本次的实验过程中遇到的问题和解决方法(可注明是哪位同学帮忙解决问题),描述问题时应配上相关的截图和标记,描述解决方法时应先分析出现该问题的原因再讲解决方法,尽量详细。

1、 描述问题1:理解鼠标数据第一阶段的if判断操作

在这里插入图片描述
从鼠标传来的数据以三个字节为一组进行解读。其中第一个字节的前半个字节表示鼠标的移动情况,取值范围为0~3 (0000 -> 0011)。后半个字节表示鼠标的按键状态,取值范围为8~f (1000 -> 1111)。为了预防数据不在设定的范围内,将输入数据与0xc8做与运算。当超出上述取值范围后,获得的值不为0x08,选择舍去。

2、 描述问题2:理解ECX寄存器+3并向左移位的意义

在这里插入图片描述
数据的大小是以双字为单位的,因此鼠标传来的数据大小为传来字节数/4。但从鼠标传来的数据以3个字节为一组,如果直接除以4,超出4的部分(字节数除以4的余数)会被忽略。因此在计算前使字节数+3.

三、程序设计创新点
填写说明:分条目列出本次实验过程中对教材的哪些部分进行了创新或者修改,写清楚为什么要这样做,这么做会得到怎样的结果等,附上关键代码和截图。这部分是重点,占实验日志总分的20%。
1、 描述创新点1,解决叠加处理问题
(1) 问题描述
在上述实现鼠标移动时,会发生叠加处理问题。即在覆盖原有鼠标位置时,会同时覆盖其他背景颜色不同的结构。
在这里插入图片描述
(2) 可能原因分析
分析覆盖算法,是通过矩阵覆盖为背景色实现覆盖。但是因为下面对话框不是背景颜色,因此会发生颜色叠加。
1.那我们是不是可以尝试每次移动鼠标后都将画面重新初始化
在这里插入图片描述
但是会出现如下结果:即鼠标图像本身的影响
在这里插入图片描述
2.分析鼠标图像以及颜色构成,在代码中将鼠标空余空余部分显示为了背景颜色。因此可以通过把空余部分设为透明色,实现叠加
在这里插入图片描述
在这里插入图片描述
成功实现我们预定的目标

2、 描述创新点2,改变实心圆的移动步长

四、实验心得体会
填写说明:写本次实验的心得体会,例如:学到了什么、思考了什么、有何建议、解决问题的过程是怎样的等等(根据个人实验情况填写,内容没有硬性要求)。

1、鼠标数据处理
在这里插入图片描述
2、坐标与鼠标位置更新
坐标与鼠标位置更新分为三个步骤
Step1: 覆盖原有鼠标图案
Step2: 计算移动后鼠标位置坐标mx, my。并对鼠标移动进行限制,鼠标不能移动超出屏幕。因此 0<(mx+x)<scrnx-16, 0<(my+y)<scrny-16。超出界限时,让鼠标到达极限位置
Step3: 覆盖原有坐标并产生新坐标与新鼠标图案
3、 “纸娃娃系统”的内存分布图
在这里插入图片描述
4、理解解读鼠标数据第一阶段的if判断操作
在这里插入图片描述
从鼠标传来的数据以三个字节为一组进行解读。其中第一个字节的前半个字节表示鼠标的移动情况,取值范围为0~3 (0000 -> 0011)。后半个字节表示鼠标的按键状态,取值范围为8~f (1000 -> 1111)。为了预防数据不在设定的范围内,将输入数据与0xc8做与运算。当超出上述取值范围后,获得的值不为0x08,选择舍去。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

冠long馨

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值