---- 整理自狄泰软件唐佐林老师课程
文章目录
- 1. BootLoader内存布局
- 2. 通过FAT表加载文件内容
- 3. 编程实验:Loader文件内容的加载
- 4. 第一个Loader程序
- 4.1 汇编小贴士:标志寄存器
- 4.2 编程实验:控制权转移
- 5. 小结
1. BootLoader内存布局
2. 通过FAT表加载文件内容
for(int i=0, j=re.DIR_FstClus; j<0xFF7; i+=512, j=vec[j])
{
qDebug() << j;
file.seek(rf.BPB_BytsPerSec * (33 + j - 2));
in.readRawData(buf, sizeof(buf));
for(uint k=0; k<sizeof(buf); k++)
{
if( count < ret.size() )
{
ret[i+k] = buf[k];
count++;
}
}
}
3. 编程实验:Loader文件内容的加载
- 实验步骤:
- 在虚拟软盘中创建 体积较大的文本文件(Loader)
- 将Loader的内容(这里直接在loader.bin中复制boot.asm文件的内容)加载到 BaseOfLoader 地址处
- 打印Loader中的文本(判断加载是否完全)
【参看链接】:09 - 主引导程序控制权的转移 / 09 / 00test_boot_load
4. 第一个Loader程序
- 起始地址:0x9000(
org 0x9000
) - 目标:通过 int 0x10 在屏幕上打印字符串(以此来验证Loader被加载)
print:
mov al, [si]
add si, 1
cmp al, 0x00
je last
mov ah, 0x0E
mov bx, 0x0F
int 0x10
jmp print
last:
; ...
4.1 汇编小贴士:标志寄存器
- 当运算结果为0时,ZF位的值为1
- jxx代表了一个指令族,功能是根据标志位进行调整
- jo 当OF为1则跳转
- jc 当CF为1则跳转
- jns 当SF不为1则跳转
- jz 当ZF为1则跳转
- je 比较结果为相等则跳转(即:jz)
- ……
- jxx代表了一个指令族,功能是根据标志位进行调整
4.2 编程实验:控制权转移
【参看链接】:09 - 主引导程序控制权的转移 / 09 / 01Loader
将loader拷贝到虚拟软盘,从boot跳转到loader执行。loader中是打印“Hello, D.T.OS!”:
data.img插入到vmware中运行结果如下:
5. 小结
- Boot需要重构保证在512字节内完成功能
- 在汇编程序中尽量确保函数调用前后通用寄存器的状态不变
- Boot成功加载Loader之后将控制权转移
- Loader程序没有代码体积上的限制