文章目录

  • 一. 主要内容
    • 1、 内容1:鼠标解读(1)
    • 2、 内容2: 稍事整理
    • 3、内容3: 鼠标解读(2)
    • 4、 内容4: 移动鼠标指针
    • 5、 内容5: 通往32位模式之路
  • 二、遇到的问题及解决方法
    • 1、 描述问题1:理解鼠标数据第一阶段的if判断操作
    • 2、 描述问题2:理解ECX寄存器+3并向左移位的意义

一. 主要内容

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,选择舍去。

30天自制操作系统——Day8实验报告相关推荐

  1. 30天自制操作系统——Day11实验报告

    文章目录 一.实验主要内容 1. 内容1:鼠标显示问题 2. 内容2: 实现画面外的支持 3.内容3: shtctl指定省略 4. 内容4: 显示窗口 5. 内容5:小实验 6. 内容6:高速计数器 ...

  2. 30天自制操作系统——Day7实验报告

    一.实验主要内容 1. 内容1:获得按键编码 重点总结:改善程序,让程序在按下一个键后不结束,而是把按键的编码显示出来 (1)int.c 1. 函数功能 检测键盘IRQ1是否发生中断,发生中断后接受按 ...

  3. 30天自制操作系统Day8

    一.鼠标解读 鼠标收到激活指令后,发送的第一个按键编码是0xfa,之后,每次从鼠标发送过来的数据都是3个字节一组的.   移动鼠标时,第一个字节的高四位会在0-3的范围内变化,也就是说第七位和第八位始 ...

  4. 索骥馆-DIY操作系统之《30天自制操作系统》扫描版[PDF]

    内容简介: <30天自制操作系统>是一本兼具趣味性.实用性与学习性的操作系统图书.作者从计算机的构造.汇编语言.C语言开始解说,让读者在实践中掌握算法.在这本书的指导下,从零编写所有代码, ...

  5. 30天自制操作系统第三天

    操作系统实验日志3 学号 201708010402 姓名 徐冰娜 专业年级班级 实验日期 2019.9.28 实验项目 第3天:进入32位模式并导入C语言 智能1701 30天自制操作系统第三天 操作 ...

  6. 30天自制操作系统 - 取代软盘,用U盘写入引导扇区

    背景 作者是在2006年发布此书的(翻译版是在2012年在中国发售),当时可能还能找到带有软驱的计算机.但是时过境迁,现在已经不存在这种老古董东西了. 简单总结一下学习到第三天的一些更变. 更变 书籍 ...

  7. 《30天自制操作系统》第9天

    第九天 内存管理 1.整理源文件 这一节只是进行了代码整理,把鼠标键盘相关的内容转移到了特定的文件里. 2.内存容量检查(1) 要做内存管理,首先得知道内存的容量,怎么知道内存的容量呢?BIOS可以告 ...

  8. 30天自制操作系统——第2天

    操作系统实验日志 实验日期 2018/9/29 实验项目 第2天:汇编语言学习与Makefile入门 一.实验主要内容 (一)汇编 1.关键代码 运行结果: 2.相关汇编指令的解释 指令 格式 含义 ...

  9. 30天自制操作系统第五天

    操作系统实验日志5 第5天:结构体.文字显示与GDT/IDT初始化 30天自制操作系统第五天 操作系统实验日志5 一.实验主要内容 1. 内容1:接收启动信息 2. 内容2:使用结构体 3. 内容3: ...

  10. 为什么《30天自制操作系统》封面中的猫是两只尾巴

    刚刚在一社区,发了一贴,被指出一问题,询一高人,得一答案.这便是我没有关注到的封面上的那只猫,我想这也是很多读者没有关注到的.因为在我微博的200转发贴中,并没有人提到封面中的猫为何有两只尾巴.于是咨 ...

最新文章

  1. bootstrap-less源码分析:容器
  2. java 嵌套类 继承_Java嵌套类 - 爱吃苹果的搬运工的个人空间 - OSCHINA - 中文开源技术交流社区...
  3. Linux 中内核级加强型火墙的管理
  4. Windows下给SourceTree配置外部比较工具BeyondCompare
  5. 图像的色彩类别,灰度化,二值化
  6. NOI.AC-积木【堆】
  7. 使用Lock and Load X 插件时导致Final Cat Pro意外退出的解决办法
  8. 19天备战 691亿次红包互动 京东云独立抗住了
  9. 吴恩达|机器学习作业6.1.SVM建立垃圾邮件分类器
  10. Greenplum 数据库一体机硬件配置正式开源
  11. 南充高中计算机老师,2021四川南充教师招聘考试高中信息技术说课稿之《表格的装饰》...
  12. 集成Android SlidingMenu(SlideMenu)
  13. 32 任意项级数敛散性的判别法
  14. trueOS能装linux软件,TrueOS 17.12发布下载,一款基于FreeBSD的桌面Linux系统
  15. HTML5—网页三兄弟
  16. Redis记录:Invalid argument during startup: Failed to open the .conf file
  17. 大学学计算机专业要自带电脑吗,大学上课要带电脑吗
  18. 你敢信?这样炫黑的界面居然是一款数据库管理工具?
  19. python识别麻将牌_图像识别之麻将识别源码( 三 )
  20. 资料整理方法(写于2021-02-16)

热门文章

  1. php9.0论坛搭建默认,phpwind9.0
  2. win8的cmd运行命令大全
  3. Oracle中SQL*plus常用命令
  4. 【系统分析师之路】2021年上系统分析师案例分析历年真题
  5. 高数_关于e两个重要的积分公式
  6. php smarty安装,Smarty安装
  7. Python之爬取安居客网二手房小区详情页数据
  8. (Adobe Premiere Pro CS4)[ISO]《Adobe非线性视频编辑软件》
  9. 怎么更改win7登录界面 梦幻桌面动态效果电脑桌面快速分屏设置虚拟wifi热点方法_桌面图标弹出提示飞雪桌面日历自定义桌面
  10. VS2012安装部署教程