讀取軟盤邏輯扇區(qū)的匯編實(shí)現(xiàn)代碼

字號(hào):

該過程以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
    ;**********************