第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