中国DOS联盟论坛

中国DOS联盟

-- 联合DOS 推动DOS 发展DOS --

联盟域名:www.cn-dos.net  论坛域名:www.cn-dos.net/forum
DOS,代表着自由开放与发展,我们努力起来,学习FreeDOS和Linux的自由开放与GNU精神,共同创造和发展美好的自由与GNU GPL世界吧!

游客:  注册 | 登录 | 命令行 | 搜索 | 上传 | 帮助 »
中国DOS联盟论坛 » DOS开发编程 & 发展交流 (开发室) » 关于 INT25 读磁盘的问题〔已结〕
作者:
标题: 关于 INT25 读磁盘的问题〔已结〕 上一主题 | 下一主题
19951001
高级用户

流落街头



积分 570
发帖 272
注册 2005-10-17
来自 北京
状态 离线
『楼 主』:  关于 INT25 读磁盘的问题〔已结〕 使用 LLM 解释/回答一下

经确认 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 楼』:   使用 LLM 解释/回答一下

没有什么问题,INT25,26只能处理软盘.


2007-1-9 04:16
查看资料  发送邮件  发短消息  网志   编辑帖子  回复  引用回复
19951001
高级用户

流落街头



积分 570
发帖 272
注册 2005-10-17
来自 北京
状态 离线
『第 3 楼』:   使用 LLM 解释/回答一下

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 ,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,

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 ,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,
inc dl ; 1-based
mov ah,32h
int 21h ; Get Drive Parameter Block

and al,al
jnz filesystem_error

mov dx, ; 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 ,dx ; Saved sector size from above

cmp word ,0400h ; DOS 4.00 has a new interface
jae .new
.old:
mov bx,SectorBuffer
mov cx,1 ; One sector
jmp short .common
.new:
mov ,ax ; == DS
mov bx,DISKIO
mov cx,-1
.common:
xor dx,dx ; Absolute sector 0
mov al,
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,
mov dx,SectorBuffer
mov ah,40h ; Write file
int 21h
jc file_write_error
cmp ax,
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 楼』:   使用 LLM 解释/回答一下

这个ASM是调用的25H,查了TC3的ABSREAD()的说明,是INT 25的我试过用ABSREAD()未能成功读硬盘,INT13就行,我也不知原因 .
这个ASM是不是还另外作了特别处理?


2007-1-9 05:24
查看资料  发送邮件  发短消息  网志   编辑帖子  回复  引用回复
19951001
高级用户

流落街头



积分 570
发帖 272
注册 2005-10-17
来自 北京
状态 离线
『第 5 楼』:   使用 LLM 解释/回答一下

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 楼』:   使用 LLM 解释/回答一下

我也感到很奇怪,我这里有本专讲硬盘编程的书,从头到尾未提int25-26一字!


2007-1-10 11:31
查看资料  发送邮件  发短消息  网志   编辑帖子  回复  引用回复
cnch
中级用户




积分 326
发帖 70
注册 2003-1-10
状态 离线
『第 7 楼』:   使用 LLM 解释/回答一下

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 楼』:   使用 LLM 解释/回答一下

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 楼』:   使用 LLM 解释/回答一下

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 楼』:   使用 LLM 解释/回答一下

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 楼』:   使用 LLM 解释/回答一下

造轮子的工作……一直在重复着。没多大意思


2007-3-29 00:34
查看资料  发短消息  网志   编辑帖子  回复  引用回复

请注意:您目前尚未注册或登录,请您注册登录以使用论坛的各项功能,例如发表和回复帖子等。


可打印版本 | 推荐给朋友 | 订阅主题 | 收藏主题



论坛跳转: