利用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...