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

试用结构体:
      结构体的好处是,可以将各个参数一股脑传递进去,而没有结构体则需要一个一个传递。
一个灵光一闪: 原来一个大的软件,所有源文件全部编译进去成为一个整体存放在内存里,假如文件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.

     
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值