首页 > 文章中心 > 正文

硬盘参数测试

前言:本站为你精心整理了硬盘参数测试范文,希望能为你的创作提供参考价值,我们的客服老师可以帮助你提供个性化的参考范文,欢迎咨询。

硬盘参数测试

《计算机世界月刊》1995年第八期上刊登了李宇先生的一篇文章,介绍了测试PC机软硬盘参数的方法。文中介绍的读取硬盘参数的方法是通过读取并分析硬盘主引导记录Masterbootrecord来取得硬盘信息的。此方法适用范围比较广。事实上由于现在很多PC都使用IDE型的硬盘,因此,我们也可以通过直接编程IDE控制器的方法获得硬盘参数。下面简单介绍一下这个方法,并给出一个汇编程序供大家参考。

IDE(IntegratedDriveElectronics)有时也被称为ATAPI型控制器。此种控制器速度快,集成度高,在PC机中应用广泛。我们可以通过一些IDE控制命令来完成硬盘的读/写/校验等各种操作。本文仅介绍其中的硬盘测试命令--0ECH。表1列出了IDE控制器的端口寄存器分配及功能,其中"主状态寄存器"(1F7H)的各位定义如表2。

表1IDE端口寄存器地址及功能表2

"硬盘控制寄存器"(3F6H)各位定义如表3。

表3

输出IDE控制命令可采用下列步骤:

(1)向端口3F6H写入控制字节,建立相应的硬盘控制方式;

(2)检验控制器和驱动器的状态(通过检测端口1F7H的B7、B6两位),若控制器空闲且驱动器就绪,即可输出命令;

(3)完整地输出7B长的命令块,依次写入端口1F1H-1F7H,不论是否需要,端口1F1H-1F6H对应的前6B参数必须输出,端口1F7H输出命令码0ECH;

(4)检测端口1F7H的B7、B3位,若控制器空闲且B3置1,表示操作结束,即可读取结果;

(5)通过端口1F0H独取100H字至缓冲区;

(6)再次读取端口1F7H,判断B0位是否为0,若B0=0,表示命令成功,否则表示命令失败,转至错误处理;

(7)通过表4所示的偏移量,读取我们所需的信息并转换成可显示的信息。

表4

源程序如下。

.MODELSMALL

.286

.DATA

copydb''''IDEharddriveidentifyprogram1.0'''',0dh,0ah

db''''Copyright(c)1995byLiChunsheng'''',0dh,0ah

db''''Allrightsreserved.''''

db0dh,0ah,0ah,''''ModelNumber......''''

iofmdw14hdup(2020h)

db0dh,0ah,''''FirmwareRevision....''''

dw4dup(2020h)

db0dh,0ah,''''Serialnumber......''''

dw0ahdup(2020h)

db0ah

db0dh,0ah,''''Cylinders......''''

nofcdb5dup(20h)

db0dh,0ah,''''Heads......''''

db5dup(20h)

db0dh,0ah,''''Sectorspertrack...''''

db5dup(20h)

db0dh,0ah,''''Bytespertrack....''''

db5dup(20h)

db0dh,0ah,''''Bytespersector....''''

db5dup(20h)

db0dh,0ah,''''Buffersize(KB).....''''

db5dup(20h)

db0dh,0ah,''''ECCbytes......''''

db5dup(20h)

db0dh,0ah,''''Drivecapacity......''''

db5dup(20h)

db''''MB'''',24h

addrdb2,6,12,8,10,42,44

addr1dw36h,14h,2eh,04h,14h,0ah

cmddb0,0,0,0,0,0,0ech

hdinfodw100hdup(?)

t-o-msgdb''''Timeoutofrange!!!'''',0dh,0ah,24h

errmsgdb''''Error!!!'''',0dh,0ah,24h

.CODE

dec160PROC

pushdi

pushdx

pushcx

pushax

moval,20h

std

cmpdx,9999

jadloop

stosb

cmpdx,999

jadloop

stosb

cmpdx,99

jadloop

stosb

cmpdx,9

jadloop

stosb

dloop:movax,dx

movdx,0

movcx,10

divcx

xchgax,dx

addal,30h

stosb

cmpdx,0

jnzdloop

popax

popcx

popdx

popdi

cld

ret

dec160endp

mainPROC

movax,@DATA

movds,ax

moves,ax

mloop1:

movcx,0

movdx,1f7h

mloop2:inal,dx

andal,11000000b

cmpal,01000000b

jzd-rdy

loopmloop2

jmptime-out

d-rdy:moval,0

movdx,3f6h

outdx,al

movsi,offsetcmd

moval,byteptr

andal,1

movcl,4

shlal,cl

oral,0a0h

movbyteptr,al

movdx,1f1h

movcx,7

mloop3:

lodsb

outdx,al

incdx

loopmloop3

decdx

xorcx,cx

mloop4:

inal,dx

andal,10001000b

cmpal,00001000b

jzreaddata

loopmloop4

jmptime-out

readdata:

cli

cld

movdx,1f0h

movdi,offsethdinfo

movcx,100h

repzinsw

sti

movdx,1f7h

inal,dx

andal,71h

xoral,50h

jnzerrend

movsi,offsetaddr

movdi,offsetnofc

adddi,4

movbh,0

movcx,7

mloop6:

movbl,byteptr

movdx,wordptr

calldec160

incsi

adddi,28

loopmloop6

movax,1

movsi,offsetaddr

movcx,3

mloop7:

movbl,byteptr

mulwordptr

incsi

loopmloop7

movbx,2048

divbx

movdx,ax

calldec160

movbx,offsethdinfo

movsi,offsetaddr1

movdi,offsetiofm

movcx,3

mloop8:

pushcx

pushbx

addbx,

movcx,

addsi,4

mloop9:movax,wordptr

xchgah,a1

stosb

moval,ah

stosb

addbx,2

loopmloop9

popbx

popcx

adddi,23

loopmloop8

movdx,offsetcopy

jmpendproc

time-out:

movdx,offsett-o-msg

jmpendproc

errend:

movdx,offseterrmsg

endproc:

movah,09h

int21h

movah,4ch

int21h

mainendp

endmainHY6YVASD1Q