ITEEDU

通过这个程序,大家不仅可以掌握读取磁盘扇区的方法,同时这里面还有更深一层的问题。

READDISK.COM
-A100[Enter]
12A3:0100	MOV	AH,00		;复位软盘驱动器
12A3:0102	INT	13		
12A3:0104	MOV	AH,02		;准备读取扇区
12A3:0106	MOV	AL,01		;读取一个扇区
12A3:0108	MOV	CH,00		;此扇区是0磁道的
12A3:010A	MOV	CL,01		;第一扇区
12A3:010C	MOV	DH,00		;此扇区在磁盘的0面
				
12A3:010E	MOV	DL,00		;读取A驱
12A3:0110	MOV	BX,0200		;缓冲区首定为200H
12A3:0113	INT	13			;读入数据
12A3:0115	INT	20			;结束
12A3:0117 	[Enter] 			

先在A驱动器中放一片软盘,而后运行这个程序,看看驱动器是否有动作。然后我们列出刚刚读入内存的数据:

-G=100[Enter]
-d2000[Enter]
12A3:0200	EB 3C 90 4D 53 44 4F 53-35 2E 30 00 02 01 01 00		.<.MSDOS5.0.....
			
12A3:0210	02 E0 00 40 0B F0 09 00-12 00 02 00 00 00 00 00		...@............
			
12A3:0220	00 00 00 00 00 00 29 FC-10 13 18 4E 4F 20 4E 41		......)....NO NA
			
12A3:0230	4D 45 20 20 20 20 46 41-54 31 32 20 20 20 FA 33		ME?FAT12?.3
			
12A3:0240	C0 8E D0 BC 00 7C 16 07-BB 78 00 36 C5 37 1E 56		.....|...x.6.7.V
			
12A3:0250	16 53 BF 3E 7C B9 0B 00-FC F3 A4 06 1F C6 45 FE		.S.>|.........E.
			
12A3:0260	0F 8B 0E 18 7C 88 4D F9-89 47 02 C7 07 3E 7C FB		....|.M..G...>|.
			
12A3:0270	CD 13 72 79 33 C0 39 06-13 7C 74 08 8B 0E 13 7C		..ry3.9..|t....|

大家看到的内容可能与笔者给出的不一样,原因在于我们使用了不同的格式化程序。如果是使用MSDOS6.20所带的FORMAT程序格式化磁盘,而且保证系统无病毒入侵的情况下,那么大家应该看到笔者所给出的数据。 将准备好的几片磁盘依次放入驱动器中并运行此程序,如果这些磁盘确实使用同一程序做的格式化,那么就会发现在这些磁盘的0面0磁道的第一个扇区内存储着相同的内容。由此我们可以得出这样一个结论:当一片磁盘格式化完毕后,这片磁盘的0面0磁道第一个扇区内已经存储了数据,且用不同的程序进行格式化所存储的内容也有区别。 这一扇区内究竟存放的是什么东西,有什么作用呢?从D命令显示的结果来看这些数据中包含有DOS系统的两个隐含文件的文件名,还有一段英文信息。不知道这一段英文信息你是否见过,当我们使用一片不带DOS系统的软盘启动机器时,我们会看到这段信息。从这两点我们可以推断这些数据和操作系统有关。我们下面尝试用U命令将其反汇编,看看能得到些什么:

-U200[Enter]
121D:0200		EB3C	JMP		023E
121D:0202		90		NOP		
121D:0203		4D		DEC		BP
121D:0204		53		PUSH	BX
121D:0205		44		INC		SP
121D:0206		4F		DEC		DI
121D:0207		53		PUSH	BX
121D:0208		352E30	XOR		AX,302E
121D:020B		0002	ADD		[BP+SI],AL
121D:020D		0101	ADD		[BX+DI],AX
121D:020F		0002	ADD		[BP+SI],AL
121D:0211		E000	LOOPNZ	0213
121D:0213		60		DB		60
121D:0214		09F9	OR		CX,DI
121D:0216		0007	POP		ES
121D:0217		000F	ADD		[BX],CL
121D:0219		0002	ADD		[BP+SI],AL
121D:021B		0000	ADD		[BX+SI],AL
121D:021D		0000	ADD		[BX+SI],AL
121D:021F		0000	ADD		[BX+SI],AL


-U23E 252[Enter]
121D:023E	FA		CLI		
121D:023F	33C0	XOR		AX,AX
121D:0241	8ED0	MOV		SS,AX
121D:0243	BC007C	MOV		SP,7C00
121D:0246	16		PUSH	SS
121D:0247	07		POP		ES
121D:0248	BB7800	MOV		BX,0078
121D:024B	36		SS:		
121D:024C	C537	LDS		SI,[BX]
121D:024E	1E		PUSH	DS
121D:024F	56		PUSH	SI
121D:0250	16		PUSH	SS
121D:0251	53		PUSH	BX
121D:0252	BF3E7C	MOV		DI,7C3E

 反汇编的结果看上去有些乱,不过仔细观察第一条指令和偏移023E处起始的指令可以看出,这是一段具有逻辑性的程序,并非是杂乱无章的指令。事实上这确是一段程序,而且是一段具有重要意义的程序。