给非引导软盘制作免开关功能的小程序

Author: 赵桂华 Date: 1997-01-01

  非引导软盘是指磁盘上不具有引导程序、不能在软驱上启动机器的数据磁盘。使用该类型磁盘最不方便的就是当重新引导系统时必须打开驱动器门,机器启动后再并关好驱动器门,否则就会出现死机现象,导致不得不重新启动机器,即浪费时间又影响设备使用寿命。虽然可以利用修改CMOS设置从C盘优先启动机器,但很多用户都不习惯这样做,另外有些机器没有这项功能。    笔者通过分析系统启动原理,利用模拟系统引导程序的方法,实现了非引导软盘免开关的功能。
  计算机在启动过程中,进行系统的各种外设检测之后需要加载系统,这时调用的是中断INT 19H,它的基本功能就是将磁盘0柱0面1扇区的主引导区内容读到内存0H:7C00H处并将控制权交给主引导程序,由主引导程序加载执行引导系统来实现机器的启动。当软驱插入非引导盘后,由于系统认为是要从软盘引导系统,会将非引导盘的主引导扇区内容读入内存并交出控制权,但众所周知非引导盘的主引导扇区内容为空,所以会造成死机。
  笔者利用系统引导过程的基本原理,自己编制了一个非引导盘免开关的主引导程序,其基本思想是:当系统将非引导盘主引导扇区中存放的笔者开发的程序指令读到内存并交控制权,实用程序接管控制权后将自身移到0H:7E00H处并将硬盘主引导扇区的内容读取,显示提示信息之后将控制权又重新将给硬盘主引导程序,让硬盘的主引导程序实现系统的引导过程。
  该程序实现过程中需要注意三个问题:其一是程序接管控制权后跳转地址的形成,需要进行特殊的处理;其二是程序移动后有关信息和参数地址的处理;其三是将控制权交给硬盘主引导扇区程序时压入堆栈的地址必须正确。
#3  实现该功能的DEBUGEXE数据文件内容如下:
  C>TYPE FLOPPYDAT
  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下均试用通过,有兴趣读者不妨一试。