該過程以int 13H 02H子功能為基礎(chǔ),與int 13H采用相同的基于1的扇區(qū)地址,完成讀取若干邏輯扇區(qū)的功能。過程沒有對輸入?yún)?shù)做任何檢測,請讀者自行保證輸入?yún)?shù)的正確性。參數(shù)的合法范圍:AX>0且AX<=2880,CL>0且CL<=16。CL的限制也是int 13讀取軟盤時(shí)的限制。ES:BX沒有限制。改過程通過了初步的測試,如果有任何錯(cuò)誤希望您留下錯(cuò)誤信息,以使該過程盡善盡美!
;*********************************************************************
; 軟磁盤邏輯扇區(qū)編址方式:
;0頭0道1扇區(qū)~18扇區(qū):對應(yīng)邏輯扇區(qū)號(hào)1~18
;1頭0道1扇區(qū)~18扇區(qū):對應(yīng)邏輯扇區(qū)號(hào)19~36
;0頭1道1扇區(qū)~18扇區(qū):對應(yīng)邏輯扇區(qū)號(hào)37~54
;1頭1道1扇區(qū)~18扇區(qū):對應(yīng)邏輯扇區(qū)號(hào)55~72
;
; BIOS中斷 int 13H 02H的調(diào)用規(guī)范
;子中斷號(hào) ah=02h 讀磁盤 al=要讀取的扇區(qū)數(shù)
; ch=磁道號(hào) cl=起始扇區(qū)號(hào)
; dh=磁頭號(hào) es:bx 緩沖區(qū)地址
;*********************************************************************
;---------------------------------------------------------------------
;函數(shù)名:
ReadSector PROC NEAR
;入口參數(shù)
;ax=邏輯扇區(qū)號(hào) cl=要讀取的扇區(qū)個(gè)數(shù) es:bx 緩沖區(qū)地址
;---------------------------------------------------------------------
LOCAL TWO_MEM_OFFSET:WORD,SECTOR_NUM_1:BYTE,SECTOR_NUM_2:BYTE,
TO_READ_SECTOR_NUM:BYTE,A_X:WORD,B_X:WORD
;跨越盤面部分的內(nèi)存偏移,在當(dāng)前磁道內(nèi)要讀取的扇區(qū)數(shù),跨越磁道的扇區(qū)數(shù),要讀取的扇區(qū)數(shù)
MOV TO_READ_SECTOR_NUM,CL;保存要讀取的扇區(qū)數(shù)
MOV A_X,AX ;保存要讀取的邏輯扇區(qū)號(hào)
MOV B_X,BX ;保存內(nèi)存緩沖區(qū)偏移地址
MOV BL,18D ;每道扇區(qū)數(shù)
DIV BL ;AH=余數(shù),AL=商(沒有用到)
MOV BH,BL
SUB BH,AH ;當(dāng)前磁道內(nèi)的可讀扇區(qū)數(shù)
MOV SECTOR_NUM_1,BH
SUB BH,CL ;當(dāng)前剩余扇區(qū)是否大于等于要求讀的扇區(qū)數(shù)
JL USED_TWO_DISK ;不夠讀,跨越了磁道
ONLY_USED_ONE_DISK: ;要讀取的數(shù)據(jù)沒有跨越磁道
MOV AX,A_X
MOV CL,TO_READ_SECTOR_NUM
MOV BX,B_X
CALL ReadSectorCore
RET
USED_TWO_DISK: ;要讀取的若干扇區(qū)分布在兩個(gè)磁道
SUB CL,SECTOR_NUM_1
MOV SECTOR_NUM_2,CL
MOV AX,512D
MUL SECTOR_NUM_2
MOV BX,B_X
ADD BX,AX
MOV TWO_MEM_OFFSET,BX ;讀取當(dāng)前磁道中的扇區(qū)
MOV AX,A_X
MOV CL,SECTOR_NUM_1
MOV BX,B_X
CALL ReadSectorCore
;讀取下一磁道中剩余的扇區(qū)
MOV AX,A_X
MOV CL,SECTOR_NUM_2
MOVZX CX,CL
ADD AX,CX
MOV BX,TWO_MEM_OFFSET
CALL ReadSectorCore
RET
ReadSector ENDP
;---------------------------------------------------------------------
;函數(shù)名:
ReadSectorCore PROC NEAR
;入口參數(shù)
;ax=邏輯扇區(qū)號(hào) cl=要讀取的扇區(qū)個(gè)數(shù) es:bx 緩沖區(qū)地址
;---------------------------------------------------------------------
push bp
mov bp,sp
sub sp,2
mov [bp-2],cl ;保存要讀取的扇區(qū)數(shù)
push bx
dec ax ;調(diào)整邏輯扇區(qū)號(hào),使其基于0
push ax
mov bl,36
div bl ;商為磁道號(hào)
mov ch,al ;填寫磁道號(hào)
pop ax
mov bl,18
div bl
mov dh,al ;商為磁頭號(hào)
inc ah ;調(diào)整邏輯扇區(qū)號(hào),使其基于1,int 13從1開始編址扇區(qū)
mov cl,ah ;余數(shù)為起始扇區(qū)號(hào)
mov al,[bp-2] ;填充要讀取的扇區(qū)數(shù)
mov ah,02h ;讀扇區(qū)
mov dl,00h ;目標(biāo)存儲(chǔ)介質(zhì):軟磁盤
pop bx
int 13h
add sp,2
pop bp
ret
ReadSectorCore ENDP
;**********************
;*********************************************************************
; 軟磁盤邏輯扇區(qū)編址方式:
;0頭0道1扇區(qū)~18扇區(qū):對應(yīng)邏輯扇區(qū)號(hào)1~18
;1頭0道1扇區(qū)~18扇區(qū):對應(yīng)邏輯扇區(qū)號(hào)19~36
;0頭1道1扇區(qū)~18扇區(qū):對應(yīng)邏輯扇區(qū)號(hào)37~54
;1頭1道1扇區(qū)~18扇區(qū):對應(yīng)邏輯扇區(qū)號(hào)55~72
;
; BIOS中斷 int 13H 02H的調(diào)用規(guī)范
;子中斷號(hào) ah=02h 讀磁盤 al=要讀取的扇區(qū)數(shù)
; ch=磁道號(hào) cl=起始扇區(qū)號(hào)
; dh=磁頭號(hào) es:bx 緩沖區(qū)地址
;*********************************************************************
;---------------------------------------------------------------------
;函數(shù)名:
ReadSector PROC NEAR
;入口參數(shù)
;ax=邏輯扇區(qū)號(hào) cl=要讀取的扇區(qū)個(gè)數(shù) es:bx 緩沖區(qū)地址
;---------------------------------------------------------------------
LOCAL TWO_MEM_OFFSET:WORD,SECTOR_NUM_1:BYTE,SECTOR_NUM_2:BYTE,
TO_READ_SECTOR_NUM:BYTE,A_X:WORD,B_X:WORD
;跨越盤面部分的內(nèi)存偏移,在當(dāng)前磁道內(nèi)要讀取的扇區(qū)數(shù),跨越磁道的扇區(qū)數(shù),要讀取的扇區(qū)數(shù)
MOV TO_READ_SECTOR_NUM,CL;保存要讀取的扇區(qū)數(shù)
MOV A_X,AX ;保存要讀取的邏輯扇區(qū)號(hào)
MOV B_X,BX ;保存內(nèi)存緩沖區(qū)偏移地址
MOV BL,18D ;每道扇區(qū)數(shù)
DIV BL ;AH=余數(shù),AL=商(沒有用到)
MOV BH,BL
SUB BH,AH ;當(dāng)前磁道內(nèi)的可讀扇區(qū)數(shù)
MOV SECTOR_NUM_1,BH
SUB BH,CL ;當(dāng)前剩余扇區(qū)是否大于等于要求讀的扇區(qū)數(shù)
JL USED_TWO_DISK ;不夠讀,跨越了磁道
ONLY_USED_ONE_DISK: ;要讀取的數(shù)據(jù)沒有跨越磁道
MOV AX,A_X
MOV CL,TO_READ_SECTOR_NUM
MOV BX,B_X
CALL ReadSectorCore
RET
USED_TWO_DISK: ;要讀取的若干扇區(qū)分布在兩個(gè)磁道
SUB CL,SECTOR_NUM_1
MOV SECTOR_NUM_2,CL
MOV AX,512D
MUL SECTOR_NUM_2
MOV BX,B_X
ADD BX,AX
MOV TWO_MEM_OFFSET,BX ;讀取當(dāng)前磁道中的扇區(qū)
MOV AX,A_X
MOV CL,SECTOR_NUM_1
MOV BX,B_X
CALL ReadSectorCore
;讀取下一磁道中剩余的扇區(qū)
MOV AX,A_X
MOV CL,SECTOR_NUM_2
MOVZX CX,CL
ADD AX,CX
MOV BX,TWO_MEM_OFFSET
CALL ReadSectorCore
RET
ReadSector ENDP
;---------------------------------------------------------------------
;函數(shù)名:
ReadSectorCore PROC NEAR
;入口參數(shù)
;ax=邏輯扇區(qū)號(hào) cl=要讀取的扇區(qū)個(gè)數(shù) es:bx 緩沖區(qū)地址
;---------------------------------------------------------------------
push bp
mov bp,sp
sub sp,2
mov [bp-2],cl ;保存要讀取的扇區(qū)數(shù)
push bx
dec ax ;調(diào)整邏輯扇區(qū)號(hào),使其基于0
push ax
mov bl,36
div bl ;商為磁道號(hào)
mov ch,al ;填寫磁道號(hào)
pop ax
mov bl,18
div bl
mov dh,al ;商為磁頭號(hào)
inc ah ;調(diào)整邏輯扇區(qū)號(hào),使其基于1,int 13從1開始編址扇區(qū)
mov cl,ah ;余數(shù)為起始扇區(qū)號(hào)
mov al,[bp-2] ;填充要讀取的扇區(qū)數(shù)
mov ah,02h ;讀扇區(qū)
mov dl,00h ;目標(biāo)存儲(chǔ)介質(zhì):軟磁盤
pop bx
int 13h
add sp,2
pop bp
ret
ReadSectorCore ENDP
;**********************

