MBR引导代码分析
- 格式:pdf
- 大小:175.61 KB
- 文档页数:8
硬盘主引导记录(MBR)及其结构详解硬盘的0柱面、0磁头、1扇区称为主引导扇区,FDISK程序写到该扇区的内容称为主引导记录(MBR)。
该记录占用512个字节,它用语硬盘启动时将系统控制权交给用户指定的,并在分区表中登记了的某个操作系统区。
1.MBR的读取硬盘的引导记录(MBR)是不属于任何一个操作系统,也不能用操作系统提供的磁盘操作命令来读取它。
但我们可以用ROM-BIOS中提供的INT13H的2号功能来读出该扇区的内容,也可用软件工具Norton8.0中的DISKEDIT.EXE来读取。
用INT13H的读磁盘扇区功能的调用参数如下:入口参数:AH=2 (指定功能号)AL=要读取的扇区数DL=磁盘号(0、1-软盘;80、81-硬盘)DH=磁头号CL高2位+CH=柱面号CL低6位=扇区号CS:BX=存放读取数据的内存缓冲地址出口参数:CS:BX=读取数据存放地址错误信息:如果出错CF=1 AH=错误代码用DEBUG读取位于硬盘0柱面、0磁头、1扇区的操作如下:A>DEBUG-A 100XXXX:XXXX MOV AX,0201 (用功能号2读1个扇区)XXXX:XXXX MOV BX,1000 (把读出的数据放入缓冲区的地址为CS:1000)XXXX:XXXX MOV CX,0001 (读0柱面,1扇区)XXXX:XXXX MOV DX,0080 (指定第一物理盘的0磁头)XXXX:XXXX INT 13XXXX:XXXX INT 3XXXX:XXXX (按回车键)-G=100 (执行以上程序段)-D 1000 11FF (显示512字节的MBR 内容)2.MBR 的组成一个扇区的硬盘主引导记录MBR 由如图6-15所示的4个部分组成。
·主引导程序(偏移地址0000H--0088H ),它负责从活动分区中装载,并运行系统引导程序。
·出错信息数据区,偏移地址0089H--00E1H 为出错信息,00E2H--01BDH 全为0字节。
硬盘主引导记录(MBR)及其结构详解hbrqlpf 于 2008-10-01 21:14:00 发布14569 收藏 5 文章标签:扩展磁盘代码分析任务活动basic硬盘的0柱面、0磁头、1扇区称为主引导扇区,FDISK程序写到该扇区的内容称为主引导记录(MBR)。
该记录占用512个字节,它用于硬盘启动时将系统控制权交给用户指定的,并在分区表中登记了的某个操作系统区。
1.MBR的读取硬盘的引导记录(MBR)是不属于任何一个操作系统,也不能用操作系统提供的磁盘操作命令来读取它。
但我们可以用ROM-BIOS中提供的INT13H的2号功能来读出该扇区的内容,也可用软件工具Norton8.0中的DISKEDIT.EXE来读取。
用INT13H的读磁盘扇区功能的调用参数如下:入口参数:AH=2 (指定功能号)AL=要读取的扇区数DL=磁盘号(0、1-软盘;80、81-硬盘)DH=磁头号CL高2位+CH=柱面号CL低6位=扇区号CS:BX=存放读取数据的内存缓冲地址出口参数:CS:BX=读取数据存放地址错误信息:如果出错CF=1 AH=错误代码用DEBUG读取位于硬盘0柱面、0磁头、1扇区的操作如下:A>DEBUG-A 100XXXX:XXXX MOV AX,0201 (用功能号2读1个扇区)XXXX:XXXX MOV BX,1000 (把读出的数据放入缓冲区的地址为CS:1000)XXXX:XXXX MOV CX,0001 (读0柱面,1扇区)XXXX:XXXX MOV DX,0080 (指定第一物理盘的0磁头)XXXX:XXXX INT 13XXXX:XXXX INT 3XXXX:XXXX (按回车键)-G=100 (执行以上程序段)-D 1000 11FF (显示512字节的MBR内容)2.MBR的组成一个扇区的硬盘主引导记录MBR由4个部分组成。
主引导程序(偏移地址0000H--0088H),它负责从活动分区中装载,并运行系统引导程序。
硬盘主引导记录(MBR)及其结构详解硬盘的0柱面、0磁头、1扇区称为主引导扇区,FDISK程序写到该扇区的内容称为主引导记录(MBR)。
该记录占用512个字节,它用语硬盘启动时将系统控制权交给用户指定的,并在分区表中登记了的某个操作系统区。
1.MBR的读取硬盘的引导记录(MBR)是不属于任何一个操作系统,也不能用操作系统提供的磁盘操作命令来读取它。
但我们可以用ROM-BIOS中提供的INT13H的2号功能来读出该扇区的内容,也可用软件工具Norton8.0中的DISKEDIT.EXE 来读取。
用INT13H的读磁盘扇区功能的调用参数如下:入口参数:AH=2 (指定功能号)AL=要读取的扇区数DL=磁盘号(0、1-软盘;80、81-硬盘)DH=磁头号CL高2位+CH=柱面号CL低6位=扇区号CS:BX=存放读取数据的内存缓冲地址出口参数:CS:BX=读取数据存放地址错误信息:如果出错CF=1 AH=错误代码用DEBUG读取位于硬盘0柱面、0磁头、1扇区的操作如下:A>DEBUG-A 100XXXX:XXXX MOV AX,0201 (用功能号2读1个扇区)XXXX:XXXX MOV BX,1000 (把读出的数据放入缓冲区的地址为CS:1000)XXXX:XXXX MOV CX,0001 (读0柱面,1扇区)XXXX:XXXX MOV DX,0080 (指定第一物理盘的0磁头)XXXX:XXXX INT 13XXXX:XXXX INT 3XXXX:XXXX (按回车键)-G=100 (执行以上程序段)-D 1000 11FF (显示512字节的MBR内容)2.MBR的组成一个扇区的硬盘主引导记录MBR由如图6-15所示的4个部分组成。
·主引导程序(偏移地址0000H--0088H),它负责从活动分区中装载,并运行系统引导程序。
·出错信息数据区,偏移地址0089H--00E1H为出错信息,00E2H--01BDH全为0字节。
硬盘主引导扇区(MBR、DPT、DBR、BPB)详解.txt“恋”是个很强悍的字。
它的上半部取自“变态”的“变”,下半部取自“变态”的“态”。
硬盘主引导扇区(MBR、DPT、DBR、BPB)详解引用:网上收集的资料,放到这里来学习,这方面登山人大哥是高手,有空指点一下喽硬盘的0柱面、0磁头、1扇区称为主引导扇区(也叫主引导记录MBR),该记录占用512个字节,它用于硬盘启动时将系统控制权转给用户指定的、在分区表中登记了某个操作系统分区。
MBR的内容是在硬盘分区时由分区软件(如FDISK)写入该扇区的,MBR不属于任何一个操作系统,不随操作系统的不同而不同,即使不同,MBR也不会夹带操作系统的性质,具有公共引导的特性。
但安装某些多重引导功能的软件或LINUX的LILO时有可能改写它;它先于所有的操作系统被调入内存并发挥作用,然后才将控制权交给活动主分区内的操作系统(图一)。
MBR由三部分构成:1.主引导程序代码,占446字节2.硬盘分区表DPT,占64字节3.主引导扇区结束标志AA55H一、硬盘的主引导程序代码是从偏移0000H开始到偏移01BDH结束的446字节;主引导程序代码包括一小段执行代码。
启动PC 机时,系统首先对硬件设备进行测试,成功后进入自举程序INT 19H;然后读系统磁盘0柱面、0磁头、1扇区的主引导扇区MBR的内容到内存指定单元0:7C00 首地址开始的区域,并执行MBR程序段。
主引导代码实现下列功能:1.扫描分区表查找活动分区;2.寻找活动分区的起始扇区;3.将活动分区的引导扇区读到内存;4.执行引导扇区的运行代码。
如果主引导代码未完成这些功能,系统显示下列错误信息:Invalid partition tableError loading operating systemMissing operating system二、硬盘分区表DPT是从偏移01BEH开始到偏移01FDH结束的64字节(图二);硬盘分区表分为四小部分,每一小部分表示一个分区的信息,占16字节。
MBR代码分析;MBR.ASM; MASM MBR; LINK MBR; EXE2BIN MBR.MODEL tiny.CODE;设置寄存器及堆栈值org 0Head:Start:clixor ax,axmov ss,axmov sp,7C00H ;ss:sp=0:7C00Hmov si,sppush axpop espush axpop ds ;es=ds=0sti;将程序代码由0:7C00H移动到0:0600H处cldmov di,600Hmov cx,100H ;100H Words=512 Bytes,即一个扇区大小repne movswdb 0EA H ;这个是FAR JUMP的机器码dw offset Continue+600H, 0000H ;这个是跳转目的地址,即0:061DH ;搜索可引导分区Continue:mov si,600H+1BEH ;si指向分区表mov bl,4 ;四个分区FindBoot:FindBoot:cmp byte ptr[si],80Hje SaveRec ;读扇区位置cmp byte ptr[si],0jne Invaild ;无效分区add si,10Hdec bljnz FindBootint 18H ;进入ROM BASIC;读取引导分区的扇区,柱面号SaveRec:mov dx,[si]mov cx,[si+2]mov bp,si;检查其余分区表FindNext:add si,10Hdec bljz SetReadcmp byte ptr[si],0 ;是否存在非法分区je FindNextInvaild:mov si,offset ErrMsg1+600H;字符串输出子程序PrintStr:lodsbcmp al,0je DeadLockpush simov bx,7mov ah,0EH ;输出字符int 10Hpop sijmp short PrintStr ;下一字符DeadLock:jmp short DeadLock ;无穷循环,也可以写成jmp $ ;读引导扇区SetRead:mov di,5 ;读取次数ReadBoot:mov bx,7C00Hmov ax,201Hpush diint 13H ;cx,dx已经在SaveRec处得到pop dijnc GoBoot ;成功则启动xor ax,axint 13H ;reset驱动器,然后再读取dec dijnz ReadBootmov si,offset ErrMsg2+600Hjmp short PrintStr 失败输出信息,并进入无穷循环;检查读入的引导扇区GoBoot:mov si,offsetErrMsg3+600Hmov di,7C00H+1FEHcmp word ptr[di],0AA55Hjne PrintStr ;非AA55标志则输出错误信息mov si,bp ;si指向可启动分区db 0EA H,0,7CH,0,0 ;跳转至0:7C00HErrMsg1 db 'Invaild partition table',0ErrMsg2 db 'Error loading operating system',0 ErrMsg3 db 'Missing operating system',0Tail:FillNum equ 1BEH-(Tail-Head) ;计算填0数目db FillNum dup(0);四个分区表项数据,跟分区情况有关,详细含义另解PartTable db 80H,1,1,0,4,4,0D1H,2,11H,0,0,0,0FEH,0FFH,0,0db 0,0,0C1H,3,5,4,0D1H,0FEH,0FFH,0FFH,0,0,0ACH,53H,0,0db 20H dup(0)ID dw 0AA55Hend start;如果开始试用org 600H,那么访问数据时就不必加上600H,如mov si,offset ErrMsg2+600H;可写为mov si,offset ErrMsg2,这时就不能用exe2bin得到数据,必须试用debug ;debug mbr.exe;-nmbr.bin;-rcx 200;-wcs:600;-q。
硬盘分区表知识——详解硬盘MBR硬盘是现在计算机上最常用的存储器之一。
我们都知道,计算机之所以神奇,是因为它具有高速分析处理数据的能力。
而这些数据都以文件的形式存储在硬盘里。
不过,计算机可不像人那么聪明。
在读取相应的文件时,你必须要给出相应的规则。
这就是分区概念。
分区从实质上说就是对硬盘的一种格式化。
当我们创建分区时,就已经设置好了硬盘的各项物理参数,指定了硬盘主引导记录(即Master Boot Record,一般简称为MBR)和引导记录备份的存放位置。
而对于文件系统以及其他操作系统管理硬盘所需要的信息则是通过以后的高级格式化,即Format命令来实现。
面、磁道和扇区硬盘分区后,将会被划分为面(Side)、磁道(Track)和扇区(Sector)。
需要注意的是,这些只是个虚拟的概念,并不是真正在硬盘上划轨道。
先从面说起,硬盘一般是由一片或几片圆形薄膜叠加而成。
我们所说,每个圆形薄膜都有两个“面”,这两个面都是用来存储数据的。
按照面的多少,依次称为0 面、1面、2面……由于每个面都专有一个读写磁头,也常用0头(head)、1头……称之。
按照硬盘容量和规格的不同,硬盘面数(或头数)也不一定相同,少的只有2面,多的可达数十面。
各面上磁道号相同的磁道合起来,称为一个柱面(Cylinder)。
上面我们提到了磁道的概念。
那么究竟何为磁道呢?由于磁盘是旋转的,则连续写入的数据是排列在一个圆周上的。
我们称这样的圆周为一个磁道。
如果读写磁头沿着圆形薄膜的半径方向移动一段距离,以后写入的数据又排列在另外一个磁道上。
根据硬盘规格的不同,磁道数可以从几百到数千不等;一个磁道上可以容纳数KB 的数据,而主机读写时往往并不需要一次读写那么多,于是,磁道又被划分成若干段,每段称为一个扇区。
一个扇区一般存放512字节的数据。
扇区也需要编号,同一磁道中的扇区,分别称为1扇区,2扇区……计算机对硬盘的读写,处于效率的考虑,是以扇区为基本单位的。
mbr的组成成分
MBR(MasterBootRecord)是计算机硬盘的第一个扇区,是启动计算机时的重要组成部分。
MBR由三个部分组成:引导代码、分区表和MBR签名。
1.引导代码:MBR的第一扇区被称为MBR引导扇区,该扇区的前446个字节被称为引导代码。
引导代码是一段机器语言程序,用于启动操作系统,并将控制权传递给操作系统的引导程序。
2.分区表:MBR的引导扇区中的下一个部分是分区表。
分区表是一个表格,用于描述硬盘上的分区情况。
MBR最多可以支持4个主分区或3个主分区和1个扩展分区。
每个分区的信息包括分区的起始位置、分区大小、分区类型等。
3.MBR签名:MBR的引导扇区的最后两个字节是MBR签名。
它是一个标志位,用于标识MBR的有效性。
MBR签名的值为0x55AA,表示该MBR是有效的。
总之,MBR是计算机启动过程的重要组成部分,由引导代码、分区表和MBR签名三个部分组成,它们共同协作,保证计算机的正常启动。
- 1 -。
windows 7 的 MBR 分析前话: 引导磁盘的 MBR 由 int 0x19 加载到 0x7c00,int 0x19 最后的工作是 跳到 0x7c00 执行。
一、 我的 bochs 上的 windows 7 的 disk images 介绍在 bochs 上, 我为 windows 7 分配了 10g 的磁盘空间, 这 10g 的分空间, bochs 是这样分配的:cylinders = 20805, heads = 16, spt = 63 cylinders(柱面或道)是 20805,heads(磁头或面)是 16,spt(扇区/柱 面 - 每道扇区数)为 63 那么:磁盘空间为:disk size = cylinders * 63 * heads * 512 = 20805 * 63 * 16 * 512 = 10,737,377,280 bytes = 10g二、硬盘的 MBR(主引导记录)MBR 是位于: 扇区 0 (逻辑扇区) 即: 柱面 0 (0-cylinder) 0 磁头 , (0-head) , 1 扇区(1-sector) 大小为 512 bytes。
整个 MBR 的结构如下:位置(hex) 大小(bytes) 描述000 - 162 162 - 1BD 1BE - 1CD 1CE - 1DD 1DE - 1ED 1EE - 1FD 1FE - 1FF354 bytes 92 bytes 16 bytes 16 bytes 16 bytes 16 bytes 2 bytes硬盘 MBR 引导记录(代码区) MBR 数据区域 分区表 1 分区表 2 分区表 3 分区表 4 MBR 标志(55AA)1、磁盘分区表(Disk Partition Table) 在 MBR 里的后 64 个字节里是磁盘的分区表结构,可定义 4 个分区,每个分 区 16 bytes,从 0x1be ~ 0x1fe 共 64 bytes。
MBR引导代码分析整理:太虚野老用WinHex读MBR,如下:图中3个用红色矩形框框住的是3个字符串(Invalid partition table、Error loading operating system、Missing operating system)的地址相关的,分别是0x12C、0x144、0x 163。
用蓝色矩形框框住的,MBR里面的1B8偏移位置为磁盘签名,该签名由ntldr写入,W indows就是靠这个磁盘签名来确定是从哪块硬盘启动的,如果两个磁盘签名相同了,那么n tldr就会随机更改一块磁盘,但是下次就不会出现这种情况了。
实际MBR的可执行代码到0 x12B处结束。
MBR引导代码的作用就是加载活动分区的引导代码。
用IDA Pro反汇编MBR 后如下(包括分析):;//MBR在系统启动时由BIOS INT 19H自动加载到0000:7c00处,为512个字节.下面这段代码实现把0000:7c1b处MBR代码复制485个字节到0000:061b处,为什么不从0000:7c00开始复制512个到0000:06cc处,因为前面1b 个字节为复制代码,所以忽略.空出的0000:7c00 开始的空间将读入活动分区的操作系统的引导扇区.seg000:0000 33 C0 xor ax, ax ;//ax寄存器清0seg000:0002 8E D0 mov ss, ax ;//栈寄存器ss=0seg000:0004 BC 00 7C mov sp, 7C00h ;//栈指针—SS:SP=0000:7C00seg000:0007 FB sti ;//允许中断seg000:0008 50 push ax ;这条PUSH指令在0008处,前面的8个字节指令已经执行,所以push指令输入的数据覆盖前面的0000-0001空间,没有关系. seg000:0009 07 pop es ;//附加数据段寄存器es=0seg000:000A 50 push ax;seg000:000B 1F pop ds ;//数据段寄存器ds=0seg000:000C FC cld ;//使方向标志寄存器DF=0,规定其后的串操作为正向串操作;把7C1Bh处的长1E5h的代码拷贝到61Bh处seg000:000D BE 1B 7C mov si, 7C1Bh ;//用于movsbseg000:0010 BF 1B 06 mov di, 61Bh ;//用于movsb ,将[DS:SI]中字节传送到[ES:DI]中seg000:0013 50 push ax ;//保存ax,di,用于第001a处指令retf(同ret),使ax->cs,di->ip,实现指令跳转seg000:0014 57 push diseg000:0015 B9 E5 01 mov cx, 1E5h ;//用于rep movsb中的rep,每次cx 减1,到0不执行movsb ,200H-1BH=1E5seg000:0018 F3 A4 rep movsbseg000:001A CB retf ;//相当于pop ip; pop cs,即执行retf指令后跳转到061BH处执行seg000:001B; ---------------------------------------------------------------------------seg000:001B BD BE 07 mov bp, 7BEh ;// 600h+1BEh=7BEh,分区表起始偏移为1BEh,07BEH开始的16个字节是第一个分区表项seg000:001E B1 04 mov cl, 4 ;//硬盘的mbr分区表最多有4个表项,用于loopseg000:0020seg000:0020 loc_10020: ; CODE XREF: seg000:002A↓j seg000:0020 38 6E 00 cmp [bp+0], ch ;//检查分区指示符.cx寄存器前面用movsb减为0,所以ch=0.判断第一个分区表项的第一个字节是否为活动分区,因为cmp是有符号数据比较,如果[bp+0]=80,80H为负数,则其比0小seg000:0023 7C 09 jl short loc_1002E ;//如果是80,活动分区,则跳到002E地址.这里有点问题,如果[bp+0x0]是符号位为1的任意数的话,也是小于0,也会跳到002E地址seg000:0025 75 13 jnz short loc_1003A;//分区指示符不为0就跳转(显示分区表无效)seg000:0027 83 C5 10 add bp, 10h ;//指向下一个表项(每一个表项的长度为10h字节)seg000:002A E2 F4 loop loc_10020 ;//cx不为0就循环;四表项的状态字节都为0就执行ROM BASIC中断.只有IBM个人计算机有Basic包括在ROM中;Int 18h中断服务程序就是启动ROM-Basic,如果没有ROM BASIC,中断18H通常会显示消息 NO ROM BASIC 然后"系统暂停",并且系统中断seg000:002C CD 18 int 18h;//找到活动分区后,还要检查剩余分区的启动标志是否为0;不允许存在多个活动分区seg000:002Eseg000:002E loc_1002E: ; CODE XREF: seg000:0023 j seg000:002E 8B F5 mov si, bpseg000:0030seg000:0030 loc_10030: ; CODE XREF: seg000:0038↓j seg000:0030 83 C6 10 add si, 10h ;//下一个分区表表项seg000:0033 49 dec cx ;//分区表表项数量减1seg000:0034 74 19 jz short loc_1004F ;//如果4个表项都检查完毕就跳转seg000:0036 38 2C cmp [si], ch ;//检查分区指示符是否为0 seg000:0038 74 F6 jz short loc_10030 ;//如果分区指示符是0就跳转检查下一分区,否则分区表是无效的seg000:003Aseg000:003A loc_1003A: ; CODE XR EF: seg000:0025 j seg000:003A A0 B5 07 mov al, ds:7B5h ;// 01B5+0600=7B5h,0x1B5偏移地址处一般为2C,0x12C偏移地址处指向字符串“Invalid partition table”seg000:003Dseg000:003D loc_1003D: ; CODE XREF: seg000:0069↓j seg000:003D B4 07 mov ah, 7 ;//例如:AX=72C,原0x12C偏移地址处指向字符串“Invalid partition table”,012C+0600=72C,即AX指向错误信息seg000:003F 8B F0 mov si, ax ;//si就指向字符串seg000:0041seg000:0041 loc_10041: ; CODE XREF: seg000:004D↓j seg000:0041 AC lodsb ;//读取一个字节到alseg000:0042seg000:0042 loc_10042: ; CODE XREF: seg000:0044↓j seg000:0042 3C 00 cmp al, 0 ;//字符串是否显示完成,MBR中三个错误信息字符串都以00结尾seg000:0044 74 FC jz short loc_10042 ;// 如果字符串显示完成,则进入死循环。
否则如果字符串没有结束,调用10H号中断继续显示字符seg000:0046 BB 07 00 mov bx, 7 ;//BL前景色,这里7为白色seg000:0049 B4 0E mov ah, 0Eh ;//显示字符(光标前移)seg000:004B CD 10 int 10hseg000:004D EB F2 jmp short loc_10041 ;// 读取并显示下一个字符seg000:004F; ---------------------------------------------------------------------------;//如果分区表都是正确的,开始加载活动分区的引导扇区seg000:004Fseg000:004F loc_1004F: ; CODE XREF: seg000:0034 j seg000:004F 88 4E 10 mov [bp+10h], cl ;//bp是指向可引导分区表项的指针,cl为0.将[bp+0x10]标识位的初始值清0。
这个标志表示是否尝试过备份的引导扇区.[bp+10h]的字节肯定是没用的空间seg000:0052 E8 46 00 call sub_1009B ;//加载活动分区的头512字节到7C00H处seg000:0055 73 2A jnb short loc_10081 ;//加载成功就跳转seg000:0057seg000:0057 loc_10057: ; CODE XREF: seg000:008D↓j seg000:0057 FE 46 10 inc byte ptr [bp+10h];//将[bp+0x10]标识位置1,表示已经尝试过加载备份的引导扇区seg000:005A 80 7E 04 0B cmp byte ptr [bp+4], 0Bh ;//0BH:用传统INT 13h就可以访问的FAT32分区seg000:005E 74 0B jz short loc_1006Bseg000:0060 80 7E 04 0C cmp byte ptr [bp+4], 0Ch ;//0CH:需要用扩展INT 13h访问的FAT32分区seg000:0064 74 05 jz short loc_1006Bseg000:0066 A0 B6 07 mov al, ds:7B6h ;// 加载引导扇区失败,显示错误信息.0x1B6+0600=7B6h ,0x1B6偏移地址处一般为44,0x144偏移地址处指向字符串“Error loading operating system”seg000:0069 75 D2 jnz short loc_1003D ;//跳转到此地址将错误信息显示出来(显示完后,系统进入死循环);//如果活动分区是FAT32分区,尝试加载备份的引导扇区.FAT32的备份引导扇区号=引导扇区号+6seg000:006Bseg000:006B loc_1006B: ; CODE XREF: seg000:005E j seg000:006B ; seg000:0064 j seg000:006B 80 46 02 06 add byte ptr [bp+2], 6 ;//分区开始的扇区+6 seg000:006F 83 46 08 06 add word ptr [bp+8], 6 ;//本分区前已用的扇区数低2个字节+6seg000:0073 83 56 0A 00 adc word ptr [bp+0Ah], 0 ;//如果产生进位,将本分区前已用的扇区数高2个字节+1seg000:0077 E8 21 00 call sub_1009Bseg000:007A 73 05 jnb short loc_10081seg000:007C A0 B6 07 mov al, ds:7B6h ;//如果备份的引导扇区也损坏了,显示错误信息“Error loading operating system”seg000:007F EB BC jmp short loc_1003Dseg000:0081; ---------------------------------------------------------------------------;//在把控制权交给引导扇区前,要先检查引导扇区的签名(signature),防止把控制权交给已经损坏的引导扇区seg000:0081seg000:0081 loc_10081: ; CODE XREF: seg000:0055 jseg000:0081 ;seg000:007A j seg000:0081 81 3E FE 7D 55 AA cmp word ptr ds:7DFEh, 0AA55h ;//检查活动分区的头个扇区最后的2个字节是不是AA55hseg000:0087 74 0B jz short loc_10094;//如果是以AA55结尾就跳转seg000:0089 80 7E 10 00 cmp byte ptr [bp+10h], 0 ;//如果不是以AA55结尾,判断是否已经加载备份的引导扇区seg000:008D 74 C8 jz short loc_10057 ;// 如果没有加载备份的引导扇区,则跳转,加载备份的引导扇区seg000:008F A0 B7 07 mov al, ds:7B7h ;// 如果已经加载备份的引导扇区,则跳转显示错误信息. 0x1B7+0600=7B7h ,0x1B7偏移地址处一般为63,0x163偏移地址处指向字符串“Missing operating system”seg000:0092 EB A9 jmp short loc_1003Dseg000:0094; --------------------------------------------------------------------------- ;//转交控制权给引导扇区,让它去完成OS的引导seg000:0094seg000:0094 loc_10094: ;CODE XREF: seg000:0087 j seg000:0094 8B FC mov di, sp ;//di = sp = 7C00hseg000:0096 1E push ds ;//设置cs段seg000:0097 57 push di ;//设置ipseg000:0098 8B F5 mov si, bp ;//把活动分区表项指针传给引导扇区seg000:009A CB retf ;//相当于pop ip; pop cs,即执行retf指令后跳转到0000:7C00处执行(MBR的引导代码结束)seg000:009Bseg000:009B; =============== S U B R O U T I N E ======================================= ;//读取引导扇区的子过程seg000:009Bseg000:009Bseg000:009B sub_1009B proc near ; CODE XREF: seg000:0052 p seg000:009B ; seg000:0077 p seg000:009B BF 05 00 mov di, 5 ;//最多尝试读取活动分区的头个扇区5次,如果5次都失败了,提示载入操作系统错误seg000:009E 8A 56 00 mov dl, [bp+0];//驱动器dl=80H(00H~7FH:软盘;80H~0FFH:硬盘),分区的启动标志其实就是硬盘号seg000:00A1 B4 08 mov ah, 8 ;//08H号读取驱动器参数(读取这些参数是为了决定用CHS方式还是LBA方式读取磁盘)seg000:00A3 CD 13 int 13hseg000:00A5 72 23 jb short loc_100CA ;//CF=1代表操作失败,跳转(直接采用CHS方式读取磁盘),如果取参数失败,认为BIOS肯定不支持扩展Int 13h ;//计算用传统Int 13h能访问的最大逻辑扇区号,计算公式为:(最大磁头号+1)*每道扇区数*(最大柱面号+1).由于现代硬盘基本上采用LBA方式寻址,因此计算出的最大逻辑扇区号通常会很小。