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

    这一节讲的最出彩的地方是c语言的地址。

    而要理清c语言地址,又必须追根溯源,看看汇编里内存地址的使用。

    MOV AL,0X15
    MOV [1024],AL
    
    MOV BYTE[1024],0X15

    这两种指令效果相同,都是在这个内存地址里存入一个数据,而学过汇编的我们知道,直接往内存某地址存入数据时,要说明填入的数据大小,或者说数据类型,不然机器不知道怎么填入该数据,到底是按照8位填入,还是十六位填入。因此,这个byte必不可少,而前面的指令,由于AL已经明确了是八位,因此不用说明。

    好了,接下来说c语言中的地址。

    c语言中,char是八位,short是16位,int是32位,如果要实现上面的功能,则先要确定地址中内容的数据类型。

    char *p;
    int i=1024;
    p = (char *) i;
    *p = 0x15;

    要注意的是,c语言的指针是无法直接赋值地址的,必须在定义其值前将地址单独赋值。

    知道了这点,c语言中的数组也不再神秘,如同城里人变村姑。

    写过一些算法题的同学都知道,定义一个数组后,数组名相当于指向该数组首地址的指针,而如今就算不定义数组,同样可以进行数组的基本操作。

    int *p;
    p=(char *) 0xa000;
    for(int =0;i<5;i++)
    {
        p[i]=3;
    }

    这竟然是可以运行的(当然,大家不要乱试,这个地址我是瞎写的)!其实这也不是什么奇技淫巧,反而不太安全,毕竟,内存里的地址你不能拿来就用,因此,数组一般是调用数组构造函数,由系统给你分配。

    emmm。。。

    这篇日志的主题是操作系统,结果说了这么多地址的事,切回正题。

    第四天的任务主要是用汇编写了一些供c语言调用的api,也就是往特定地址里面存入数据(前面已经介绍了),通过这些api来实现屏幕显示的功能。

    当前画面中,有320*200(62000)个像素,这些像素自然是以数据形式保存在内存中的,起点地址为0xa0000,每一个点的坐标可以看作二维数组,按照内存中保存的规律,点的坐标对应的内存地址应为0xa0000+x+y*320;通过给每一个点填入像素,由点成线,由线成面,这样就能画出一个桌面,虽然这里用画这个字看上去有点low,不过底层的屏幕显示就是这样,有点强行显示,蛮干的感觉,封装之后才能有多种功能嘛。

  • 相关阅读:
    windbg学习.expr和masm表达式
    ThisCall调用分析
    windbg学习 gc j(Execute IfElse).if
    windbg学习¥{} Alias Interpreter 别名解释器
    windbg学习!vadump和.hh和!vprotc
    windbg学习 .lines
    windbg学习条件断点
    $<, $><, $$<, $$><, $$>a< (Run Script File)
    windbg学习?? 和 ?
    vimbook–OPL –official publications library
  • 原文地址:https://www.cnblogs.com/puffmoff/p/8530369.html
Copyright © 2011-2022 走看看