汇编怎样读写大容量磁盘?


主题:汇编怎样读写大容量磁盘?
我有一个程序是读写硬盘的启动扇区的,以前用着一直很正常, 但是换了一个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