第6天 分割编译与中断处理

第6天 分割编译与中断处理2020.3.311. 分割源文件(harib03a)开发至昨天,bootpack.c的长度已经有将近300行了。一个源文件太长可不是一件好事情。 因此,需要将bootpack.c分割成为几部分。源文件分割的利与弊:优点:按照处理内容进行分类,如果分得好,将来修改时,可维护性高。如果Makefile写得好,只需要编译修改过的文件,就可以提高ma...
摘要由CSDN通过智能技术生成

第6天 分割编译与中断处理

2020.3.31

1. 分割源文件(harib03a)

  • 开发至昨天,bootpack.c的长度已经有将近300行了。一个源文件太长可不是一件好事情。 因此,需要将bootpack.c分割成为几部分。

  • 源文件分割的利与弊:

    • 优点:
      • 按照处理内容进行分类,如果分得好,将来修改时,可维护性高。
      • 如果Makefile写得好,只需要编译修改过的文件,就可以提高make的速度。
      • 单个源文件都不长。多个小文件对程序员的友好性比一个大文件好得多。
      • 看起来很酷
    • 缺点:
      • 源文件数量增加
      • 分类分不好反而增加寻找代码的难度
  • 我们根据功能进行如下分割:

  • 注意,做了如上分割以后,graphic.c如果想用naskfunc.nas定义的函数,那么就需要像bootpack.c一样加上声明。虽然bootpack.c里面有这些的声明,但是在编译graphic.c的时候,编译器并不知道有bootpack.c的存在。

  • 修改Makefile

    • 源文件的编译流程应该是这样的:

      (bootpack.c->bootpack.obj的完整过程是:bootpack.c->bootpack.gas->bootpack.nas->bootpack.obj)

    • 变成bootpack.bim以后就和原来的流程差不多了。
      (bootpack.bim->boopack.hrb->haribote.sys->haribote.img)

  • make run没有发生错误。

2. 整理Makefile(harib03b)

  • 修改Makefile以后,Makefile又变得太长了。

  • graphic.c->graphic.obj、dsctbl.c->dsctbl.obj和bootpack.c->bootpack.的编译过程十分相似。

  • 使用一般规则归纳(Makefile节选):

    %.gas : %.c Makefile
        $(CC1) -o $*.gas $*.c
    
    %.nas : %.gas Makefile
        $(GAS2NASK) $*.gas $*.nas
    
    %.obj : %.nas Makefile
        $(NASK) $*.nas $*.obj $*.lst
    
  • 注意:make.exe会先寻找普通生成的规则,如果没有找到,就会尝试使用一般规则。所以,一般规则和普通生成规则有冲突也没问题。普通规则优先级比一般规则高。

  • Makefile变短了。此时make run没有问题。

3. 整理头文件(harib03c)

  • 源文件行数如下:

    • graphic.c 187行
    • dsctbl.c 67行
    • bootpack.c 81行
    • 合计 335行
  • 显然,三个源文件的行数比原先的一个源文件行数280行多了不少。

  • 使用头文件bootpack.h将函数声明归纳起来,这样就可以去除掉重复的部分了。

    /* asmhead.nas */
    struct BOOTINFO { /* 0x0ff0-0x0fff */
        char cyls; /* 启动区读硬盘读到何处位置 */
        char leds; /* 启动时键盘的LED状态 */
        char vmode; /* 显卡模式为多少位色彩 */
        char reserve; /*保留位*/
        short scrnx, scrny; /* 屏幕分辨率 */
        char *vram;
    };
    #define ADR_BOOTINFO	0x00000ff0 /*BOOTINFO在内存中的起始地址*/
    
    /* naskfunc.nas */
    void io_hlt(void);
    void io_cli(void);
    void io_out8(int port, int data);
    int io_load_eflags(void);
    void io_store_eflags(int eflags);
    void load_gdtr(int limit, int addr);
    void load_idtr(int limit, int addr);
    
    /* graphic.c */
    void init_palette(void);
    void set_palette(int start, int end, unsigned char *rgb);
    void boxfill8(unsigned char *vram, int xsize, unsigned char c, int x0, int y0, int x1, int y1);
    void init_screen8(char *vram, int x, int y);
    void putfont8(char *vram, int xsize, int x, int y, char c, char *font);
    void putfonts8_asc(char *vram, int xsize, int x, int y, char c, unsigned char *s);
    void init_mouse_cursor8(char *mouse, char bc);
    void putblock8_8(char *vram, int vxsize, int pxsize,
        int pysize, int px0, int py0, char *buf, int bxsize);
    #define COL8_000000		0
    #define COL8_FF0000		1
    #define COL8_00FF00		2
    #define COL8_FFFF00		3
    #define COL8_0000FF		4
    #define COL8_FF00FF		5
    #define COL8_00FFFF		6
    #define COL8_FFFFFF		7
    #define COL8_C6C6C6		8
    #define COL8_840000		9
    #define COL8_008400		10
    #define COL8_848400		11
    #define COL8_000084		12
    #define COL8_840084		13
    #define COL8_008484		14
    #define COL8_848484		15
    
    /* dsctbl.c */
    struct SEGMENT_DESCRIPTOR {
        short limit_low, base_low;
        char base_mid, access_right;
        char l
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值