分割编译与中断处理
1. 分割源文件
分割文件的优劣:
优 | 劣 |
---|---|
(1)按照处理内容进行分类,如果分的好的话,将来进行修改时,容易找到地方。 | (5)源文件数量增加。 |
(2)如果Makefile写的好,只需要编译修改过的文件,就可以提高make的速度。 | (6)分类分得不好的话,修改时不容易找到地方。 |
(3)单个源文件都不长,多个小文件比大文件好处理。 | |
(4)看起来很酷。 |
Bootpack.c的分割:
Makefile根据bootpack.c的分割后应增加的功能:
2/3. 整理Makefile/头文件
make.exe会首先寻找普通的生成规则如果没有找到,就尝试用一般规则。普通生成规则要优于一般规则。
将c文件里重复的声明添加到.h头文件中,然后在其余.c文件中增加#include “bootpack.h”表示告诉编译器,这里要替换成指定的内容,然后进行编译。
头文件名用(”“)表示该头文件与源文件位于同一个文件夹里,而尖括号(<>)则表示该头文件位于编译器所提供的文件夹里。
4. 意犹未尽
这个函数用来将指定的段上限(limit)和地址赋值给名为GDTR的48位寄存器。给GDTR赋值唯一的办法是指定一个内存地址,从指定的地址读取6个字节(48位),然后赋值给GDTR寄存器,完成这一任务的就是LGDT。
该寄存器的低16位(即内存的最初2个字节)是段上限,它等于“GDT的有效字节数-1”。今后我们还会偶尔用到上限这个词,意思都是表示量的大小,一般为“字节数-1”剩下的高32位(即剩余的4个字节),代表GDT的开始地址。
DWORD[ESP+4]里存放段上限(0x0000ffff),DWORD[ESP+8]里存放地址(0x00270000)。若是按字节写出来就成了FF FF 00 00 00 27 00 00。
为了执行LGDT,作者希望把它们排列成[FF FF 00 27 00 00]的样子。所以就先”MOV AX, [ESP+4]”读取最初的0xffff,然后再写到[ESP+6]里。结果就成了[FF FF FF FF 00 27 00 00],如果从[ESP+6]开启读6个字节的话正好是想要的结果,即如下图:
naskfunc.nas的_load_idtr对IDTR的设置与GDTR类似。
另外GDT,LDT,GDTR,LDTR 的详解可以在这里看到: