利用 指令實現讀磁碟

2021-04-20 16:54:52 字數 4936 閱讀 1210

利用bios指令實現了讀磁碟

在大多數情況下,程式只指定讀乙個扇區或讀取乙個磁軌上的全部扇區。讀操作只是順序讀取ch和cl指定的扇區內容,並遞增ch和cl中的磁軌號和扇區號,如果扇區號超過了磁軌的最大扇區號,必須把扇區號重新置1,並把磁軌號增1,或者把雙面盤的0麵變1面。

(1)本程式計算每乙個磁碟位址,每次讀操作之後,扇區號+1,當扇區號加到10則重新置扇區號為1,如果盤面是1則增加磁軌號,然後改變盤面,或由0改為1或由1改為0

(2)資料項currentaddr包含起始的磁軌/扇面位址,endaddr包含結束的磁軌/扇面位址。

bios磁碟操作int 13h處理的記錄都是乙個扇區(512 bytes)的大小,都是以實際的磁軌號和扇區號定址的。讀,寫和檢驗磁碟檔案之前,先把下列暫存器初始化:

ah = 要執行的操作:復位(0), 讀狀態(1), 讀磁碟(2), 寫磁碟(3), 檢驗扇區(4)

al = 扇區數

ch = 柱面/磁軌號(0為起始號)

cl = 起始扇區號(1為起始號)

dh = 磁頭/盤面號,對軟盤是0或1

dl = 驅動器號: 軟盤:0=驅動器a,1=驅動器b,...

硬碟:80h=驅動器1,81h=驅動器2,...

es:bx = 資料區中i/o緩衝區的位址(除檢驗操作外)

下面是本程式源**:

data segment

buffer      db  512 dup(' ')

endcode     db  0

currentaddr dw  0304h       ;beginning track/sector

endaddr     dw  0501h       ;ending track/sector

readerrormsg    db  'read error!'

side        db  0

user        db  1, 1 dup(?) ;user input

data ends

code segment

assume  cs:code, ds:data

main proc near

start:

push    ds

sub ax, ax

push    ax

mov ax, data

mov ds, ax

mov     es, ax

mov ax, 0600h           ;request scroll

@continue:

call    scrollscreen            ;scroll screen

call    setcursor           ;set cursor

call    calcnextdiskaddr        ;calculate next disk address

mov cx, currentaddr         

mov dx, endaddr         

cmp cx, dx              ;is at ending sector?

je  @exit               ;yes, exit

call    readdiskrecord          ;read disk record

cmp endcode, 0          ;normal read?

jnz @exit               ;no, exit

call    displaysector           ;display sector content

jmp @continue

@exit:

retmain endp

;calculate next disk address

calcnextdiskaddr proc near

mov cx, currentaddr         ;get track/sector

cmp cl, 10              ;pass last sector

jne @***aexit           ;no, exit

cmp side, 0             ;bypass if side = 0

je  @changeside         

inc ch

@changeside:

xor side, 1             ;change side

mov al, 1               ;set sector to 1

mov currentaddr, cx

@***aexit:

retcalcnextdiskaddr endp

;output:

;al = 實際讀取的扇區數

readdiskrecord proc near

mov ah, 2               ;request read

mov al, 1               ;one sector

lea bx, buffer          ;input buffer at es:bx

mov cx, currentaddr         ;track/sector

mov dh, side            ;head 0

mov dl, 0               ;drive a(floopy a)

int 13h             ;call bios

cmp ah, 0               ;normal read?

jz  @increasesector         ;yes, exit

mov     endcode, 1          ;no

call    showerrormsg            ;invlaid read

@increasesector:

inc currentaddr         ;increase sector

retreaddiskrecord endp

;display sector

displaysector proc near

mov ah, 40h             ;request display

mov bx, 1               ;handle

mov cx, 512             ;length

lea dx, buffer          ;address of input

int 21h

@wait:

mov ah, 0ah             ;user input

lea dx, user

int 21h

cmp user+1, 0dh

je  @wait               ;wait until user input return

retdisplaysector endp

;clear screen

scrollscreen proc near

mov ax, 0600h           ;full screen

mov bh, 1eh             ;set color

mov cx, 0               ;request scroll

mov dx, 184fh

int 10h

retscrollscreen endp

;set cursor

setcursor proc near

mov ah, 02              ;request set cursor

mov bh, 0

mov dx, 0

int 10h

retsetcursor endp

;disk error function

showerrormsg proc near

mov ah, 40h             ;request display

mov bx, 1               ;handle

mov cx, 11              ;length of message

lea dx, readerrormsg

int 21h

retshowerrormsg endp

code ends

end start

makefile檔案內容如下:

#nmake工具的描述檔案

name = biosrd           #指定輸出檔案

exe = $(name).exe           #需要的exe檔案

obj = $(name).obj           #需要的obj檔案

lst = $(name).lst           #可選的lst檔案

crf = $(name).crf           #可選的crf檔案

map = $(name).map                   #可選的map檔案

lib = nul.lib           #可選的lib檔案

link_flag = ,$(exe),$(map),,$(lib)  #鏈結選項

ml_flag   = $(obj) $(lst) $(crf)    #編譯選項

#定義依賴關係和執行命令

$(exe): $(obj)

link $(obj) $(link_flag)

#定義彙編編譯和資源編譯得預設規則

.asm.obj:

masm $< $(ml_flag)

#清除臨時檔案

clean:

del *.map

del *.crf

del *.lst

del *.obj

del *.bak

del *.sbr

☆程式天堂☆

nginx利用referer指令實現防盜煉配置

nginx模組ngx http referer module通常用於阻擋 非法的網域名稱請求,我們應該牢記。下面這篇文章主要介紹了nginx利用referer指令實現防盜煉配置的相關資料,需要的朋友可以參考借鑑,下面來一起看看吧。實現防盜煉 以上所有來至domain.com和網域名稱以及baidu和...

nginx利用referer指令實現防盜煉配置

nginx模組ngx http referer module通常用於阻擋 非法的網域名稱請求,我們應該牢記。下面這篇文章主要介紹了nginx利用referer指令實現防盜煉配置的相關資料,需要的朋友可以參考借鑑,下面來一起看看吧。實現防盜煉 location gif jpg png webp got...

磁碟檔案讀效能測試

未快取前 time x bin.tar file size is 816322560 816322560 bytes read now real 0m3.378s user 0m0.000s sys 0m0.996s 被快取後 time x bin.tar file size is 81632256...