首頁 > 文章中心 > 正文

          硬盤參數(shù)測試

          前言:本站為你精心整理了硬盤參數(shù)測試范文,希望能為你的創(chuàng)作提供參考價值,我們的客服老師可以幫助你提供個性化的參考范文,歡迎咨詢。

          硬盤參數(shù)測試

          《計算機(jī)世界月刊》1995年第八期上刊登了李宇先生的一篇文章,介紹了測試PC機(jī)軟硬盤參數(shù)的方法。文中介紹的讀取硬盤參數(shù)的方法是通過讀取并分析硬盤主引導(dǎo)記錄Masterbootrecord來取得硬盤信息的。此方法適用范圍比較廣。事實上由于現(xiàn)在很多PC都使用IDE型的硬盤,因此,我們也可以通過直接編程IDE控制器的方法獲得硬盤參數(shù)。下面簡單介紹一下這個方法,并給出一個匯編程序供大家參考。

          IDE(IntegratedDriveElectronics)有時也被稱為ATAPI型控制器。此種控制器速度快,集成度高,在PC機(jī)中應(yīng)用廣泛。我們可以通過一些IDE控制命令來完成硬盤的讀/寫/校驗等各種操作。本文僅介紹其中的硬盤測試命令--0ECH。表1列出了IDE控制器的端口寄存器分配及功能,其中"主狀態(tài)寄存器"(1F7H)的各位定義如表2。

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

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

          表3

          輸出IDE控制命令可采用下列步驟:

          (1)向端口3F6H寫入控制字節(jié),建立相應(yīng)的硬盤控制方式;

          (2)檢驗控制器和驅(qū)動器的狀態(tài)(通過檢測端口1F7H的B7、B6兩位),若控制器空閑且驅(qū)動器就緒,即可輸出命令;

          (3)完整地輸出7B長的命令塊,依次寫入端口1F1H-1F7H,不論是否需要,端口1F1H-1F6H對應(yīng)的前6B參數(shù)必須輸出,端口1F7H輸出命令碼0ECH;

          (4)檢測端口1F7H的B7、B3位,若控制器空閑且B3置1,表示操作結(jié)束,即可讀取結(jié)果;

          (5)通過端口1F0H獨取100H字至緩沖區(qū);

          (6)再次讀取端口1F7H,判斷B0位是否為0,若B0=0,表示命令成功,否則表示命令失敗,轉(zhuǎn)至錯誤處理;

          (7)通過表4所示的偏移量,讀取我們所需的信息并轉(zhuǎn)換成可顯示的信息。

          表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