zoukankan      html  css  js  c++  java
  • 30天自制操作系统读书笔记(五)

    为了让程序灵活点,作者觉得把什么320X200这些数据直接写入程序,不如让程序自己获取。

    所以就引入了结构体,指针。用指针直接在内存中获取这些数据

    (如程序里的这句:
    
    Binfo_scrnx = (short *) 0xff4;
    
    )。

    对于结构体和指针我就不细写了,有C语言基础的人都知道。

    因为已经进入了32位模式,所以不能再用bios写好的中断程序给我们输出字符了,要手动了!

    用像素点描出图形。

    字符可以使用8X16的长方形像素点来表示,转变为16进制就是这样:

         

        static char font_A[16] = {
    
                       0x00, 0x18, 0x18, 0x18, 0x18, 0x24, 0x24, 0x24,
    
                       0x24, 0x7e, 0x42, 0x42, 0x42, 0xe7, 0x00, 0x00
    
             };

    有了这些内容,就可以使用for循环,来描绘字符了。

    二维屏幕和一维的地址换算关系如下: 

    addr = 0xa0000 + x + y * 320
    void putfont8(char *vram, int xsize, int x, int y, char c, char *font)
    
    //vram就是0xa0000 ,xsize就是320,然后x,y就是屏幕的坐标。
    for (i = 0; i < 16; i++) {
    
                  p = vram + (y + i) * xsize + x;
    
                  d = font[i];
    
                  if ((d & 0x80) != 0) { p[0] = c; }
    
                  if ((d & 0x40) != 0) { p[1] = c; }
    
                  if ((d & 0x20) != 0) { p[2] = c; }
    
                  if ((d & 0x10) != 0) { p[3] = c; }
    
                  if ((d & 0x08) != 0) { p[4] = c; }
    
                  if ((d & 0x04) != 0) { p[5] = c; }
    
                  if ((d & 0x02) != 0) { p[6] = c; }
    
                  if ((d & 0x01) != 0) { p[7] = c; }
    
           }

    0x80换成二进制就是10000000

    0x40 就是01000000  这个循环的意思就显而易见了。

    它就是判断8位到底哪几个位要打印。

    比如: 11111000 先和100000000 进行与操作 那就是 10000000然后p[0]就被描绘上了颜色。

    因为字符串太多,自己一个个设计过于麻烦,所以作者引入了一个字体。  hankaku.txt

    他通过编译器编译会产生二进制文件,和我们之前描述A的差不多,然后一共是4096个字节。

    那么就可以在C语言里使用这个文件了 :

            

     Extern char hankaku[4096];

    其中字符都是按照顺序排列的,A这个字符位于第65个位置。我们知道每个字节占了16位

    所以A就在hankaku[65*16]这里开始! 也就是书上的0x41*16也就是 ‘A’*16

    作者进一步封装,写了能处理字符串的函数。

    接着又介绍了 sprintf。

    接下来画出鼠标的过程和上面如出一辙。

    对于GDT,IDT的介绍留到明天吧!

  • 相关阅读:
    web自动化框架如何设计
    如何保证元素定位的成功率(等待机制)
    验证码问题处理
    selenium元素定位
    网路知识总结(session&&Cookie&&三次握手&&请求头)
    python中方法的总结
    Twelve Day 检测大写字母
    超过5名学生的课(SQL语句)
    The Eleven Day 删除排序数组中的重复项
    删除重复的电子邮箱(SQL语句)
  • 原文地址:https://www.cnblogs.com/You0/p/4442372.html
Copyright © 2011-2022 走看看