硬盘主引导扇区引导程序
2015-04-23 14:10
113 查看
硬盘主引导扇区的引导程序只占139个字节(不同版本的Fdisk、不同的分区程序写入的主引导记录会不相同,但其基本功能一样),经过反汇编后的引导程序的汇编代码如下:
从上面的汇编程序可以看出,主引导程序在寻找活动分区标记"80"的同时,也判断非活动分区的标记是否为"00",如果两者都不是,系统就会报错。当所有分区检查完毕以后,就将系统控制权交给活动分区的引导记录DBR,通过一步一步地程序调入和交接,完成整个系统的引导过程。当然,也有一些磁盘的主引导程序首先检查是否有标记"55AA",然后才查找分区表。
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",然后才查找分区表。
相关文章推荐
- linux2.6硬盘扇区直接读写程序
- 硬盘的那些事(主分区、扩展分区、逻辑分区、活动分区、系统分区、启动分区、引导扇区、MBR等
- 走进程序世界的田园——引导扇区释疑 (转载zjneter的专栏)
- 硬盘的那些事(主分区、扩展分区、逻辑分区、活动分区、系统分区、启动分区、引导扇区、MBR等)
- 硬盘和软盘的引导扇区结构
- linux2.6硬盘扇区直接读写程序 分类: 磁盘的扇区读写 2015-04-29 10:37 317人阅读 评论(0) 收藏
- 掀起硬盘主引导扇区的神秘面纱
- linux2.6硬盘扇区直接读写程序
- linux2.6硬盘扇区直接读写程序
- 硬盘主引导扇区剖析
- linux2.6硬盘扇区直接读写程序
- 走进程序世界的田园------引导扇区释疑
- 硬盘主引导扇区
- 读取硬盘的MBR引导扇区(Windows各系统通用)
- 硬盘的那些事(主分区、扩展分区、逻辑分区、活动分区、系统分区、启动分区、引导扇区、MBR等)
- 走进程序世界的田园 ——引导扇区释疑
- 操作系统实验一:在引导扇区编写显示字符串的引导程序
- 《转》破坏硬盘主引导扇区
- 关于使用UltraISO写入硬盘硬盘镜像...便捷启动...写入新的引导扇区...设备正忙的失败处理
- 硬盘引导扇区、多分区图、不通硬盘的LINUX逻辑分区数量