描述:
最近想写一个在dos下的磁盘格式化软件,但不了解硬盘控制器0x170-0x17f端口的使用,请各位提供相关资料.
解决方案1:
            一个通过对硬盘输入输出端口操作来读写硬盘的实例
让我们来看一个关于INT13H读写硬盘程序实例。在例子中详细说明了硬盘的读写操作所用到的端口,并且把通过INT13H读出的主引导区得到的数据和通过输入输出读主引导区得到的数据进行比较,从而证实这两种操作功能相同,程序片段如下:
mov     dx,1f6h         ; 要读入的磁盘号及磁头号
mov     al,0a0h         ;磁盘0,磁头0   
out      dx,al
mov     dx,1f2h         ;要读入的扇区数量
mov     al,1            ;读一个扇区    
out      dx,al 
mov     dx,1f3h         ;要读的扇区号 
mov     al,1            ;扇区号为1
out      dx,al
mov     dx,1f4h         ;要读的柱面的低8位
mov     al,0            ; 柱面低8位为0 
out     dx,al
mov     dx,1f5h         ; 柱面高2位  
mov     al,0            ; 柱面高2位为0(通过1F4H和1F5H端口我们可以确定
; 用来读的柱面号是0)
out      dx,al
mov     dx,1f7h         ;命令端口
mov     al,20h          ; 尝试读取扇区
out      dx,al
still_going:
in      al,dx
test     al,8            ;扇区缓冲是否准备好
jz     still_going     ;如果扇区缓冲没有准备好的话则跳转,直到准备好才向下执行。
mov     cx,512/2        ;设置循环次数(512/2次)
mov     di,offset buffer
mov     dx,1f0h         ;将要传输的一个字节的数据
rep      insw            ;传输数据
;   ------
mov     ax,201h         ;以下是用INT13H读硬盘的0磁头、0柱面、1扇区
mov     dx,80h
mov     cx,1
mov     bx,offset buffer2
int       13h
mov     cx,512         ;以下部分用来比较2种方法读出的硬盘数据
mov     si,offset buffer
mov     di,offset buffer2
repe     cmpsb
jne      failure
mov     ah,9
mov     dx,offset readmsg
int      21h
jmp     good_exit
failure:
mov     ah,9
mov     dx,offset failmsg
int       21h
good_exit:              ;以下部分用来结束程序
mov      ax,4c00h        ;退出程序
int      21h
readmsg db      'The buffers match.  Hard disk read using ports.$'
failmsg db      'The buffers do not match.$'
buffer  db      512 dup ('V')
buffer2 db      512 dup ('L')

