硬盘主引导扇区引导程序

  硬盘主引导扇区的引导程序只占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",然后才查找分区表。

posted @ 2015-04-23 14:10  jiu~  阅读(1890)  评论(0编辑  收藏  举报