⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 hdp.asm

📁 实现一个硬盘保护程序
💻 ASM
📖 第 1 页 / 共 2 页
字号:
    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 + -