1、引导扇区的识别:
org 07c00h
jmp short LABEL_START ; Start to boot. nop ; 这个 nop 不可少
; 下面是 FAT12 磁盘的头 BS_OEMName DB 'ForrestY' ; OEM String, 必须 8 个字节 BPB_BytsPerSec DW 512 ; 每扇区字节数 BPB_SecPerClus DB 1 ; 每簇多少扇区 BPB_RsvdSecCnt DW 1 ; Boot 记录占用多少扇区 BPB_NumFATs DB 2 ; 共有多少 FAT 表 BPB_RootEntCnt DW 224 ; 根目录文件数最大值 BPB_TotSec16 DW 2880 ; 逻辑扇区总数 BPB_Media DB 0xF0 ; 媒体描述符 BPB_FATSz16 DW 9 ; 每FAT扇区数 BPB_SecPerTrk DW 18 ; 每磁道扇区数 BPB_NumHeads DW 2 ; 磁头数(面数) BPB_HiddSec DD 0 ; 隐藏扇区数 BPB_TotSec32 DD 0 ; 如果 wTotalSectorCount 是 0 由这个值记录扇区数 BS_DrvNum DB 0 ; 中断 13 的驱动器号 BS_Reserved1 DB 0 ; 未使用 BS_BootSig DB 29h ; 扩展引导标记 (29h) BS_VolID DD 0 ; 卷序列号 BS_VolLab DB 'Tinix0.01 '; 卷标, 必须 11 个字节 BS_FileSysType DB 'FAT12 ' ; 文件系统类型, 必须 8个字节
LABEL_START: mov ax, cs mov ds, ax mov es, ax Call DispStr ; 调用显示字符串例程 jmp $ ; 无限循环DispStr: mov ax, BootMessage mov bp, ax ; ES:BP = 串地址 mov cx, 16 ; CX = 串长度 mov ax, 01301h ; AH = 13, AL = 01h mov bx, 000ch ; 页号为0(BH = 0) 黑底红字(BL = 0Ch,高亮) mov dl, 0 int 10h ; int 10h retBootMessage: db "Hello, OS world!"times 510-($-$$) db 0 ; 填充剩下的空间,使生成的二进制代码恰好为512字节dw 0xaa55 ; 结束标志
2、.img文件用UltraEdit文件查看。向里面写boot.bin文件内容时,就把FAT12的标识写到前512
在1fe 处有“55AA”结束标记
3、但boot.bin写入成功后,用虚拟机打开。可以向里面写入文件与目录。
目录与文件一样。占用一个簇。这个簇的内容为目录内文件的簇位置。
一个簇是一个FATentry 有12B组成。
FFF为结束标志 FF 0F F0 FF 都可能成为文件只占用一个簇的内容。但是如果一个文件占用几个簇。
那就由簇的内容决定下一个簇的位置。。00 F1 FF 这些内容用软件看一下就明白许多了。
4、RootDirSectors=((BPB_RootEntCnt * 32 )/ BPB_BytsPerSec 224 * 32 /512 =14
根目录区开始与数据区就要开始计算了。 如第2簇的内容为 (19+14)* 512 = 16896 (0x4200)
第3簇内容就在(20+14)*512 = 17408 (0x4400) 如果有变化。就得变14 其它还在研究中。。
补充中。。。。