|
硬盘的第一个扇区被保留为主引导扇区,它位于整个硬盘的0磁道0柱面1扇区,包括硬盘主引导记录MBR(Main Boot Record)和分区表DPT(Disk Partition Table)。其中主引导记录的作用就是检查分区表是否正确以及确定哪个分区为引导分区,并在程序结束时把该分区的启动程序(也就是操作系统引导扇区)调入内存加以执行。至于分区表,很多人都知道,以80H或00H为开始标志,以55AAH为结束标志,共64字节,位于本扇区的最末端。
= 硬盘主引导记录(MBR) + 硬盘分区表(DPT)
用FDISK 进行硬盘分区时产生的, 它属于整个硬盘而不属于某个独立的DOS 分区, 是硬盘正确引导和使用的必要条件.
物理位置:0柱面0磁头1扇区(Cylinder 0, Head 0, Sector 1)
系统扇区(System Sectors): 0C-0H-2S,0C-0H-63S, 共 62 Sectors
大小:512字节
其中:MBR 446字节(0000--01BD),DPT 64字节(01BE--01FD),结束标志2字节(55 AA)
功能:MBR通过检查DPT分区信息引导系统跳转至DBR
详解: (DEBUG -A: MOV AX,0201 MOV BX,0200 MOV CX,0001 MOV DX,0080 INT 13)
000H--08AH MBR启动程序(寻找开机分区)
08BH--0D9H MBR启动字符串
0DAH--1BCH 保留( "0 ")
1BEH--1FDH 硬盘分区表
1FEH--1FFH 结束标志(55AA)
C++内联汇编
在C++代码中插入__asm {}即可
主引导区备份如下- DATA SEGMENT
-
- D2 DB 'A:\BOOT.DAT',00H
- DATA ENDS
- CODE SEGMENT
- ASSUME CS:CODE,DS:DATA,ES:DATA
- START:
- MOV AX,DATA
- MOV DS,AX
- MOV ES,AX
- MOV AH,09H
- MOV DX,OFFSET D1
- INT 21H ;显示字符串D1
- MOV AX,0201H
- MOV BX,0700H
- MOV CX,0001H
- MOV DX,0080H
- INT 13H ;读MBR区到内存
- MOV CX,0020H
- MOV DX, OFFSET D2
- MOV AH,3CH
- INT 21H ;建立文件A:\BOOT.DAT
- MOV AL,01H
- MOV DX, OFFSET D2
- MOV AH,3DH
- INT 21H ;打开文件A:\BOOT.DAT(用于写)
- MOV BX,AX
- MOV DX,0700H
- MOV CX,0200H
- MOV AH,40H
- INT 21H ;将内存中的MBR区写入文件中
- MOV AH,4CH
- INT 21H ;退出程序
- CODE ENDS
- END START
-
- 主引导区恢复如下DATA SEGMENT
-
- d2 db " !!!警告!!!",0dh,0ah
- db " 本程序仅用于将MBR1.EXE程序在本机硬盘备份的主引导区A:\BOOT.DAT文件(该文件必须"
- db "在A盘根目录上)恢复到本机硬盘的主引导区,否则硬盘分区会丢失,不听警告,后果自负! "
- db " 确认要执行么?(Y/N)",0dh,0ah,"{1}quot;
- d3 db " A:\BOOT.DAT文件没找到!",0dh,0ah,"{1}quot;
- d4 db "A:\BOOT.DAT",00H
- DATA ENDS
- CODE SEGMENT
- ASSUME CS:CODE,DS:DATA,ES:DATA
- START:
- MOV AX,DATA
- MOV DS,AX
- MOV ES,AX
- MOV AH,09H
- MOV DX,OFFSET D1
- INT 21H ;显示字符串d1
- MOV AH,00H
- INT 16H ;等待用户按任意键键继续
- MOV AH,07H
- MOV AL,00H
- MOV BH,0A4h
- MOV CX,0000H
- MOV DX,184FH
- INT 10H ;设置显示方式(背景绿,前景红)
- MOV AH,09H
- MOV DX,OFFSET D2
- INT 21H ;显示字符串d2(因为此程序有一定的危险性,所以
- ;警告一定要显眼)
- READ_KEYBOARD:
- MOV AH,00H
- INT 16H
- OR AL,20H
- CMP AL,79H
- JZ WRITE ;是Y/y的话就跳转到写MBR区处
- CMP AL,6EH
- JZ EXIT ;是N/n的话跳转到退出处
- JMP READ_KEYBOARD ;是其他键就重新读键
-
- EXIT:
- MOV AH,07H
- MOV AL,00H
- MOV BH,07H
- MOV CX,0000H
- MOV DX,184FH
- INT 10H ;清屏
- MOV AH,4CH
- INT 21H ;退出程序
-
- WRITE:
- MOV AH,3DH
- MOV DX,OFFSET D4;
- MOV AL,00H
- INT 21H ;打开A:\BOOT.DAT
- JB ERROR
- PUSH AX
- MOV AH,3FH
- MOV DX,7000H
- MOV CX,0200H
- POP BX
- INT 21H ;将A:\BOOT.DAT读入内存
- MOV AH,03H
- MOV AL,01H
- MOV BX,7000H
- MOV CX,0001H
- MOV DX,0080H
- INT 13H ;写入硬盘MBR区
- JMP EXIT ;跳转到退出程序处
-
- ERROR:
- MOV AH,09H
- MOV DX,OFFSET D3 ;显示出错信息
- INT 21H
- MOV AH,4CH
- INT 21H ;退出程序
- CODE ENDS
- END START
复制代码
作者:yincheng01 发表于2012-1-6 6:47:53 原文链接
|
|