• 硬盘主引导扇区引导程序


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

  • 相关阅读:
    Python实例1-Collatz 序列
    Git 教程
    python 算法基础
    认识 flask框架 及 介绍
    python 虚拟环境
    Numpy基本操作学习
    Jupyter Notebook 快捷键指南
    Gallery——Matplotlib
    list.pop()函数操作头部与尾部的计时试验
    list 与 dict 的in操作比较试验
  • 原文地址:https://www.cnblogs.com/jiu0821/p/4450391.html
Copyright © 2020-2023  润新知