硬盘主引导扇区引导程序
硬盘主引导扇区的引导程序只占139个字节(不同版本的Fdisk、不同的分区程序写入的主引导记录会不相同,但其基本功能一样),经过反汇编后的引导程序的汇编代码如下:
1000:0600 FA CLI ;自举,将0000:7C00开始的硬盘主引导记录本身转移到0000:0600处,空出0000:7C00开始的空间给将读入活动分区的操作系统的引导扇区 1000:0601 33C0 XOR AX,AX 1000:0603 8ED0 MOV SS,AX 1000:0605 BC007C MOV SP,7C00 1000:0608 8BF4 MOV SI,SP 1000:060A 50 PUSH AX 1000:060B 07 POP ES 1000:060C 50 PUSH AX 1000:060D 1F POP DS 1000:060E FB STI 1000:060F FC CLD 1000:0610 BF0006 MOV DI,0600 1000:0613 B90001 MOV CX,0100 1000:0616 F2 REPN2 1000:0617 A5 MOVSW 1000:0618 EA1D060000 JMP 0000:061D 1000:061D BEBE07 MOV SI,07BE ;SI指向第一硬盘分区表 1000:0620 B304 MOV BL,04 ;硬盘分区表个数送往BL处 1000:0622 803C80 CMP BYTE PTR[SI],80 ;SI所指分区是活动分区 1000:0625 740E JZ 0635 ;是,转0635 1000:0627 803C00 CMP BYTE PTR[SI],00 ;否,分区标志字节是00 1000:062A 751C JNZ 0648 ;否,转显示错误信息 1000:062C 83C610 ADD SI,+10 ;是,SI加16以检查下一个分区 1000:062F FECB DEC BL ;计数器减一 1000:0631 75EF JNZ 0622 ;计数器不为0,转0622 1000:0633 CD18 INT 18 ;没有活动分区就启动ROM BASIC 1000:0635 8B14 MOV DX,[SI] 1000:0637 8B4C02 MOV CX,[SI+02] ;若找到了活动分区,则将该分区的起始磁头、柱面、扇区号送DX和CX 1000:063A 8BEE MOV BP,SI ;将活动分区起始位置保存到BP 1000:063C 83C610 ADD SI,+10 ;SI指向下一分区 1000:063F PECB DEC BL ;计数器减一 1000:0641 741A JZ 065D ;分区检测完毕,转读系统引导区 1000:0643 803C00 CMP BYTE PTR[SI],00 ;否则,检查分区标志字节00 1000:0646 74F4 JZ 063C ;是,转而检测下一分区 1000:0648 BE8B06 MOV SI,068B ;否,显示错误信息 1000:064B AC LODSB 1000:064C 3C00 CMP AL,00 ;错误信息显示完毕 1000:064E 740B JZ 065B ;是,循环 1000:0650 56 PUSH SI ;否,继续显示错误信息 1000:0651 BB0700 MOV BX,0007 1000:0654 B40E MOV AH,0E ;显示一个字符 1000:0656 CD10 INT 10 1000:0658 5E POP SI 1000:0659 EBF0 JMP 064B 1000:065B EBFE JMP 065B ;循环 1000:065D BF0500 MOV DI,0005 ;5送计数器DI,最多读盘五次 1000:0660 BB007C MOV BX,7C00 ;将活动分区中的系统引导扇区读入0000:7C00处 1000:0663 B80102 MOV AX,0201 1000:0666 57 PUSH DI 1000:0667 CD13 INT 13 1000:0669 5F POP DI 1000:066A 730C JNB 0678 ;读盘成功转0678 1000:066C 33C0 XOR AX,AX ;否则,磁盘复位 1000:066E CD13 INT 13 1000:0670 4F DEC DI ;计数器减一 1000:0671 75ED JNZ 0660 ;计数器不为0,转重新读盘 1000:0673 BEA306 MOV SI,06A3 ;计数器为0,转显示信息"Error loading operating system" 1000:0676 EBD3 JMP 064B 1000:0678 BEC206 MOV SI,06C2 ;SI指向"Missing operating system",DI指向自举标志 1000:067B BFFE7D MOV DI,7DFE 1000:067E 813D55AA CMP WORD PTR[DI],AA55 ;自举标志是AA55 1000:0682 75C7 JNZ 064B ;否,显示错误信息 1000:0684 8BF5 MOV SI,BP ;是,恢复活动分区指针到SI 1000:0686 EA007C0000 JMP 0000:7C00 ;转去执行活动分区的系统引导程序
从上面的汇编程序可以看出,主引导程序在寻找活动分区标记"80"的同时,也判断非活动分区的标记是否为"00",如果两者都不是,系统就会报错。当所有分区检查完毕以后,就将系统控制权交给活动分区的引导记录DBR,通过一步一步地程序调入和交接,完成整个系统的引导过程。当然,也有一些磁盘的主引导程序首先检查是否有标记"55AA",然后才查找分区表。