给非引导软盘制作免开关功能的小程序
计算机在启动过程中,进行系统的各种外设检测之后需要加载系统,这时调用的是中断INT 19H,它的基本功能就是将磁盘0柱0面1扇区的主引导区内容读到内存0H:7C00H处并将控制权交给主引导程序,由主引导程序加载执行引导系统来实现机器的启动。当软驱插入非引导盘后,由于系统认为是要从软盘引导系统,会将非引导盘的主引导扇区内容读入内存并交出控制权,但众所周知非引导盘的主引导扇区内容为空,所以会造成死机。
笔者利用系统引导过程的基本原理,自己编制了一个非引导盘免开关的主引导程序,其基本思想是:当系统将非引导盘主引导扇区中存放的笔者开发的程序指令读到内存并交控制权,实用程序接管控制权后将自身移到0H:7E00H处并将硬盘主引导扇区的内容读取,显示提示信息之后将控制权又重新将给硬盘主引导程序,让硬盘的主引导程序实现系统的引导过程。
该程序实现过程中需要注意三个问题:其一是程序接管控制权后跳转地址的形成,需要进行特殊的处理;其二是程序移动后有关信息和参数地址的处理;其三是将控制权交给硬盘主引导扇区程序时压入堆栈的地址必须正确。
#3 实现该功能的DEBUGEXE数据文件内容如下:
C>TYPE FLOPPYDAT
A 100
CLI
XOR AX,AX ;成堆栈指针
MOV SS,AX
MOV SP,7C00
MOV AX,7B00
PUSH AX ;形成数据段
PUSH AX ;形成附加段
POP DS
POP ES
MOV SI,0100
MOV DI,0300
MOV CX,0100 ;移动引导区内容
REPZ ;7C00H开始处512字节
MOVSW ;移到7E00H开始处
MOV AX,7D00
PUSH AX
PUSH AX
PUSH AX
POP DS ;形成新的数据段
POP ES ;形成新的附加段
MOV AX,0127
PUSH AX
RETF ;转移到127处
STI ;即7E69H处
MOV SI,01B7
CALL 0168
XOR AX,AX ;INT 13H读盘段
地址
PUSH AX
POP ES ;读硬盘主引导扇区到
7C00H处
MOV AX,0201
MOV BX,7C00
MOV CX,0001
MOV DX,0080
PUSH ES
PUSH BX
INT 13 ;读硬盘主引导扇区
JB 014E
ES:
CMP WORD PTR [7DFE],AA55
JNZ 014E ;判断引导区标志
RETF
XOR DX,DX ;从软盘引导
INT 19
;(空行)
A 2FE
DB 55,AA ;设置分区标志
;(空行)
W 100 0 0 1 ;写入软盘
Q
使用方法:将已格式化非引导软盘插入A驱中(若是B驱将命令W中的001改为101),然后执行“C>DEBUG<FLOPPY.DAT”命令,可重复操作以确保写盘成功。
该方法在各种规格的磁盘上及DOS 3.3-DOS 6.22下均试用通过,有兴趣读者不妨一试。