📄 hdp.asm
字号:
QT_64 DQ ?
DIVEE_64 DD ?,?
DIVER_32 DD ?
QT_32 DD ?
;------------------------------------
NUM_0 DQ 0
NUM_5 DQ 5
NUM_512 DQ 512
NUM_30732000 DQ 30732000
NUM_10_W DW 1
BAKCylinderNUM DQ ?
BAKSize DW ?
SectorsPCylinder DQ 0
BAKLPA DQ 0
BAKLPA_HIGH64 DQ 0
FLAG0 DW 0
NUM_BAKSize DW 1
CylinderCount DD 19475
HeadCount DD 255
SectorCount DQ 30732282
SRCLPA DQ 0
DSTLPA DQ 30732000
TEMPLPA DQ 0
;-------------------------------------
D20 DQ 10000000000000000000
D19 DQ 1000000000000000000
D18 DQ 100000000000000000
D17 DQ 10000000000000000
D16 DQ 1000000000000000
D15 DQ 100000000000000
D14 DQ 10000000000000
D13 DQ 1000000000000
D12 DQ 100000000000
D11 DQ 10000000000
D10 DQ 1000000000
D9 DQ 100000000
D8 DQ 10000000
D7 DQ 1000000
D6 DQ 100000
D5 DQ 10000
D4 DQ 1000
D3 DQ 100
D2 DQ 10
D1 DQ 1
ASC0 DB '0',19 DUP(0)
;----------------------------------
DAP DAP_STRUC <>
DPP DPP_STRUC <>
;-----------------------------------
MBR LABEL WORD
MBRHead DB 446 DUP(?)
PState DB ?
PStartHead DB ?
PStartSC DW ?
PType DB ?
PEndHead DB ?
PEndSC DW ?
PRelAddress DD ?
PSize DD ?
PState2 DB ?
PStartHead2 DB ?
PStartSC2 DW ?
PType2 DB ?
PEndHead2 DB ?
PEndSC2 DW ?
PRelAddress2 DD ?
PSize2 DD ?
MBRTail DB 32 DUP(?)
MBRID DW ?
;-----------------------------------
DBR LABEL WORD
DBRHead DB 11 DUP(?)
SectorSize_DBR DW ?
SectorsPCluster DB ?
ReservedSectionSize DW ?
FATCount DB ?
DB 11 DUP(?)
HiddenSectionSize DD ?
LPsize DD ?
FATSize DD ?
DD ?
FDTStartCluster DD ?
DW ?
DBRSIZE DB ?
DB 13 DUP (?)
DBRTail DB 446 DUP(?)
DBRID DW ?
;-----------------------------------
;----------------------------------------
;要显示数据的ASCII字符串
;---------------------------------------
;ASC_MBR
ASC_PStartCylinder DB 5 DUP(?),13,10
ASC_PStartHead DB 3 DUP(?),13,10
ASC_PStartSector DB 3 DUP(?),13,10,36
ASC_PEndCylinder DB 5 DUP(?),13,10
ASC_PEndHead DB 3 DUP(?),13,10
ASC_PEndSector DB 3 DUP(?),13,10,36
ASC_PRelAddress DB 10 DUP(?),13,10,36
ASC_PSize DB 10 DUP(?),13,10,36
;-------------------------------------
;ASC_CHS
ASC_Cylinders DB 10 DUP(?),13,10
ASC_Heads DB 10 DUP(?),13,10
ASC_SectorsPTrack DB 10 DUP(?),13,10,36
ASC_Sectors DB 10 DUP(?),13,10,36
;--------------------------------------
;ASC_DBR
ASC_SectorSize DB 5 DUP(?),13,10,36
ASC_SectorsPCluster DB 3 DUP(?),13,10,36
ASC_ReservedSectionSize DB 5 DUP(?),13,10,36
ASC_FATCount DB 3 DUP(?),13,10,36
ASC_HiddenSectionSize DB 10 DUP(?),13,10,36
ASC_LPSize DB 10 DUP(?),13,10,36
ASC_FATSize DB 10 DUP(?),13,10,36
ASC_FDTStartCluster DB 10 DUP(?),13,10,36
ASC_DBRSize DB 3 DUP(?),13,10,36
;------------------------------------
ASC_BAKSize DB 5 DUP(0),13,10,36
ASC_BAKLPA DB 20 DUP(0),13,10,36
ASC_BAKLPA_HIGH64 DB 20 DUP(0),13,10,36
;ASC_
;Computed partition C,S
PStartCylinder DW ?,13,10,36
PStartSector DB ?,13,10,36
PEndCylinder DW ?,13,10,36
PEndSector DB ?,13,10,36
;--------------------------------------
;BAKLPA DQ 0,0
;BAKCylinderNUM DQ 0
;-----------------------------------------
MSGNUM DW ?
;以下为消息区
WELCOME DB 2 DUP (80 DUP (0),13,10)
DB '================================================================================',13,10
DB ' WELCOME TO HARD DISK PROTECTOR V1.0!',13,10,13,10
DB ' DISINGED AND CODED BY WANG WEI',13,10,13,10
DB ' SNO:06055014',13,10
DB ' CLASS 61 DEPARTMENT OF COMPUTER SCIENCE AND TECNOLOGY',13,10
DB ' SCHOOL OF ELECTRONIC AND TECNOLOGY AND ENGINIEERY',13,10
DB ' XI AN JIAOTONG UNIVERSITY',13,10,13,10
DB ' ALL RIGHTS RESERVED 2006-2007',13,10,36
; DB '================================================================================',13,10,36
MENU DB ' Press 0 to show disk and partition infomatition',13,10
DB ' Press 1 to BACKUP system section',13,10
DB ' Press 2 to RECOVER system section',13,10
DB ' Press 3 to RECOVER MBA ONLY',13,10
DB ' Press 4 to RECOVER DBR ONLY',13,10
DB ' Press 5 to RECOVER FAT ONLY',13,10
DB ' Press Q to quit',13,10,36
THANKS DB 80 DUP('='),13,10
DB ' Thank you for using!',13,10
DB 80 DUP('='),13,10,13,10,36
CLS DB 25 DUP(80 DUP(0),13,10,13,10,13,10,13,10,13,10),36
MSG00 DB 'Preparing to read MBR...',13,10,36
MSG01 DB 'Reading MBR successfully!',13,10,36
MSG02 DB 'Reading MBR failed!',13,10,36
MSG03 DB 'Checking MBR ID...',13,10,36
MSG04 DB 'Checking MBR ID successfully!',13,10,36
MSG05 DB 'Checking MBR ID failed!',13,10,36
MSG06 DB 'Preparing to read CHS...',13,10,36
MSG07 DB 'Reading CHS successfully!',13,10,36
MSG08 DB 'Reading CHS failed!',13,10,36
MSG09 DB 'Preparing to read DBR...',13,10,36
MSG10 DB 'Reading DBR successfully!',13,10,36
MSG11 DB 'Reading DBR failed!',13,10,36
MSG12 DB 'Checking DBR ID...',13,10,36
MSG13 DB 'Checking DBR ID successfully!',13,10,36
MSG14 DB 'Checking DBR ID failed!',13,10,36
;CHS
MSG15 DB 'CHS information:(C,H,S) ',13,10,36
MSG18 DB 'Number of sectors is : ',36
;DPT
MSG16 DB 'Type of the main partition is: FAT32!',13,10,36
MSG17 DB 'Type of the main partition is NOT FAT32!',13,10,36
MSG20 DB 'Partition start CHS address is:',13,10,36
MSG21 DB 'Partition end CHS address is:',13,10,36
MSG22 DB 'Partition start LPA is: ',36
MSG23 DB 'Partition size is: ',36
;BPB
MSG24 DB 'Sector size is ',36
MSG25 DB 'Sectors per cluster is: ',36
MSG26 DB 'Reserved sector size is: ',36
MSG27 DB 'Number of FATS is: ',36
MSG28 DB 'Hidden sectors size is: ',36
MSG29 DB 'Logic partition size is: ',36
MSG30 DB 'FAT size is: ',36
MSG31 DB 'FDT start cluster is: ',36
MSG32 DB 'DBR size is: ',36
MSG33 DB ' is: ',36
MSG34 DB ' is: ',36
MSG35 DB ' is: ',36
MSG36 DB ' ',36
MSG40 DB 'Reading disk successfully!',13,10,36
MSG41 DB 'Reading disk failed!',13,10,36
MSG42 DB 'Writing disk successfully!!',13,10,36
MSG43 DB 'Writing disk failed!!',13,10,36
MSG64 DB 'Preparing to read disk...',13,10,36
MSG65 DB 'Preparing to write disk...',13,10,36
MSG44 DB 'Backing up system boot record successfully!',13,10,36
MSG45 DB 'Backing up system boot record failed!',13,10,36
MSG46 DB 'Recovering up system boot record successfully!',13,10,36
MSG47 DB 'Recovering up system boot record failed!',13,10,36
MSG48 DB 'Getting backup block count successfully!',13,10,36
MSG49 DB 'Too large to backup!',13,10,36
MSG50 DB 'Getting backup LPA successfully!',13,10,36
MSG51 DB 'Backup LPA is illegal!',13,10,36
MSG53 DB 'Backing up is aborted!',13,10,36
MSG54 DB 'Recovering is aborted!',13,10,36
MSG60 DB 'Back up size is: ',36
MSG61 DB 'Back up LPA is: ',36
MSG62 DB 'Back up LPA_HIGH64 is: ',36
MSG52 DB 'Would you still like to go on(Y/N)?',13,10,36
MSG63 DB 80 DUP('='),'Press any key to continue...',13,10,36
CHOOSE DB 'Please enter a choice: ',13,10,36
TOMENU DB 80 DUP('='),'Press any key to go back to main menu...',13,10,36
;---------------------
BAKBUFF DB 100 DUP(512 DUP(?))
DSEG ENDS
;***************************************
CSEG SEGMENT
;---------------------------------------
MAIN PROC FAR
CINIT
CLS
MSG WELCOME
CONTINUE
AGAIN1: CLS
MSG MENU
MSG CHOOSE
RDKB
CMP AL,'0'
JZ SUB0
CMP AL,'1'
JZ SUB1
CMP AL,'2'
JZ SUB2
CMP AL,'Q'
JZ EXIT
CMP AL,'q'
JZ EXIT
JMP AGAIN1
SUB0:
CLS
CALL RDREC
CONTINUE
CALL GETINFO
CONTINUE
CALL SHOWINFO
MSG TOMENU
RDKB
JMP AGAIN1
SUB1:
CLS
CALL BACKUP
MSG TOMENU
RDKB
JMP AGAIN1
SUB2:
CLS
CALL RECOVER
MSG TOMENU
RDKB
JMP AGAIN1
EXIT:
CLS
MSG THANKS
RDKB
RET
MAIN ENDP
;-----------------------------------------------------------------------------------------
RDREC PROC NEAR
;读入MBR
MSG MSG00
MOV AX,0201H
LEA BX,MBR
MOV CX,0001H
MOV DX,0080H
INT 13H
CMP AH,0
MSGSF MSG01,MSG02
;验证MBR自举标识
MSG MSG03
MOV AX,MBRID
CMP AX,55AAH
MSGSF MSG04,MSG05
;读入CHS
MSG MSG06
MOV AX,DSEG
MOV ES,AX
XOR AX,AX
MOV AH,48H
MOV DL,80H
LEA SI,DPP
INT 13H
MVAR DPP.Cylinders,CylinderCount,2
MVAR DPP.Heads,HeadCount,2
MVAR DPP.Sectors,SectorCount,4
MVAR DPP.SectorSize,NUM_512,1
MSGSF MSG07,MSG08
;准备读取DBR
MSG MSG09
;读取DBR
MOV AX,0201H
LEA BX,DBR
MOV CX,0001H
MOV DX,0180H
INT 13H
CMP AH,0
MSGSF MSG10,MSG11
;验证DBR自举标识
MSG MSG12
MOV AX,DBRID
CMP AX,55AAH
MSGSF MSG13,MSG14
; CALL GETINFO
; CONTINUE
; CALL SHOWINFO
; CONTINUE
RET
RDREC ENDP
;-----------------------------------------------------------------------------------------
GETINFO PROC NEAR
;计算第一分区SC值
GETSC PStartSC,PStartSector,PStartCylinder
GETSC PEndSC,PEndSector,PEndCylinder
;判断第一分区类型(FAT32或者其他)
MOV AL,PType
CMP AL,0BH
JC NEXT
MSG MSG16
JMP CONTINUE2
NEXT:
CMP AL,0CH
JC OTHER
MSG MSG16
JMP CONTINUE2
OTHER: MSG MSG17
;调用B2A进行数据二进制向ASCII码的转换,为显示数据做准备
CONTINUE2:
B2A_8 PStartHead,ASC_PStartHead
B2A_8 PStartSector,ASC_PStartSector
B2A_8 PEndHead,ASC_PEndHead
B2A_8 PEndSector,ASC_PEndSector
B2A_8 SectorsPCluster,ASC_SectorsPCluster
B2A_8 FATCount,ASC_FATCount
B2A_8 DBRSIZE,ASC_DBRSIZE
B2A_16 PStartCylinder,ASC_PStartCylinder
B2A_16 PEndCylinder,ASC_PEndCylinder
B2A_16 DPP.SectorSize,ASC_SectorSize
B2A_16 ReservedSectionSize,ASC_ReservedSectionSize
B2A_32 PRelAddress,ASC_PRelAddress
B2A_32 Psize,ASC_Psize
B2A_32 HiddenSectionSize,ASC_HiddenSectionSize
B2A_32 LPsize,ASC_LPsize
B2A_32 FATsize,ASC_FATsize
B2A_32 FDTStartCluster,ASC_FDTStartCluster
;chs:
B2A_32 DPP.Cylinders,ASC_Cylinders
B2A_32 DPP.Heads,ASC_Heads
B2A_32 DPP.SectorsPTrack,ASC_SectorsPTrack
B2A_32 DPP.SectorsPTrack,ASC_SectorsPTrack
B2A_64 DPP.Sectors,ASC_Sectors
; B2A_64
; B2A_64
; B2A_64
; B2A_64
RET
GETINFO ENDP
;--------------------------------
SHOWINFO PROC NEAR
MSG MSG15
MSG ASC_Cylinders
MSG MSG18
MSG ASC_Sectors
MSG MSG20
MSG ASC_PStartCylinder
MSG MSG21
MSG ASC_PEndCylinder
MSG MSG22
MSG ASC_PRelAddress
MSG MSG23
MSG ASC_PSize
; MSG MSG24
; MSG ASC_SectorSize
MSG MSG25
MSG ASC_SectorsPCluster
MSG MSG26
MSG ASC_ReservedSectionSize
MSG MSG27
MSG ASC_FATCount
MSG MSG28
MSG ASC_HiddenSectionSize
MSG MSG30
MSG ASC_FATSize
MSG MSG31
MSG ASC_FDTStartCluster
MSG MSG32
MSG ASC_DBRSize
RET
SHOWINFO ENDP
;------------------------------
GetBAKSize PROC NEAR
PUSHF
PUSH AX
PUSH BX
PUSH CX
PUSH DX
PUSH SI
PUSH DI
MOV AX,WORD PTR DPP.SectorsPTrack
ADD AX,32
JC ERROR1
MSG MSG48
MOV BAKSize,AX
JMP EXIT5
ERROR1: MSG MSG49
EXIT5: B2A_16 BAKSize,ASC_BAKSize
MSG MSG60
MSG ASC_BAKSize
POP DI
POP SI
POP DX
POP CX
POP BX
POP AX
POPF
RET
GetBAKSize ENDP
;---------------------------------------
GetBAKLPA PROC NEAR
; DSUB DPP.Sectors,D3,BAKLPA,4
B2A_64 BAKLPA,ASC_BAKLPA
MSG MSG50
MSG MSG61
MSG ASC_BAKLPA
RET
GetBAKLPA ENDP
;--------------------------------------
BACKUP PROC NEAR
CALL RDREC
CONTINUE
CALL GETINFO
CONTINUE
CALL SHOWINFO
CONTINUE
CALL GetBAKSize
CONTINUE
; CALL GetBAKLPA
; CONTINUE
MOV CX,95
NEXT9:
READDISK BAKBUFF,SRCLPA,NUM_10_W
WRITEDISK BAKBUFF,DSTLPA,NUM_10_W
DADD SRCLPA,D1,TEMPLPA,4
MVAR SRCLPA,TEMPLPA,4
DADD DSTLPA,D1,TEMPLPA,4
MVAR DSTLPA,TEMPLPA,4
DEC CX
CMP CX,0
JA NEXT9
YN
JC ERROR2
MSG MSG44
JMP EXIT4
ERROR2: MSG MSG53
EXIT4:
RET
BACKUP ENDP
;------------------------------------------
RECOVER PROC NEAR
CALL RDREC
CONTINUE
CALL GETINFO
CONTINUE
CALL SHOWINFO
CONTINUE
CALL GetBAKSize
CONTINUE
; CALL GetBAKLPA
; CONTINUE
MOV CX,95
NEXT10:
READDISK BAKBUFF,SRCLPA,NUM_10_W
WRITEDISK BAKBUFF,DSTLPA,NUM_10_W
DADD SRCLPA,D1,TEMPLPA,4
MVAR SRCLPA,TEMPLPA,4
DADD DSTLPA,D1,TEMPLPA,4
MVAR DSTLPA,TEMPLPA,4
DEC CX
CMP CX,0
JA NEXt10
YN
JC ERROR5
MSG MSG45
JMP EXIT7
ERROR5: MSG MSG54
EXIT7:
MSG TOMENU
RDKB
RET
RECOVER ENDP
;-------------------------
;--------------------------------
Div8 PROC NEAR
MOV AX,BX
MOV DX,0 ;被除数高位补零
DIV CX
MOV BX,DX ;将余数放入BX
CMP AL,0 ;
JZ J1
ADD AL,30H ;将此次的商转换为ASCII码
MOV [DI],AL ;将ASCII码值存入变量ASC
MOV AX,0 ;AX清零
INC DI
J1: RET
Div8 ENDP
;------------------------------
Div16 PROC NEAR
MOV AX,BX ;将二进制数放入AX
MOV DX,0 ;被除数高位补零
DIV CX
MOV BX,DX ;将余数放入BX
CMP AL,0 ;
JZ J2
ADD AL,30H ;将此次的商转换为ASCII码
MOV [DI],AL ;将ASCII码值存入变量ASC
MOV AX,0 ;AX清零
INC DI
J2: RET
Div16 ENDP
;------------------------------
;---------------------------
DIV_32 PROC NEAR
DDIV DIVEE_64,DIVER_32,QT_32,2
MOV AL,BYTE PTR QT_32
CMP AL,0
JZ NEXT1
ADD AL,30H
MOV [DI],AL
INC DI
NEXT1:
RET
DIV_32 ENDP
;---------------------------
DIV_64 PROC NEAR
DDIV DIVEE_128,DIVER_64,QT_64,4
MOV AL,BYTE PTR QT_64
CMP AL,0
JZ NEXT2
MOV BX,0FFFFH
MOV FLAG0,BX
NEXT20:
ADD AL,30H
MOV [DI],AL
INC DI
JMP NEXT21
NEXT2:
MOV BX,FLAG0
CMP BX,0FFFFH
JE NEXT20
NEXT21:
RET
DIV_64 ENDP
;-----------------------------
CSEG ENDS
;*****************************
END START
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -