对硬盘进行操作的常用端口是1f0h~1f7h号端口,各端口含义如下:
端口号 读还是写 具体含义
1F0H 读/写
用来传送读/写的数据(其内容是正在传输的一个字节的数据)
1F1H 读 用来读取错误码
1F2H 读/写 用来放入要读写的扇区数量
1F3H 读/写 用来放入要读写的扇区号码
1F4H 读/写 用来存放读写柱面的低8位字节
1F5H 读/写
用来存放读写柱面的高2位字节(其高6位恒为0)
1F6H 读/写 用来存放要读/写的磁盘号及磁头号
第7位 恒为1
第6位 恒为0
第5位 恒为1
第4位 为0代表第一块硬盘、为1代表第二块硬盘
第3~0位 用来存放要读/写的磁头号
1f7H 读 用来存放读操作后的状态
第7位 控制器忙碌
第6位 磁盘驱动器准备好了
第5位 写入错误
第4位 搜索完成
第3位 为1时扇区缓冲区没有准备好
第2位 是否正确读取磁盘数据
第1位 磁盘每转一周将此位设为1,
第0位 之前的命令因发生错误而结束
写 该位端口为命令端口,用来发出指定命令
为50h 格式化磁道
为20h 尝试读取扇区
为21h 无须验证扇区是否准备好而直接读扇区
为22h
尝试读取长扇区(用于早期的硬盘,每扇可能不是512字节,而是128字节到1024之间的值)
为23h 无须验证扇区是否准备好而直接读长扇区
为30h 尝试写扇区
为31h 无须验证扇区是否准备好而直接写扇区
为32h 尝试写长扇区
为33h 无须验证扇区是否准备好而直接写长扇区
IDE接口采用任务文件寄存器方式与主机传送信息,主机为任务文件寄存器分配了两组I/O地址空间。常用的一组为1F0-1F8H,采用IRQ14中断;另一组为170-178H,采用IRQ15中断。我们可以通过I/O端口直接操作任务文件寄存器来读取硬盘驱动器参数,以完成硬盘驱动器检测。具体方法如下:
首先从1F7H端口检测硬盘驱动器状态,等待驱动器空闲。
C:\WINDOWS\COMMAND>DEBUG
-A 100
XXXX:0100 MOV DX,1F7
XXXX:0103 IN AL,DX
XXXX:0104 TEST AL,80
XXXX:0106 JNZ 103
向1F6H端口填写主驱动器信息,1F6H端口定义为:
bit0-3 磁头号
bit4 主驱动器为0,从驱动器为1
bit6 CHS寻址方式为0,LBA寻址方式为1
bit5和bit7 常数1
程序为:
XXXX:0108 MOV DX,1F6
XXXX:010B MOV AL,E0 ;LBA寻址方式
XXXX:010D OUT DX,AL
向1F7H端口填写磁头0柱面命令,检测1F7H端口,等待返回并接收下一个命令的状态信息,查看是否是IDE硬盘驱动器,如不是IDE硬盘驱动器,则结束程序运行。
XXXX:010E MOV BX,0
XXXX:0111 MOV AL,10
XXXX:0113 MOV DX,1F7
XXXX:0116 OUT DX,AL
XXXX:0117 IN AL,DX
XXXX:0118 INC BX
XXXX:0119 CMP BX,7FFF
XXXX:011D JNZ 120
XXXX:011F INT 3
XXXX:0120 CMP AL,50
XXXX:0122 JNZ 117
如不是IDE驱动器,程序将在11FH INT
3处结束。若是IDE驱动器,则向1F7H端口填写读驱动器参数命令,检测1F7H端口,等待控制器缓冲存储器请求数据输入。
XXXX:0124 MOV DX,1F6
XXXX::0127 MOV AL,E0
XXXX:0129 OUT DX,AL
XXXX:012A MOV DX,1F7
XXXX:012D MOV AL,EC ;读缓冲区命令号
XXXX:012F OUT DX,AL
XXXX:0130 IN AL,DX
XXXX:0131 CMP AL,58
XXXX:0133 JNZ 130
从1F0H端口读取256个字(512个字节)的IDE硬盘驱动器参数,存入数据缓冲区。
XXXX:0135 MOV BX,200 ;缓冲区地址
XXXX:0138 MOV CX,100
XXXX:013B MOV DX,1F0
XXXX:013E IN AX,DX
XXXX:013F XCHG AH,AL ;交换存储位置
XXXX:0141 MOV [BX],AX
XXXX:0143 ADD BX,2
XXXX:0146 LOOP 13E
XXXX:0148 INT 20
XXXX:014A
-G ;运行
如果不是IDE硬盘,则会在11F的INT
3处结束,并显示如下信息:
AX=XXXX …
…
XXXX:011F CC INT 3
如果是IDE硬盘,则显示:
Program terminated normally
程序正常结束后,信息保存在200-3FFH处,可用D命令显示其内容:
-D 200
主要信息说明如下:
202-203H 2字节,16位,柱面数,16进制
206-207H 2字节,仅用4位,磁头数,16进制
20C-20DH 2字节,仅用8位,扇区数,16进制
214-227H 20字节,产品序列号
228-229H 2字节,控制器类型
0:未设定;
1:单端口,单扇区缓冲区;
2:双端口,多扇区缓冲区;
3:双端口,多扇区缓冲区,锁存。
22A-22BH 2字节,缓冲区页数,16进制,每页512字节
22E-235H 8字节,控制器版本号
236-25DH 40字节,硬盘产品型号
目前绝大多数PC的硬盘使用的是IDE/EIDE接口。这种接口的数崐据传输速度快, 集成度高,在电脑中广泛使用。386以上的电脑中崐使用的多功能卡和主板上集成了这种接口, IDE接口控制器提供了崐一些控制命令来完成硬盘的读/写/校验等操作。其中有一条硬盘测崐试命令-“0ECH”,我们可以用这条命令对硬盘控制器直接编程来崐得到硬盘的各种参数和信息。向IDE控制器送入IDE控制命令可以按崐照下面的步骤:
①向端口3F6写入控制字节,建立相应的硬盘控制方式;
②检验硬盘控制器和驱动器的状态(检测端口的第7和第6两位),崐如果控制器空闲而且驱动器就绪,即可输入命令;
③完整的输入7个字节长度的命令块,一次写入端口1F1H-1F7H,崐不论是否需要,端口1F1H-1F6H对应的前6个字节的参数必须读出,崐端口1F7H的输出命令码为“0ECH”;
④检测端口1F7H的第7和第3两位,如果控制器空闲且第3位置1,崐表示操作结束,即可读取结果;
⑤通过端口1F0H读取100H字节到缓冲区;
⑥再次读取端口1F7H, 判断第0位是否为0,如果为0,表示命崐令成功,否则表示命令失败;
读出的256字节信息的主要内容如下:
┏━━━━┯━━━━━━━━━┯━━━━━┓
┃ 偏移量 │ 内 容 │长度(字节)┃
┠────┼─────────┼─────┨
┃02H │柱面数 │2 ┃
┃06H │磁头数 │2 ┃
┃08H │每磁道所含的字节数│2 ┃
┃0AH │没扇区所含的字节数│2 ┃
┃0CH │每磁道所含的扇区数│2 ┃
┃14H │产品的序列号 │20 ┃
┃2AH │硬盘缓冲区容量 │2 ┃
┃2CH │ECC校验码的长度 │2 ┃
┃2EH │硬件修正号 │8 ┃
┃36H │硬盘型号 │40 ┃
┗━━━━┷━━━━━━━━━┷━━━━━┛