汇编怎样读写大容量磁盘?
我有一个程序是读写硬盘的启动扇区的,以前用着一直很正常,
但是换了一个60GB的硬盘以后,读盘老是出错,更不用说写盘了。
问:汇编怎样读写大容量磁盘?
答:
1.汇编读写硬盘启动扇区,以前都是用的25H、26H中断。
原来的程序用的是 INT 25/26 CX=-1 调用,在大容量
分区运行时,显示:“读写磁盘错!”。只能用于2 GB以下
的磁盘分区(32 MB--2047 MB)。
2.但现在的磁盘分区,基本上都是2 GB以上,所以程序
必须改写。
改写程序用的是 INT21/AX=7305 CX=-1 调用。
用这个方法读写磁盘分区的容量可以达到2 TB(2047 GB)。
以读写启动扇区(BootSector)为例:
读盘程序如下:
; ******************************************
; ** BSREAD.ASM **
; ** 保存引导扇区 **
; ******************************************
.MODEL SMALL
LF EQU 0Ah
CR EQU 0Dh
.DATA
FNAME DB 'HDBOOT.DAT',0
ERMSG DB 'HDBOOT.DAT R/W ERROR !',CR,LF,'$'
OKMSG DB ' OK !',CR,LF,'$'
RWMSG DB ' DISK R/W ERROR !',CR,LF,'$'
Buffer dd 0 ;sector number to start
dw 1 ;number of sectors
dd 0 ;address of buffer
DriveNum DB 3 ; The 1-based drive number (0=default; 1=A, 2=B, and so on).
DAT DB 512 DUP(0)
.CODE
BEGIN:
MOV SI,0 ;SI=0 读,SI=6001h 写文件,
;SI=4001h 写目录,SI=2001h 写FAT 等。
MOV CX,-1 ;cx must be -1
MOV DX,@DATA
MOV DS,DX
MOV BX,OFFSET Buffer ;See below
MOV DX,OFFSET DAT ; DX=开始读的逻辑扇区号
MOV [BX+6],DX ;
MOV DX,DS ; DS:BX 指向内存中存放读入数据的缓存区
MOV [BX+8],DX
MOV DL,DriveNum ; DL=驱动器号(0=当前,1=A,3=C,等)
MOV AX,7305H ; Ext_ABSDiskReadWrite
INT 21H ; 详见 217305.txt
POPF ; Return: CF clear if successful
; CF set on error
; AX = error code
JC ERRRW
NOP
MOV AX,3D01H
MOV DX,OFFSET FNAME ; 文件名地址
INT 21H
JNC EXIST
NOP
MOV AH,3CH ; 如无则建立文件
MOV CX,0020H ; 文件类型
INT 21H
JC ERROR
NOP
EXIST:
MOV BX,AX ; BX=文件号
MOV CX,0200H ; 字节数
MOV DX,OFFSET DAT ; 缓冲区首址
MOV AH,40H ; 写文件
INT 21H
MOV AH,3EH
INT 21H
JC ERRRW
NOP
JMP OK
NOP
ERRRW:
MOV DX,OFFSET RWMSG
MOV AH,9
INT 21H
JMP EXIT
NOP
ERROR:
MOV DX,OFFSET ERMSG
MOV AH,9
INT 21H
JMP EXIT
NOP
OK:
MOV DX,OFFSET OKMSG
MOV AH,9
INT 21H
EXIT:
MOV AX,4C00H
INT 21H
.STACK
END BEGIN
写盘程序如下:
; ******************************************
; ** BSWRITE.ASM **
; ** 恢复主引导扇区 **
; ******************************************
.MODEL SMALL
LF EQU 0Ah
CR EQU 0Dh
.DATA
FNAME DB 'HDBOOT.DAT',0
ERMSG DB 'HDBOOT.DAT Not Found !',CR,LF,'$'
OKMSG DB ' OK !',CR,LF,'$'
RWMSG DB ' DISK R/W ERROR !',CR,LF,'$'
Buffer dd 0 ;sector number to start
dw 1 ;number of sectors
dd 0 ;address of buffer
DriveNum DB 3 ; The 1-based drive number (0=default; 1=A, 2=B, and so on).
DAT DB 512 DUP(0)
.CODE
BEGIN:
MOV DX,@DATA
MOV DS,DX
MOV ES,DX
MOV AX,3D00H ; 打开文件 AL=0 读
MOV DX,OFFSET FNAME ; 文件名地址
INT 21H
JC ERROR
MOV BX,AX ; BX=文件号
MOV CX,0200H ; 字节数
MOV DX,OFFSET DAT ; 缓冲区首址
MOV AH,3FH ; 读文件
INT 21H
MOV AH,3EH
INT 21H
MOV SI,6001H ;SI=0 读,SI=6001h 写文件,
;SI=4001h 写目录,SI=2001h 写FAT 等。
MOV CX,-1 ;cx must be -1
MOV DX,@DATA
MOV DS,DX
MOV BX,OFFSET Buffer ;See below
MOV DX,OFFSET DAT ; DX=开始读的逻辑扇区号
MOV [BX+6],DX ;
MOV DX,DS ; DS:BX 指向内存中存放读入数据的缓存区
MOV [BX+8],DX
MOV DL,DriveNum ; DL=驱动器号(0=当前,1=A,3=C,等)
MOV AX,7305H ; Ext_ABSDiskReadWrite
INT 21H ; 详见 217305.txt
POPF ; Return: CF clear if successful
; CF set on error
; AX = error code
JC ERRRW
NOP
JMP OK
NOP
ERRRW:
MOV DX,OFFSET RWMSG
MOV AH,9
INT 21H
JMP EXIT
NOP
ERROR:
MOV DX,OFFSET ERMSG
MOV AH,9
INT 21H
JMP EXIT
NOP
OK:
MOV DX,OFFSET OKMSG
MOV AH,9
INT 21H
EXIT:
MOV AX,4C00H
INT 21H
.STACK
END BEGIN
程序编译
程序在 MASM6.11 下编译通过。生成:
读C分区引导扇区 bsread.exe 生成 hdboot.dat 数据文件 512 KB
写C分区引导扇区 bsread.exe 读取 hdboot.dat 必须是本机数据。
在 Windows98和 WindowsXP SP2 (FAT32 文件系统)下,运行正常。
但因分区引导扇区操作较大的风险性,读盘可以,写盘建议慎用。
如果一定要用,建议用Ghost作好分区备份,以策安全。
文件系统查询方法:我的电脑 |C: 右键菜单选属性,显示文件系统
(如:FAT32 )。
MASM611编译。
1)改用 Masm6.11 格式。参阅《Masm 6.11 汇编语言教程》-073
.MODEL SMALL
.CODE
.DATA
.STACK 等语句。
2)设置环境参数。(选定汇编系统安装目录,如:H:\MASM611)
建立 h:\msam611\bin\611.bat (下例供参考)
快捷方式在 c:\tools\611.bat
SET PATH=H:\MASM611\BIN;c:\windows;c:\windows\command;c:\tools
SET LIB=H:\MASM611\LIB;%LIB%
SET INCLUDE=H:\MASM611\INCLUDE
SET INIT=H:\MASM611\INIT
SET HELPFILES=H:\MASM611\HELP\*.HLP
3)用连编语句。在 h:\masm611\my\ 目录下
611
ml hdread.asm
即可生成 hdread.exe 。
ml hdwrite.asm
同样生成 hdwrite.exe 。
附:技术资料
INT21/AX=7305 CX=-1 调用详细技术资料
详见: bc06111z.htm
应用程序实例下载
下载: bc06111.rar 10 KB
河石 /编 2006.11.10
黄河之滨 网站 : http://hhstone.vip.sina.com
: http://www.hhstone.com