讲解前的一些预备知识
在此讲解的程序是一个精练、紧凑、设计合理且兼容性好的F9一键xx隐藏分区的引导程序,该程序共占用两个硬盘扇区,能以中文提示按F9键的方式,选择启动隐藏分区上的操作系统,利用隐藏分区上的操作系统和工具软件,可以很方便地实现对主机上其它操作系统的维护、备份以及恢复等操作,程序构造的EISA隐藏分区,在盘上Windows XP系统中是不能被访问和破坏的,具有较好的自我保护能力,该程序已在VPC虚拟机和DELL PE4600服务器RAID1上运行通过。
注:该程序本身并不具有系统启动、备份和恢复的功能,只是提供了对隐藏分区里PE或XP的启动支持,隐藏分区的建立和系统的安装仍需网友们自行解决,网友们可以利用事先保存在隐藏分区里的工具软件,对常规分区操作系统进行手工备份、恢复以及维护等操作。
该程序是作为引导程序放置在从硬盘主引导扇开始的连续两个扇区里,{dy}扇区是由硬盘主引导程序(MBR)、主引导扇分区表(DPT)以及扇区结束标志55H、AAH(系统签名)三部分构成。从0000:0600H开始到0000:07BDH是硬盘主引导程序的驻留空间(其中07B8H—07BBH四个字节是硬盘签名);主引导扇分区表位于0000:07BEH偏移开始的地方(见三楼:驻留主引导扇程序的内存映像)从0000:07BEH开始,每16个字节(即每种颜色)为一个分区表项,共四个分区表项64个字节;0000:07FEH处的55H、AAH标志(系统签名)是引导扇的有效标志,少了它硬盘将不被BIOS和操作系统所认可,会出现操作系统不认此硬盘的现象,因此这个标志还是很重要的,有时我们遇到硬盘不能被系统识别,就有可能是少了这个标志的缘故,用FDISK /MBR命令可以解决此问题。主引导扇后的第二个扇区的内容,是F9一键启动隐藏分区提示字符的点阵码区。
硬盘引导程序开始工作之前,先是由BIOS程序完成硬件系统自检,并在基本内存{zd1}的1K内存中填入最初始的BIOS中断向量表,紧接其后建立一个512字节的系统低址数据区,这两项都是BIOS程序为以后启动操作系统准备的非常重要的系统资源,共占用了0000:0600H之前的1.5K内存空间,准备好这些数据结构后,BIOS程序开始为启动操作系统作准备,以硬盘启动为例,BIOS程序首先会把位于硬盘主引导扇的整个扇区的二进制映像,全部装入内存0000:7C00H处,并检查硬盘主引导扇{zh1}的55H、AAH标志,如具有该标志,就把控制权移交给装入到0000:7C00H处的硬盘主引导程序代码,也就是交由硬盘主引导程序来接着完成启动过程,这是BIOS程序启动时的一个定式,此后就是硬盘主引导程序所要做的系统引导工作了。如果没有找到55H、AAH标志,BIOS程序会显示报错信息或根据设置去查找其它的启动设备。
中文提示一键F9xx隐藏分区程序,是用批处理来安装的,安装原理是将1JF9z_0.BIN复制到硬盘的{dy}个扇区上,将1JF9z_1.BIN复制到硬盘的第二个扇区,将原来的主引导扇备份到硬盘的第三个扇区,将1JF9z_3.BIN复制到硬盘的第四个扇区,系统重启后,BIOS会将位于主引导扇上的1JF9z_0.BIN初始化程序装入内存0:7C00处执行,该初始化程序将对第四扇区1JF9z_3.BIN一键F9引导程序进行分区表装配,提取主系统分区表项和隐藏分区表项的偏移指针,保存到一键F9引导程序的61CH和61EH,并且判断隐藏分区存在与否,存在就完成初始化,不存在就恢复原来的主引导程序。
一键F9初始化程序注释文本(原文件:1JF9z_0.BIN)
初始化各段寄存器和堆栈指针
0:7C00 FA CLI ;关中断
0:7C01 31C0 XOR AX,AX ;AX=0
0:7C03 8EC0 MOV ES,AX ;扩展段ES=0
0:7C05 8ED8 MOV DS,AX ;数据段DS=0
0:7C07 8ED0 MOV SS,AX ;栈段SS=0
0:7C09 BC007C MOV SP,7C00 ;栈指针SP=7C00H
0:7C0C FB STI ;开中断
装入第四扇区上的1JF9z_3.BIN映像
0:7C0D B80102 MOV AX,0201 ;设读1个扇区的功能
0:7C10 BB0006 MOV BX,0600 ;设数据缓冲区偏移址BX=600H
0:7C13 B90400 MOV CX,0004 ;设指向0柱面4扇区的操作参数
0:7C16 E8F300 CALL 7D0C ;调用7D0CH装入第4扇区上的1JF9z_3映像
装入第三扇区上保存的原引导扇映像
0:7C19 B80102 MOV AX,0201 ;设读1个扇区的功能
0:7C1C BB0008 MOV BX,0800 ;设数据缓冲区偏移址BX=800H
0:7C1F B90300 MOV CX,0003 ;设指向0柱面3扇区的操作参数
0:7C22 E8E700 CALL 7D0C ;调用7D0CH装入第3扇区上的原引导扇映像
把原引导扇的磁盘签名+分区表+系统签名复制到1JF9z_3的映像中
0:7C25 BEB809 MOV SI,09B8 ;数据传输源指针指向9B8H
0:7C28 BFB807 MOV DI,07B8 ;数据传输目的指针指向7B8H
0:7C2B B94800 MOV CX,0048 ;数据传输计数值=48H
0:7C2E F3 REPZ ;重复传输数据,从地址0:9B8H到0:7B8H
0:7C2F A4 MOVSB ;按字节传送(48H=72字节)
分区属性识别和整形
0:7C30 BEBE07 MOV SI,07BE ;源指针指向7BEH(指向分区表首字节)
0:7C33 BF0400 MOV DI,0004 ;设置分区表项计数值DI=04H
0:7C36 807C0405 CMP BYTE PTR [SI+04],05 ;分区表项属性是05H?(扩展分区属性)
0:7C3A 7455 JZ 7C91 ;是扩展分区转7C91H
0:7C3C 807C040F CMP BYTE PTR [SI+04],0F ;分区表项属性是0FH?(扩展分区属性)
0:7C40 744F JZ 7C91 ;是扩展分区转7C91H
0:7C42 57 PUSH DI ;当前DI入栈
0:7C43 56 PUSH SI ;当前SI入栈
0:7C44 E8CB00 CALL 7D12 ;装入当前分区表项指向的分区引导扇
0:7C47 BE707D MOV SI,7D70 ;源指针指向“NTFS”字符串
0:7C4A BF030A MOV DI,0A03 ;目的指针指向分区引导扇的A03H
0:7C4D E8AD00 CALL 7CFD ;调用标志比较子过程进行比较
0:7C50 7439 JZ 7C8B ;相等则当前为NTFS分区,转7C8BH
0:7C52 BE757D MOV SI,7D75 ;源指针指向“FAT32”字符串
0:7C55 BF520A MOV DI,0A52 ;目的指针指向分区引导扇的A52H
0:7C58 E8A200 CALL 7CFD ;调用标志比较子过程进行比较
0:7C5B 741A JZ 7C77 ;相等则当前为FAT32分区,转7C77H
0:7C5D BE7B7D MOV SI,7D7B ;源指针指向“FAT16”字符串
0:7C60 BF360A MOV DI,0A36 ;目的指针指向分区引导扇的A36H
0:7C63 E89700 CALL 7CFD ;调用标志比较子过程进行比较
0:7C66 5E POP SI ;SI出栈
0:7C67 7408 JZ 7C71 ;相等则当前为大于504M的FAT16分区,转7C71H
0:7C69 A1110A MOV AX,[0A11] ;无标志则取BPB表根目录记录数来判断
0:7C6C 3D0002 CMP AX,0200 ;根目录记录数是否等于200H(FAT16的值)
0:7C6F 751F JNZ 7C90 ;不相等则非FAT16分区转7C90H
0:7C71 C644040E MOV BYTE PTR [SI+04],0E ;给当前分区表项赋予FAT16属性标志
0:7C75 EB19 JMP 7C90 ;转7C90H
0:7C77 5E POP SI ;SI出栈
0:7C78 817C0AFA00 CMP WORD PTR [SI+0A],00FA ;判断分区起始位置是否大于等于8G
0:7C7D 7306 JNB 7C85 ;不大于8G转7C85H
0:7C7F C644040B MOV BYTE PTR [SI+04],0B ;小于8G的FAT32分区赋予0BH属性标志
0:7C83 EB0B JMP 7C90 ;转7C90H
0:7C85 C644040C MOV BYTE PTR [SI+04],0C ;大于8G的FAT32分区赋予0CH属性标志
0:7C89 EB05 JMP 7C90 ;转7C90H
0:7C8B 5E POP SI ;SI出栈
0:7C8C C6440407 MOV BYTE PTR [SI+04],07 ;给当前分区表项赋予NTFS属性标志
0:7C90 5F POP DI ;DI出栈
0:7C91 83C610 ADD SI,+10 ;SI=SI+10H指向下一分区表项
0:7C94 4F DEC DI ;分区表项计数器DI=DI-1
0:7C95 759F JNZ 7C36 ;DI不为0转7C36H继续
识别和记录主系统分区和隐藏分区表项指针
0:7C97 BEBE07 MOV SI,07BE ;源指针指向7BEH(指向分区表首字节)
0:7C9A BF0400 MOV DI,0004 ;设置分区表项计数值DI=04H
0:7C9D C60400 MOV BYTE PTR [SI],00 ;xx当前分区表项的活动标志
0:7CA0 8A5C04 MOV BL,[SI+04] ;取前分区表项的属性标志
0:7CA3 80FB07 CMP BL,07 ;判断是否为NTFS分区
0:7CA6 740F JZ 7CB7 ;是则转7CB7H
0:7CA8 80FB0B CMP BL,0B ;判断是否为小于8G的FAT32分区
0:7CAB 740A JZ 7CB7 ;是则转7CB7H
0:7CAD 80FB0C CMP BL,0C ;判断是否为大于8G的FAT32分区
0:7CB0 7405 JZ 7CB7 ;是则转7CB7H
0:7CB2 80FB0E CMP BL,0E ;判断是否为FAT16分区
0:7CB5 7516 JNZ 7CCD ;不是则转7CCDH
0:7CB7 803E1C0600 CMP BYTE PTR [061C],00 ;判断是否已获得主系统分区指针
0:7CBC 7507 JNZ 7CC5 ;已获得主系统分区指针转7CC5H
0:7CBE C60480 MOV BYTE PTR [SI],80 ;为{dy}主分区加上xx标志
0:7CC1 89361C06 MOV [061C],SI ;将当前的主分区指针保存在061CH
0:7CC5 881ED606 MOV [06D6],BL ;将当前的主分区属性保存在06D6H
0:7CC9 89361E06 MOV [061E],SI ;将当前的主分区指针保存在061EH
0:7CCD 83C610 ADD SI,+10 ;SI=SI+10H指向下一分区表项
0:7CD0 4F DEC DI ;分区表项计数器DI=DI-1
0:7CD1 75CA JNZ 7C9D ;DI非0转7C9DH
隐藏分区判断
0:7CD3 8B361C06 MOV SI,[061C] ;将保存的主系统分区指针赋予SI
0:7CD7 8B3E1E06 MOV DI,[061E] ;将保存的隐藏分区指针赋予DI
0:7CDB 39FE CMP SI,DI ;将SI与DI比较,若相等则无隐藏分区
0:7CDD 7308 JNB 7CE7 ;无隐藏分区转7CE7H
存在隐藏分区就把控制权移交给1JF9z_3引导程序
0:7CDF E82100 CALL 7D03 ;将1JF9z_3引导程序写入主引导扇
0:7CE2 EA31060000 JMP 0000:0631 ;把控制权移交给1JF9z_3引导程序
隐藏分区不存在恢复原主引导程序并移交控制权
0:7CE7 BB0008 MOV BX,0800 ;设数据缓冲区指针BX=800H
0:7CEA E81900 CALL 7D06 ;将保存的原主引导扇写回主引导扇
0:7CED BE0008 MOV SI,0800 ;源指针指向800H
0:7CF0 BF007C MOV DI,7C00 ;目的指针指向7C00H
0:7CF3 B90002 MOV CX,0200 ;设数据传输计数值=200H
0:7CF6 F3 REPZ ;重复传输数据,从地址0:800H到0:7C00H
0:7CF7 A4 MOVSB ;按200H字节传送
0:7CF8 EA007C0000 JMP 0000:7C00 ;将控制权移交给7C00H处的原主引导程序
分区引导扇标志比较子过程:
0:7CFD B90400 MOV CX,0004 ;设重复比较计数值CX=04H
0:7D00 F3 REPZ ;按CX=04H的值重复执行
0:7D01 A6 CMPSB ;依次将SI和DI指针指向的字节进行比较
0:7D02 C3 RET ;返回调用程序
1JF9z_3引导程序写入主引导扇子过程:
0:7D03 BB0006 MOV BX,0600 ;设数据缓冲区指针BX=600H
0:7D06 B80103 MOV AX,0301 ;设INT13H写1个扇区的功能参数
0:7D09 B90100 MOV CX,0001 ;设指向0柱面1扇区的操作参数
0:7D0C BA8000 MOV DX,0080 ;设指向{dy}硬盘及0磁头的操作参数
0:7D0F CD13 INT 13 ;调用常规INT13H中断服务
0:7D11 C3 RET ;返回调用程序
分区引导扇装入子过程:
0:7D12 89F3 MOV BX,SI ;将分区表项指针送入BX
0:7D14 BE607D MOV SI,7D60 ;SI指向INT13H扩展功能调用服务包
0:7D17 B8000A MOV AX,0A00 ;将缓冲区偏移量送入AX
0:7D1A 894404 MOV [SI+04],AX ;将缓冲区偏移量送入INT13H服务包
0:7D1D 8C5C06 MOV [SI+06],DS ;将缓冲区段址送入INT13H服务包
0:7D20 8B4708 MOV AX,[BX+08] ;取分区表项保留扇区数低字送到AX
0:7D23 894408 MOV [SI+08],AX ;将分区表项保留扇区数低字送入INT13H服务包
0:7D26 8B470A MOV AX,[BX+0A] ;取分区表项保留扇区数高字送到AX
0:7D29 89440A MOV [SI+0A],AX ;将分区表项保留扇区数高字送入INT13H服务包
0:7D2C B280 MOV DL,80 ;设操作设备号指向{dy}硬盘
0:7D2E BBAA55 MOV BX,55AA ;设BX=55AA
0:7D31 B80042 MOV AX,4200 ;设INT13H扩展读扇区功能号
0:7D34 CD13 INT 13 ;调用INT13H扩展功能
0:7D36 C3 RET ;返回调用程序
一键F9引导程序注释文本(原文件:1JF9z_3.BIN)
寄存器初始化及程序转
0:0600 FA CLI ;关中断
0:0601 33C0 XOR AX,AX ;AX=0
0:0603 8EC0 MOV ES,AX ;扩展段ES=0
0:0605 8ED8 MOV DS,AX ;数据段DS=0
0:0607 8ED0 MOV SS,AX ;栈段SS=0
0:0609 BC007C MOV SP,7C00 ;栈指针SP=7C00H
0:060C 8BF4 MOV SI,SP ;数据传输源指针指向7C00H
0:060E FC CLD ;设数据传输正方向
0:060F BF0006 MOV DI,0600 ;数据传输目的指针指向600H
0:0612 B90001 MOV CX,0100 ;数据传输计数值=100H
0:0615 F3 REPZ ;重复传输数据,从地址0:7C00H到0:600H
0:0616 A5 MOVSW ;按字传送(2X256=512字节)
0:0617 EA30060000 JMP 0000:0630 ;程序转移到0:0630H处继续执行
主系统分区表项指针
0:061C 0000 ADD [BX+SI],AL ;保存主系统分区表项指针
隐藏系统分区表项指针
0:061E 0000 ADD [BX+SI],AL ;保存隐藏系统分区表项指针
INT13H扩展功能调用服务包
0:0620 1000 ADC [BX+SI],AL ;服务包长度┓
0:0622 0100 ADD [BX+SI],AX ;操作扇区数┃
0:0624 0000 ADD [BX+SI],AL ;缓冲区偏移┃
0:0626 0000 ADD [BX+SI],AL ;缓冲区段址┃INT13H扩展功能调用服务包
0:0628 0000 ADD [BX+SI],AL ;操作扇区号┃
0:062A 0000 ADD [BX+SI],AL ; . ┃
0:062C 0000 ADD [BX+SI],AL ; . ┃
0:062E 0000 ADD [BX+SI],AL ; . ┛
判断是否{jd1}转移到隐藏分区启动
0:0630 FB STI ;开中断
0:0631 803EBC06EB CMP BYTE PTR [06BC],EB ;比较06BCH处是否为EB代码
0:0636 7479 JZ 06B1 ;是则转移到06B1H作隐藏分区启动处理
装入显示F9汉字提示点阵码扇区
0:0638 BB0008 MOV BX,0800 ;设数据缓冲区偏移址BX=800H
0:063B B90200 MOV CX,0002 ;设指向0柱面2扇区的操作参数
0:063E B80102 MOV AX,0201 ;设读1个扇区的功能
0:0641 E8D500 CALL 0719 ;调用0719H子过程装入汉字点阵码扇区
校验F9汉字提示点阵码扇区
0:0644 89DE MOV SI,BX ;源指针寄存器SI=BX=800H指向装入的点阵码扇区
0:0646 B90001 MOV CX,0100 ;设计数器CX=100H
0:0649 31DB XOR BX,BX ;BX寄存器清0
0:064B AD LODSW ;将DS:SI指向的字送入AX并使SI加2指向下一个字
0:064C 03D8 ADD BX,AX ;累加AX中的值
0:064E E2FB LOOP 064B ;使CX=CX-1若CX不为0则转64BH继续
0:0650 83FBFF CMP BX,-01 ;比较BX中的累加和是不是等于FFFFH
0:0653 755C JNZ 06B1 ;不相等即非匹配的汉字点阵扇区转6B1H启动主系统分区
显示中文按键提示
0:0655 B80006 MOV AX,0600 ;设INT10H的06H号功能向上滚动行数为0
0:0658 B707 MOV BH,07 ;设空白底行所使用的属性参数为07H(设黑底白字)
0:065A 31C9 XOR CX,CX ;设滚动的行列为0行0列
0:065C BA4F18 MOV DX,184F ;设滚动的底行为18H,滚动的右边列为4FH
0:065F CD10 INT 10 ;调用INT10H实现指定屏幕区域的向上滚动
0:0661 B91500 MOV CX,0015 ;设定要显示的字符数=15H
0:0664 BAC100 MOV DX,00C1 ;设定字符号=C1H
0:0667 BB0010 MOV BX,1000 ;设定每字符16个字节,字节页为0
0:066A B80011 MOV AX,1100 ;设定字符生成器的用户字体装入功能
0:066D BD0008 MOV BP,0800 ;设定ES:BP指向用户点阵字模的指针
0:0670 CD10 INT 10 ;调用INT10H显示功能
0:0672 B700 MOV BH,00 ;BH置0
0:0674 8D36E009 LEA SI,[09E0] ;取显示字符点阵颜色设置字串的偏移指针送入SI
0:0678 BA0101 MOV DX,0101 ;设置DH=1行,DL=1列(设显示起始行、列位置)
0:067B B0C0 MOV AL,C0 ;AL=C0H
0:067D 50 PUSH AX ;AX入栈
0:067E B402 MOV AH,02 ;使AH=02H设置INT10H置光标功能
0:0680 FEC2 INC DL ;设置光标从当前行列递增1列显示
0:0682 CD10 INT 10 ;调用INT10H更新光标位置
0:0684 8A1C MOV BL,[SI] ;将DS:[SI]指向的字节装入BL
0:0686 B90100 MOV CX,0001 ;CX=0001H因调用INT10H的09H号功能时CX必须为1
0:0689 58 POP AX ;AX出栈
0:068A FEC0 INC AL ;AL=AL+1用AL计数
0:068C 50 PUSH AX ;AX入栈
0:068D B409 MOV AH,09 ;AH=09H设置INT10H写字符和属性功能
0:068F CD10 INT 10 ;调用INT10H在光标处写入字符及属性
0:0691 58 POP AX ;AX出栈
0:0692 46 INC SI ;使SI=SI+1指向下一个字符
0:0693 3CD5 CMP AL,D5 ;比较计数值AL是否=D5H即字符串结束
0:0695 75E6 JNZ 067D ;不是则转06E0H处继续显示字符
按键捕捉及延时
0:0697 8B166C04 MOV DX,[046C] ;从0:046CH地址数据区取时钟基准值到DX
0:069B B411 MOV AH,11 ;设检查扩展键盘状态功能号
0:069D CD16 INT 16 ;调用INT16H键盘功能取键盘状态
0:069F 7406 JZ 06A7 ;Z标志=1即未按键则跳转6A7H处继续
0:06A1 B410 MOV AH,10 ;设读取扩展键盘输入功能号
0:06A3 CD16 INT 16 ;调用INT16H键盘功能读键入的键值
0:06A5 EB0A JMP 06B1 ;{jd1}跳转到06B1H处进入启动过程
0:06A7 A16C04 MOV AX,[046C] ;从0:046CH地址数据区取当前时钟值到AX
0:06AA 29D0 SUB AX,DX ;将AX中的当前时钟值与DX中的基准时钟值相减
0:06AC 3D3600 CMP AX,0036 ;比较时钟差值是否大于等于036H
0:06AF 72EA JB 069B ;小于则转069BH处继续循环等待按键
获取启动分区和隐藏分区表指针
0:06B1 8B361C06 MOV SI,[061C] ;取061CH处的主系统分区表项指针送SI寄存器
0:06B5 8B3E1E06 MOV DI,[061E] ;取061EH处的隐藏分区表项指针送DI寄存器
F9按键判断及处理
0:06B9 3D0043 CMP AX,4300 ;比较AX寄存器中的按键值是否为F9的键码
0:06BC 7415 JZ 06D3 ;是则转6D3H处进行隐藏分区启动预处理
主系统分区启动预处理
0:06BE 807D0412 CMP BYTE PTR [DI+04],12 ;比较隐藏分区属性ID是不是12H隐藏标志
0:06C2 741E JZ 06E2 ;是则转6E2H开始常规活动分区的启动过程
0:06C4 C6450412 MOV BYTE PTR [DI+04],12 ;为隐藏分区表项加上12H隐藏ID
0:06C8 C60500 MOV BYTE PTR [DI],00 ;除隐藏分区表项的活动分区标志
0:06CB C60480 MOV BYTE PTR [SI],80 ;为主系统分区表项加上活动标志
0:06CE E83A00 CALL 070B ;调用70BH子过程回写修改过的主引导扇
0:06D1 EB0F JMP 06E2 ;转到6E2H开始主系统分区的启动过程
隐藏分区启动预处理
0:06D3 C645040C MOV BYTE PTR [DI+04],0C ;将真实的分区属性ID值送隐藏分区表项ID字节处
0:06D7 C60580 MOV BYTE PTR [DI],80 ;为隐藏分区表项加上活动分区标志
0:06DA C60400 MOV BYTE PTR [SI],00 ;xx主系统分区表项的活动标志
0:06DD E82B00 CALL 070B ;调用70BH子过程回写修改过的主引导扇
0:06E0 89FE MOV SI,DI ;将隐藏分区指针DI转换成分区启动时的装入指针
启动分区引导扇装入并执行
0:06E2 89F3 MOV BX,SI ;将启动分区指针送BX寄存器
0:06E4 BE2006 MOV SI,0620 ;SI=0620H指向INT13H扩展功能服务包
0:06E7 B8007C MOV AX,7C00 ;AX=7C00H指向分区引导扇装入的偏移址
0:06EA 894404 MOV [SI+04],AX ;设INT13H扩展功能服务包缓冲区偏移址
0:06ED 8C5C06 MOV [SI+06],DS ;设INT13H扩展功能服务包缓冲区段址
0:06F0 8B4708 MOV AX,[BX+08] ;取启动分区表项的隐含扇区低字送到AX
0:06F3 894408 MOV [SI+08],AX ;设INT13H扩展功能服务包分区引导扇扇区号低字
0:06F6 8B470A MOV AX,[BX+0A] ;取启动分区表项的隐含扇区高字送到A
0:06F9 89440A MOV [SI+0A],AX ;设INT13H扩展功能服务包分区引导扇扇区号高字
0:06FC B280 MOV DL,80 ;设置INT13H扩展功能调用指向{dy}硬盘
0:06FE BBAA55 MOV BX,55AA ;设置INT13H扩展功能调用的BX寄存器参数
0:0701 B80042 MOV AX,4200 ;设置INT13H扩展功能调用的读盘功能
0:0704 CD13 INT 13 ;调用INT13H扩展功能
0:0706 EA007C0000 JMP 0000:7C00 ;将控制权移交到分区引导程序(主引导结束)
主引导程序回写子过程
0:070B C606BC0674 MOV BYTE PTR [06BC],74 ;恢复6BCH处的代码
0:0710 BB0006 MOV BX,0600 ;设INT13H调用的数据缓冲区指针
0:0713 B90100 MOV CX,0001 ;设INT13H操作指向0柱面1扇区
0:0716 B80103 MOV AX,0301 ;设INT13H写一个扇区的功能
0:0719 BA8000 MOV DX,0080 ;设INT13H操作指向{dy}硬盘0磁头
0:071C CD13 INT 13 ;调用常规INT13H功能
0:071E C3 RET ;返回调用程序
1JF9ze V3.31中/英文提示版下载