技术讨论,关于IDE设备的读写

Areslee 2002-08-20 03:06:15
我在直接编程访问IDE设备(就是硬盘啦)时发现如果一次只读写一个扇区时很正常,但用多扇区读写时好象在每个扇的数据传送完之后要等待一段时间才能传送下一扇区,请问有没有人知道这是怎么回事?至少应等待多久?
还有,有没有人做过DMA方式的访问?
...全文
73 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
Areslee 2002-10-08
  • 打赏
  • 举报
回复
搞定了,还是Jiessie说得对,要检查状态寄存器的最高位,下面附上最终版的源代码:
读取3FH处的两个扇区:

code segment
assume cs:code
start:
push cs
pop ds
call waitfree
jnz err
mov dx,1f0h
add dx,3
mov al,3fh
out dx,al
call waitfree
jnz err
mov al,0
inc dx
out dx,al
call waitfree
jnz err
inc dx
out dx,al
call waitfree
jnz err
mov al,0e0h
inc dx
out dx,al
call waitfree
jnz err
mov dx,1f2h
mov al,2
out dx,al
call waitfree
jnz err
mov dx,1f7h
mov al,21h
out dx,al
call waitfree
jnz err
mov cx,256
mov dx,1f0h
mov di,offset sector
push cs
pop es
read: in ax,dx
stosw
loop read
err:
add dx,7
in al,dx
mov bx,ax
__wait: call waitfree
jnz __wait
mov cx,256
mov dx,1f0h
read1: in ax,dx
stosw
loop read1
mov ax,4c00h
int 21h
waitfree proc
push cx
push dx
push ax
Mov DX,1f7H
Sub CX,CX
_Wait: In AL,DX
and al,0d0h
Cmp AL,50H
Jz Ok
Loop _Wait

ok: pop ax
pop dx
pop cx
ret
waitfree endp

align 16
sector dw 512 dup(0)
code ends
end start
Areslee 2002-10-07
  • 打赏
  • 举报
回复
read: in ax,dx
xchg al,ah
stosw
loop read
应该改为:
read: in ax,dx
stosw
loop read
Areslee 2002-10-07
  • 打赏
  • 举报
回复
是的。
会思考的草 2002-10-07
  • 打赏
  • 举报
回复
用IDE寄存器?
Areslee 2002-10-07
  • 打赏
  • 举报
回复
直接IO读硬盘的例子:
读主引导扇区

code segment
assume cs:code
start:
call waitfree
jnz err
mov dx,1f0h
add dx,3
mov al,0
out dx,al
inc dx
out dx,al
inc dx
out dx,al
mov al,0e0h
inc dx
out dx,al
mov dx,1f2h
mov al,1
out dx,al
mov dx,1f7h
mov al,21h
out dx,al
call waitfree
jnz err
mov cx,256
mov dx,1f0h
mov di,offset sector
push cs
pop es
read: in ax,dx
xchg al,ah
stosw
loop read
err:
mov ax,4c00h
int 21h
waitfree proc
push cx
push dx
push ax
Mov DX,1f7H
Sub CX,CX
_Wait: In AL,DX
and al,50h
Cmp AL,50H
Jz Ok
Loop _Wait

ok: pop ax
pop dx
pop cx
ret
waitfree endp

sector dw 256 dup(0)
code ends
end start
Areslee 2002-09-14
  • 打赏
  • 举报
回复
clares.myrice.com/links.htm
zky 2002-09-13
  • 打赏
  • 举报
回复
谁有相关资料,那有下载?
firewings 2002-09-04
  • 打赏
  • 举报
回复
To Areslee(易水):
sorry!我现在对直接端口操作还不是很熟悉。怎样才能够通过in 和out这两个命令向ide设备发送命令呢?所有ide设备的端口都相同吗?具体发送命令的格式是怎样的呢?能不能给一段简单的例子,说明一下?
firewings 2002-08-31
  • 打赏
  • 举报
回复
to Areslee (易水) :
你做的那个直接读的程序能不能也email给我一份?让我也学习学习!我现在有个程序是用int 13h扩展读写硬盘。另外我想试试用直接IO读写cdrw!
先谢谢了!
Areslee 2002-08-31
  • 打赏
  • 举报
回复
那么有人做过DMA传输的吗?

to firewings():
你照着IDE命令集写就行了
Jiessie 2002-08-30
  • 打赏
  • 举报
回复
非常报歉,你前几次问我的问题我都有知道,我想,只能在我离开这公司的时候才能说!

IDE中,每读一个扇区都必须检查 status register.. 直到not BSY和D??东东,记不清了!也就是ATA/ATAPI中所讲的!
dszsun 2002-08-21
  • 打赏
  • 举报
回复
哦,我的程序就是在windows的,看来我用不了那办法哦:(
Areslee 2002-08-21
  • 打赏
  • 举报
回复
我只是做的一个测试程序,你按照IDE规范上去写就行,很简单的。
不知你的程序运行在什么平台下,WINDOWS下是不能这样做的
dszsun 2002-08-21
  • 打赏
  • 举报
回复
哦,做驱动可以?我现在做的就是一个vxd呀。已经在网友 neocosmic(不顾一切) 的指导下用IOS_SendCommand的办法实现了对扇区的读写。
Areslee 2002-08-21
  • 打赏
  • 举报
回复
做区动啊
dszsun 2002-08-20
  • 打赏
  • 举报
回复
关注ing......,
另外,我正在做一个硬盘加密出现,但我用的不是DMA方式,那我还不会,我正在用其它的扇区读写办法。如果我能想你那样直接访问IDE就好呀!你能把你的程序email个我学习吗?谢谢!
dszsun@sina.com

21,459

社区成员

发帖
与我相关
我的任务
社区描述
汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
社区管理员
  • 汇编语言
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