也談?dòng)脖P(pán)參數(shù)測(cè)試t2gg
《計(jì)算機(jī)世界月刊》1995年第八期上刊登了李宇先生的一篇文章,介紹了測(cè)試PC機(jī)軟硬盤(pán)參數(shù)的方法。文中介紹的讀取硬盤(pán)參數(shù)的方法是通過(guò)讀取并分析硬盤(pán)主引導(dǎo)記錄Masterboot record來(lái)取得硬盤(pán)信息的。此方法適用范圍比較廣。事實(shí)上由于現(xiàn)在很多PC都使用IDE型的硬盤(pán),因此,我們也可以通過(guò)直接編程IDE控制器的方法獲得硬盤(pán)參數(shù)。下面簡(jiǎn)單介紹一下這個(gè)方法,并給出一個(gè)匯編程序供大家參考。
IDE(Integrated Drive Electronics)有時(shí)也被稱(chēng)為ATAPI型控制器。此種控制器速度快,集 成度高,在PC機(jī)中應(yīng)用廣泛。我們可以通過(guò)一些IDE控制命令來(lái)完成硬盤(pán)的讀/寫(xiě)/校驗(yàn)等各種操作。本文僅介紹其中的硬盤(pán)測(cè)試命令--0ECH。表1列出了IDE控制器的端口寄存器分配及功能,其中"主狀態(tài)寄存器"(1F7H)的各位定義如表2。
表1 IDE端口寄存器地址及功能表2
"硬盤(pán)控制寄存器"(3F6H)各位定義如表3。
表3
輸出IDE控制命令可采用下列步驟:
(1)向端口3F6H寫(xiě)入控制字節(jié),建立相應(yīng)的硬盤(pán)控制方式;
(2)檢驗(yàn)控制器和驅(qū)動(dòng)器的狀態(tài)(通過(guò)檢測(cè)端口1F7H的'B7、B6兩位),若控制器空閑且驅(qū)動(dòng)器就緒,即可輸出命令;
(3)完整地輸出7B長(zhǎng)的命令塊,依次寫(xiě)入端口1F1H-1F7H,不論是否需要,端口1F1H-1F6H對(duì)應(yīng)的前6B參數(shù)必須輸出,端口1F7H輸出命令碼0ECH;
(4)檢測(cè)端口1F7H的B7、B3位,若控制器空閑且B3置1,表示操作結(jié)束,即可讀取結(jié)果;
(5)通過(guò)端口1F0H獨(dú)取100H字至緩沖區(qū);
(6)再次讀取端口1F7H,判斷B0位是否為0,若B0=0,表示命令成功,否則表示命令失敗,轉(zhuǎn)至錯(cuò)誤處理;
(7)通過(guò)表4所示的偏移量,讀取我們所需的信息并轉(zhuǎn)換成可顯示的信息。
表4
源程序如下。
.MODEL SMALL
.286
.DATA
copydb 'IDE hard drive identify program 1.0',0dh,0ah
db 'Copyright (c) 1995 by LiChunsheng',0dh,0ah
db 'All rights reserved.'
db 0dh,0ah,0ah,'Model Number......'
iofm dw 14h dup(2020h)
db 0dh,0ah,'Firmware Revision....'
dw 4 dup(2020h)
db 0dh,0ah,'Serial number......'
dw 0ah dup(2020h)
db 0ah
db 0dh,0ah,'Cylinders......'
nofcdb 5 dup(20h)
db 0dh,0ah,'Heads......'
db 5 dup(20h)
db 0dh,0ah,'Sectors per track...'
db 5 dup(20h)
db 0dh,0ah,'Bytes per track....'
db 5 dup(20h)
db 0dh,0ah,'Bytes per sector....'
db 5 dup(20h)
db 0dh,0ah,'Buffer size(KB).....'
db 5 dup(20h)
db 0dh,0ah,'ECC bytes......'
db 5 dup(20h)
db 0dh,0ah,'Drive capacity......'
db 5 dup(20h)
db 'MB',24h
addrdb 2,6,12,8,10,42,44
addr1dw 36h,14h,2eh,04h,14h,0ah
cmddb 0,0,0,0,0,0,0ech
hdinfodw 100h dup(?)
t-o-msg db 'Time out of range!!!',0dh,0ah,24h
errmsg db 'Error!!!',0dh,0ah,24h
.CODE
dec160PROC
push di
push dx
push cx
push ax
mov al,20h
std
cmp dx,9999
ja dloop
stosb
cmp dx,999
ja dloop
stosb
cmp dx,99
ja dloop
stosb
cmp dx,9
ja dloop
stosb
dloop:mov ax,dx
mov dx,0
mov cx,10
div cx
xchg ax,dx
add al,30h
stosb
cmp dx,0
jnz dloop
pop ax
pop cx
pop dx
pop di
cld
ret
dec160endp
mainPROC
mov ax,@DATA
mov ds,ax
mov es,ax
mloop1:
mov cx,0
mov dx,1f7h
mloop2:in al,dx
and al,11000000b
cmp al,01000000b
jz d-rdy
loop mloop2
jmp time-out
d-rdy:mov al,0
mov dx,3f6h
out dx,al
mov si,offset cmd
mov al,byte ptr
and al,1
mov cl,4
shl al,cl
or al,0a0h
mov byte ptr,al
mov dx,1f1h
mov cx,7
mloop3:
lodsb
out dx,al
inc dx
loop mloop3
dec dx
xor cx,cx
mloop4:
in al,dx
and al,10001000b
cmp al,00001000b
jz readdata
loop mloop4
jmp time-out
readdata:
cli
cld
mov dx,1f0h
mov di,offset hdinfo
mov cx,100h
repz insw
sti
mov dx,1f7h
in al,dx
and al,71h
xor al,50h
jnz errend
mov si,offset addr
mov di,offset nofc
add di,4
mov bh,0
mov cx,7
mloop6:
mov bl,byte ptr
mov dx,word ptr
call dec160
inc si
add di,28
loop mloop6
mov ax,1
mov si,offset addr
mov cx,3
mloop7:
mov bl,byte ptr
mul word ptr
inc si
loop mloop7
mov bx,2048
div bx
mov dx,ax
call dec160
mov bx,offset hdinfo
mov si,offset addr1
mov di,offset iofm
mov cx,3
mloop8:
push cx
push bx
add bx,
mov cx,
add si,4
mloop9:mov ax,word ptr
xchg ah,a1
stosb
mov al,ah
stosb
add bx,2
loop mloop9
pop bx
pop cx
add di,23
loop mloop8
mov dx,offset copy
jmp endproc
time-out:
mov dx,offset t-o-msg
jmp endproc
errend:
mov dx,offset errmsg
endproc:
mov ah,09h
int 21h
mov ah,4ch
int 21h
mainendp
end main
作者:李春生
【也談?dòng)脖P(pán)參數(shù)測(cè)試t2gg】相關(guān)文章: