|
19951001
高级用户
流落街头
积分 570
发帖 272
注册 2005-10-17 来自 北京
状态 离线
|
『楼 主』:
关于 INT25 读磁盘的问题〔已结〕
经确认 INT25/26 不能读写 FAT32 ,要读写 FAT32要使用 INT21,我在3楼给出的程序,读出的FAT32扇区是乱码
[ Last edited by 19951001 on 2007-1-16 at 09:47 PM ]
|
|
2007-1-9 03:29 |
|
|
GOTOmsdos
铂金会员
C++启程者
积分 5154
发帖 1827
注册 2003-7-18
状态 离线
|
『第
2 楼』:
没有什么问题,INT25,26只能处理软盘.
|
|
2007-1-9 04:16 |
|
|
19951001
高级用户
流落街头
积分 570
发帖 272
注册 2005-10-17 来自 北京
状态 离线
|
『第
3 楼』:
Quote: | Originally posted by GOTOmsdos at 2007-1-9 04:16:
没有什么问题,INT25,26只能处理软盘. |
|
怎么会是这样, INT25, INT26属于DOS调用, 理论上说 FAT32 分区 DOS 7 是能够访问的. 以下是一个老外的程序, 在我的 fat32 分区上成功执行了
; -*- fundamental -*- (asm-mode sucks)
; $Id: copybs.asm,v 1.4 2004/12/14 23:03:28 hpa Exp $
; -----------------------------------------------------------------------
;
; Copyright 1998-2004 H. Peter Anvin - All Rights Reserved
;
; This program is free software; you can redistribute it and/or modify
; it under the terms of the GNU General Public License as published by
; the Free Software Foundation, Inc., 53 Temple Place Ste 330,
; Boston MA 02111-1307, USA; either version 2 of the License, or
; (at your option) any later version; incorporated herein by reference.
;
; -----------------------------------------------------------------------
;
; copybs.asm
;
; Small DOS program to copy the boot sector from a drive
; to a file
;
; Usage: copybs <drive>: <file>
;
absolute 0
pspInt20: resw 1
pspNextParagraph: resw 1
resb 1 ; reserved
pspDispatcher: resb 5
pspTerminateVector: resd 1
pspControlCVector: resd 1
pspCritErrorVector: resd 1
resw 11 ; reserved
pspEnvironment: resw 1
resw 23 ; reserved
pspFCB_1: resb 16
pspFCB_2: resb 16
resd 1 ; reserved
pspCommandLen: resb 1
pspCommandArg: resb 127
section .text
org 100h ; .COM format
_start:
mov ax,3000h ; Get DOS version
int 21h
xchg al,ah
mov [DOSVersion],ax
cmp ax,0200h ; DOS 2.00 minimum
jae dosver_ok
mov dx,msg_ancient_err
jmp die
section .bss
alignb 2
DOSVersion: resw 1
section .text
;
; Scan command line for a drive letter followed by a colon
;
dosver_ok:
xor cx,cx
mov si,pspCommandArg
mov cl,[pspCommandLen]
cmdscan1: jcxz bad_usage ; End of command line?
lodsb ; Load character
dec cx
cmp al,' ' ; White space
jbe cmdscan1
or al,020h ; -> lower case
cmp al,'a' ; Check for letter
jb bad_usage
cmp al,'z'
ja bad_usage
sub al,'a' ; Convert to zero-based index
mov [DriveNo],al ; Save away drive index
section .bss
DriveNo: resb 1
section .text
;
; Got the leading letter, now the next character must be a colon
;
got_letter: jcxz bad_usage
lodsb
dec cx
cmp al,':'
jne bad_usage
;
; Got the colon; now we should have at least one whitespace
; followed by a filename
;
got_colon: jcxz bad_usage
lodsb
dec cx
cmp al,' '
ja bad_usage
skipspace: jcxz bad_usage
lodsb
dec cx
cmp al,' '
jbe skipspace
mov di,FileName
copyfile: stosb
jcxz got_cmdline
lodsb
dec cx
cmp al,' '
ja copyfile
jmp short got_cmdline
;
; We end up here if the command line doesn't parse
;
bad_usage: mov dx,msg_unfair
jmp die
section .data
msg_unfair: db 'Usage: copybs <drive>: <filename>', 0Dh, 0Ah, '$'
section .bss
alignb 4
FileName resb 256
;
; Parsed the command line OK. Get device parameter block to get the
; sector size.
;
struc DPB
dpbDrive: resb 1
dpbUnit: resb 1
dpbSectorSize: resw 1
dpbClusterMask: resb 1
dpbClusterShift: resb 1
dpbFirstFAT: resw 1
dpbFATCount: resb 1
dpbRootEntries: resw 1
dpbFirstSector: resw 1
dpbMaxCluster: resw 1
dpbFATSize: resw 1
dpbDirSector: resw 1
dpbDriverAddr: resd 1
dpbMedia: resb 1
dpbFirstAccess: resb 1
dpbNextDPB: resd 1
dpbNextFree: resw 1
dpbFreeCnt: resw 1
endstruc
section .bss
alignb 2
SectorSize resw 1
section .text
got_cmdline:
xor al,al ; Zero-terminate filename
stosb
mov dl,[DriveNo]
inc dl ; 1-based
mov ah,32h
int 21h ; Get Drive Parameter Block
and al,al
jnz filesystem_error
mov dx,[bx+dpbSectorSize] ; Save sector size
;
; Read the boot sector.
;
section .data
align 4, db 0
DISKIO equ $
diStartSector: dd 0 ; Absolute sector 0
diSectors: dw 1 ; One sector
diBuffer: dw SectorBuffer ; Buffer offset
dw 0 ; Buffer segment
section .text
read_bootsect:
mov ax,cs ; Set DS <- CS
mov ds,ax
mov [SectorSize],dx ; Saved sector size from above
cmp word [DOSVersion],0400h ; DOS 4.00 has a new interface
jae .new
.old:
mov bx,SectorBuffer
mov cx,1 ; One sector
jmp short .common
.new:
mov [diBuffer+2],ax ; == DS
mov bx,DISKIO
mov cx,-1
.common:
xor dx,dx ; Absolute sector 0
mov al,[DriveNo]
int 25h ; DOS absolute disk read
pop ax ; Remove flags from stack
jc disk_read_error
;
; Open the file and write the boot sector to the file.
;
mov dx,FileName
mov cx,0020h ; Attribute = ARCHIVE
mov ah,3Ch ; Create file
int 21h
jc file_write_error
mov bx,ax
push ax ; Handle
mov cx,[SectorSize]
mov dx,SectorBuffer
mov ah,40h ; Write file
int 21h
jc file_write_error
cmp ax,[SectorSize]
jne file_write_error
pop bx ; Handle
mov ah,3Eh ; Close file
int 21h
jc file_write_error
;
; We're done!
;
mov ax,4C00h ; exit(0)
int 21h
;
; Error routine jump
;
filesystem_error:
mov dx,msg_filesystem_err
jmp short die
disk_read_error:
mov dx,msg_read_err
jmp short die
file_write_error:
mov dx,msg_write_err
die:
push cs
pop ds
push dx
mov dx,msg_error
mov ah,09h
int 21h
pop dx
mov ah,09h ; Write string
int 21h
mov ax,4C01h ; Exit error status
int 21h
section .data
msg_error: db 'ERROR: $'
msg_ancient_err: db 'DOS version 2.00 or later required', 0Dh, 0Ah, '$'
msg_filesystem_err: db 'Filesystem not found on disk', 0Dh, 0Ah, '$'
msg_read_err: db 'Boot sector read failed', 0Dh, 0Ah, '$'
msg_write_err: db 'File write failed', 0Dh, 0Ah, '$'
section .bss
alignb 4
SectorBuffer: resb 4096
|
|
2007-1-9 04:55 |
|
|
GOTOmsdos
铂金会员
C++启程者
积分 5154
发帖 1827
注册 2003-7-18
状态 离线
|
『第
4 楼』:
这个ASM是调用的25H,查了TC3的ABSREAD()的说明,是INT 25的我试过用ABSREAD()未能成功读硬盘,INT13就行,我也不知原因 .
这个ASM是不是还另外作了特别处理?
|
|
2007-1-9 05:24 |
|
|
19951001
高级用户
流落街头
积分 570
发帖 272
注册 2005-10-17 来自 北京
状态 离线
|
『第
5 楼』:
Quote: | Originally posted by GOTOmsdos at 2007-1-9 05:24:
这个ASM是调用的25H,查了TC3的ABSREAD()的说明,是INT 25的我试过用ABSREAD()未能成功读硬盘,INT13就行,我也不知原因 .
这个ASM是不是还另外作了特别处理? |
|
全部代码都在
|
|
2007-1-9 06:11 |
|
|
GOTOmsdos
铂金会员
C++启程者
积分 5154
发帖 1827
注册 2003-7-18
状态 离线
|
『第
6 楼』:
我也感到很奇怪,我这里有本专讲硬盘编程的书,从头到尾未提int25-26一字!
|
|
2007-1-10 11:31 |
|
|
cnch
中级用户
积分 326
发帖 70
注册 2003-1-10
状态 离线
|
『第
7 楼』:
INT25,INT26确实能对硬盘进行读写,但仅适用于FAT12,FAT16,要读写FAT32须调用INT21(7305H) ,它可以读写软盘、硬盘,支持FAT12、FAT16、FAT32,但要求WIN95OSR2及以后版本的操作系统
[ Last edited by cnch on 2007-3-24 at 03:52 AM ]
|
|
2007-3-24 03:49 |
|
|
GOTOmsdos
铂金会员
C++启程者
积分 5154
发帖 1827
注册 2003-7-18
状态 离线
|
『第
8 楼』:
Quote: | Originally posted by cnch at 2007-3-24 03:49 AM:
INT25,INT26确实能对硬盘进行读写,但仅适用于FAT12,FAT16,要读写FAT32须调用INT21(7305H) ,它可以读写软盘、硬盘,支持FAT12、FAT16、FAT32,但要求WIN95OSR2及以后版 ... |
|
调用中断读写硬盘是物理(扇区)方式嘛,应该跟文件系统没有关系吧
所需要的仅仅是BIO硬盘S信息和硬盘软盘控制器信息吧?
|
|
2007-3-24 06:21 |
|
|
cnch
中级用户
积分 326
发帖 70
注册 2003-1-10
状态 离线
|
『第
9 楼』:
Quote: | Originally posted by GOTOmsdos at 2007-3-24 06:21 AM:
调用中断读写硬盘是物理(扇区)方式嘛,应该跟文件系统没有关系吧
所需要的仅仅是BIO硬盘S信息和硬盘软盘控制器信息吧? |
|
哦,只要BIOS硬盘信息和硬盘软盘控制器信息INT13即可.现成的应用程序太多啦,何必如此辛苦?
|
|
2007-3-27 04:12 |
|
|
wzsunlight
初级用户
积分 107
发帖 52
注册 2007-3-10
状态 离线
|
『第
10 楼』:
Quote: | Originally posted by cnch at 2007-3-26 03:12 PM:
哦,只要BIOS硬盘信息和硬盘软盘控制器信息INT13即可.现成的应用程序太多啦,何必如此辛苦? |
|
同意
|
|
2007-3-28 18:45 |
|
|
download
初级用户
积分 199
发帖 101
注册 2007-3-13
状态 离线
|
『第
11 楼』:
造轮子的工作……一直在重复着。没多大意思
|
|
2007-3-29 00:34 |
|
|