试用结构体:

     结构体的好处是,可以将各个参数一股脑传递进去,而没有结构体则需要一个一个传递。
一个灵光一闪:原来一个大的软件,所有源文件全部编译进去成为一个整体存放在内存里,假如文件A中宏定义了一个地址#define RAM 0X1000, 编译好运行软件,在内存中0x1000就是RAM地址 在B文件中直接用各种类型指针指向0X1000来读取这里面的内容即是读取RAM的内容。
如何显示字符??:
     
像这种描绘文字形状的数据成为字体数据,那么字体数据是怎么写到程序里面的???
有一种方法:利用数组来存储
static char font_A[16] = {
     0x00,0x18,0x18,0x18,0x18,0x24,0x24,0x24,
     0x24,0x7e,0x42,0x42,0x42,0xe7,0x00,0x00
};
仔细看上面的数组,其实就是图中右边二进制数从上到下依次的十六进制转换而已。
字符串是按照顺序排列在内存中的,末尾加上0X00而组成的字符串编码。
sprintf函数:不是按指定格式输出,只是将输出内容转换为字符串写在内存中。可以应用与所有操作系统,而printf,不管怎么设计,最终都要依赖于操作系统。
%d:单纯的十进制
%5d:5位十进制,如果是123,则补全为“  123”
%05d:5位十进制,123则为“00123”
%x16进制
%X 超级16进制,字母部分为大写的ABCDEF
调色板原理
图像处理中为了节省表示图像RGB信息的空间,用调色板存储彩色信息(RGB值),数据区只存储当前象素的色彩在调色板中的位置,这样就省了很多字节。不过真彩色的图像没有调色板。
比如调色板区域的内容为:00 00 00 00   00 00 40 00  00 00 80 00   00 00 FF 00
                      00 20 00 00   00 20 40 00  00 20 80 00   00 20 FF 00
                      00 40 00 00   00 40 40 00  00 40 80 00   00 40 FF 00
                          ............................................
                      FF FF 00 00   FF FF 40 00  FF FF 80 00   FF FF FF 00
四个一组共256组调色板数据。
数据区内容为 03 05 0A................................
意思就是第一个象素点的颜色在调色板中的位置是03,也就是R=FF,G=00,B=00;
第二个的R=40,G=20,B=00,以次类推。
调色板的每一组值的最后一位为保留值,同时RGB的顺序是B G R 保留值。
鼠标显示出来了。该如何让鼠标运动起来呢????
需要一个GDT和IDT:::什么是GDT和IDT?
     为什么需要分段,如果实模式下,假设所有程序开头都是ORG 0X1234,那么必然会造成,程序的起始地址重合,发生错误,因此需要分段来错开。
     分段的思想,就是将内存划分为一段一段的,那么每一段就有三个信息需要知道
  1. 段的起始地址在哪里
  2. 段的大小有多少
  3. 段内容的访问权限(禁止写入,禁止执行,系统专用)
那么存放这三个信息需要8个字节!而使用分段,则就必须要使用到段寄存器,32位的段寄存器如果有MOV AL,[DS:EBX], CPU会往DS里面加上某个值来计算地址,这个值就是段的起始地址。

     而由于段寄存器只有16位,而表示8字节信息需要64位,明显不够,那么解决办法就是需要一个段号(段选择符),存放到段寄存器里,然后预先设定好段号与段的关系。(和调色板原理有点像,图像处理中,为了节省表示RGB图像的信息,用调色板存储彩色信息值,数据区值存储当前色彩在调色板中的位置。)
     但是段寄存器由于CPU设计的原因低3位不能使用,因此能够使用的段号只有13位,能处理的区域只有0-8191区域。
     那么8191*8 =64k,而这个64K在CPU中存储不下去啊,于是就存到内存里。这64K的数据就成为GDT(实际比这小)。
     GDT global (segment)descripator table全局段号记录表。
     将这些的数据整齐的排列在内存中某个地址,然后内存的起始地址和有效设定个数存放于CPU的GDTR特殊寄存器中,设定就完成了。
什么是IDT???
     interrupt descriptor table中断记录表。
     中断的由来?
     以键盘为例,在CPU的速度角度看键盘很慢,一秒钟都输入不了50个字符,而CPU可以一秒钟处理200万次运算,查询一次足够了,但是电脑中并不是只有键盘,还有网卡,软驱,硬盘等其他东西,如果选用这种定期查看状态的方式,就非常的低效,特别是网卡需要实时响应,如果延迟可能数据就收不到需要重新发送,于是就有了中断机制,当设备发出了中断,就会跳到中断处理程序去执行,然后调用设定好的程序返回到被中断前的任务中。
     总结来说,要使用鼠标,就一定要使用中断,因此需要设置IDT.IDT设定了0-255个中断号码与调用函数之间的关系,比如发生123号中断,就调用0X函数。设定方式和GDT相似。
