前言:本站為你精心整理了硬盤參數測試范文,希望能為你的創(chuàng)作提供參考價值,我們的客服老師可以幫助你提供個性化的參考范文,歡迎咨詢。
《計算機世界月刊》1995年第八期上刊登了李宇先生的一篇文章,介紹了測試PC機軟硬盤參數的方法。文中介紹的讀取硬盤參數的方法是通過讀取并分析硬盤主引導記錄Masterbootrecord來取得硬盤信息的。此方法適用范圍比較廣。事實上由于現在很多PC都使用IDE型的硬盤,因此,我們也可以通過直接編程IDE控制器的方法獲得硬盤參數。下面簡單介紹一下這個方法,并給出一個匯編程序供大家參考。
IDE(IntegratedDriveElectronics)有時也被稱為ATAPI型控制器。此種控制器速度快,集成度高,在PC機中應用廣泛。我們可以通過一些IDE控制命令來完成硬盤的讀/寫/校驗等各種操作。本文僅介紹其中的硬盤測試命令--0ECH。表1列出了IDE控制器的端口寄存器分配及功能,其中"主狀態(tài)寄存器"(1F7H)的各位定義如表2。
表1IDE端口寄存器地址及功能表2
"硬盤控制寄存器"(3F6H)各位定義如表3。
表3
輸出IDE控制命令可采用下列步驟:
(1)向端口3F6H寫入控制字節(jié),建立相應的硬盤控制方式;
(2)檢驗控制器和驅動器的狀態(tài)(通過檢測端口1F7H的B7、B6兩位),若控制器空閑且驅動器就緒,即可輸出命令;
(3)完整地輸出7B長的命令塊,依次寫入端口1F1H-1F7H,不論是否需要,端口1F1H-1F6H對應的前6B參數必須輸出,端口1F7H輸出命令碼0ECH;
(4)檢測端口1F7H的B7、B3位,若控制器空閑且B3置1,表示操作結束,即可讀取結果;
(5)通過端口1F0H獨取100H字至緩沖區(qū);
(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