同时需要注意,如果GDT还没有设定好就设定IDT就很麻烦,因此先设定GDT在设定IDT.
     

五、结构体、文字显示与GDT/IDT初始化相关推荐

  1. 第5天 结构体、文字显示与GDT/IDT初始化

    第5天 结构体.文字显示与GDT/IDT初始化 https://weread.qq.com/web/reader/38732220718ff5cf3877215k34132fc02293416a75f ...

  2. 自制操作系统5-结构体、文字显示与GDT/IDT初始化

    DAY5 结构体.文字显示与GDT/IDT初始化 2020.10.17-2020.10.18 今天的内容主要学习了如何显示符号,将鼠标指针显示出来后,进而考虑如何让它动起来. 1. 接受启动信息 文档 ...

  3. 30天自制操作系统:第五天 结构体、文字显示与 GDT/IDT初始化

    今天的内容相比前几天多了很多,主要是一些东西用代码写出来更难理解,需要更多的时间去琢磨,因此对于一些较为基础的内容不会进行详细的描述. 1.接收启动信息(harib02a) 之前的程序大都是直接使用0 ...

  4. 30天自制OS学习笔记 (五)结构体、文字显示与GDT/IDT 初始化

    1.接收启动信息 & 2.试用结构体 & 3.试用箭头符号 在第五天之前,我们都是把vram.xsize.ysize这些值直接写在了bootpack.c文件中.而这些值应从asmhea ...

  5. 操作系统实验第五天:结构体、文字显示与GDT/IDT初始化

    一.实验主要内容 内容1:接受启动信息 之前的bootpack.c中是将数字直接写入程序,但这些数字本身应该是从asmhead.nas先前保存下来的值中取.不然当画面模式改变时,程序就不能正确运行. ...

  6. 【Struct(结构体)杂谈之二】名不正则言不顺---Struct(结构体)的声明、定义及初始化

    Struct(结构体)的声明.定义及初始化 上一篇里我们讲了为什么我们要引入Struct这个数据类型,我们了解到Struct是一种聚合数据类型,是为了用户描述和解释一些事物的方便而提出的,Struct ...

  7. c语言结构体菜单显示框架,请教c语言结构体嵌套问题。field `atItem' has incomplete type...

    //菜单项结构体 typedef struct { BYTE                aucItemName[20];   //菜单项的内容 WORD32              dwItem ...

  8. C++结构体实例和类实例的初始化

    结构体实例(包括共用体)和类实例的初始化方法完全相同,二者都可以应用于继承层次中.不同点是结构体(包括共用体)默认成员为public,而类默认成员是private型的. 一.若类和结构体所有数据成员均 ...

  9. C++结构体实例和类实例的初始化 .

    结构体实例(包括共用体)和类实例的初始化方法完全相同,二者都可以应用于继承层次中.不同点是结构体(包括共用体)默认成员为public,而类默认成员是private型的. 一.若类和结构体所有数据成员均 ...

最新文章

  1. Centos7 下安装VIM编辑器
  2. IE后退按钮过期原因
  3. 利用OpenCV的imread将RGB图像转化为灰度图像
  4. Python vaptcha手势人机验证码识别
  5. jmeter 取json值_JMeter中JSON数据处理
  6. mitmproxy抓包 | Python疑难测试场景mock
  7. linux在电子信息工程行业中的应用,电子信息工程概述论文
  8. Byshell:无进程无DLL无硬盘文件无启动项
  9. Visual Studio中View页面与Js页面用快捷键互相跳转
  10. OpManager网络管理系统
  11. 动手学深度学习pytorch入门
  12. Java对接微信支付预下单
  13. 智能枕头里究竟藏有什么“智能”故事?
  14. 软件产品选型测试/POC测试
  15. 怎么查看自己云服务器信息吗,怎么查看自己云服务器信息吗
  16. 有五万块钱,在农村养牛怎么样?能养多少头牛?
  17. HDU 1984 ZOJ 2987 Misspelling(模拟)
  18. 关于小电脑研制与经营的研究报告
  19. 电磁中间继电器DZJ-206/220VAC
  20. 数学速算法_中小学数学神奇速算法,孩子吃透,运算能力提升快!

热门文章

  1. 婴儿患小儿脐疝肚子鼓起 父亲竟一刀划开肚脐“放气”
  2. python pandas dataframe drop_duplicates 去重
  3. 菌群在发酵过程中如何动态演替
  4. 如何用python实时监控股票,并且持续扫描大盘?
  5. Windows 无法设置xxx的密码,原因是:工作站服务没有启动 或 密码不满足密码策略的要求
  6. 二维码 生成和解析
  7. asp执行cmd实例
  8. 推荐一个程序员业余写的小说
  9. ZFS管理手册:第三章ZIL
  10. jsp+ssm计算机毕业设计宾馆客房管理系统【附源码】