⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 gfat16_p.asm

📁 操作系统实验教程核心技术与编程实例书中地例子代码
💻 ASM
📖 第 1 页 / 共 5 页
字号:

            MOV AX,WORD PTR [BP+16]
            MOV WORD PTR [BP+26],AX        ;CS
            MOV AX,WORD PTR [BP+14]
            MOV WORD PTR [BP+24],AX        ;IP
            MOV AX,WORD PTR [BP]
            MOV WORD PTR [BP+22],AX        ;OLD BP

            ;str1-->str2
STRNCPY1:
            MOV AL,DS:[SI]
            MOV ES:[DI],AL
            INC SI
            INC DI
            LOOP STRNCPY1

            POP CX       ;OLD BP
            POP CX
            POP AX
            POP DI
            POP SI
            POP ES
            POP DS
            
            MOV SP,BP
            MOV BP,WORD PTR [BP+22]        ;OLD BP
            ADD SP,24
            RET
STRNCPY     ENDP

STRDISP     PROC FAR
            ;    input ds:dx  string address   0-->'$'
            PUSH ES
            PUSH AX
            PUSH BX
            PUSH CX
            PUSH DI
            PUSH DS

;
            MOV AX,DS
            MOV ES,AX
            MOV DI,DX

STRDISP0:   MOV AL,0
            MOV DX,DI
            MOV CX,4096
            CLD
STRDISP1:   SCASB
            LOOPNZ STRDISP1
            JNZ STRDISP2      ;<>0 AT 4095
            MOV AL,0
            ;dec di
            JMP STRDISP3
STRDISP2:            
            MOV AL,ES:[DI]
STRDISP3:   
            PUSH AX
            PUSH DI
            PUSH ES
            PUSH DS
            MOV AL,24H
            MOV ES:[DI],AL
            MOV AL,0
            MOV AH,09H
            INT 21H
            POP DS
            POP ES
            POP DI
            POP AX
            CMP AL,0
            JE  STRDISP_END
            MOV ES:[DI],AL
            JMP STRDISP0

STRDISP_END:
            POP DS
            POP DI
            POP CX
            POP BX
            POP AX
            POP ES
            RET
STRDISP     ENDP

STRCPY      PROC FAR
            PUSH DS
            PUSH ES
            PUSH SI
            PUSH DI
            PUSH AX
            PUSH CX
            PUSH BP       ;7
            MOV BP,SP
            MOV DI,WORD PTR [BP+24]       ;4 PARAMETER
            MOV ES,WORD PTR [BP+22]
            MOV SI,WORD PTR [BP+20]
            MOV DS,WORD PTR [BP+18]

            MOV AX,WORD PTR [BP+16]
            MOV WORD PTR [BP+24],AX        ;CS
            MOV AX,WORD PTR [BP+14]
            MOV WORD PTR [BP+22],AX        ;IP
            MOV AX,WORD PTR [BP]
            MOV WORD PTR [BP+20],AX        ;OLD BP

            ;str1-->str2
            MOV CX,0FFFFH
STRCPY1:
            MOV AL,DS:[SI]
            MOV ES:[DI],AL
            CMP AL,0
            JLE STRCPY2
            INC SI
            INC DI
            LOOP STRCPY1
STRCPY2:

            POP CX       ;OLD BP
            POP CX
            POP AX
            POP DI
            POP SI
            POP ES
            POP DS
            
            MOV SP,BP
            MOV BP,WORD PTR [BP+20]        ;OLD BP
            ADD SP,22
            RET
STRCPY      ENDP
            
STRCMP      PROC FAR
            PUSH DS
            PUSH ES
            PUSH SI
            PUSH DI
            PUSH AX
            PUSH CX
            PUSH BP       ;7
            MOV BP,SP
            MOV DI,WORD PTR [BP+24]       ;4 PARAMETER
            MOV ES,WORD PTR [BP+22]
            MOV SI,WORD PTR [BP+20]
            MOV DS,WORD PTR [BP+18]

            MOV AX,WORD PTR [BP+16]
            MOV WORD PTR [BP+24],AX        ;CS
            MOV AX,WORD PTR [BP+14]
            MOV WORD PTR [BP+22],AX        ;IP
            MOV AX,WORD PTR [BP]
            MOV WORD PTR [BP+20],AX        ;OLD BP
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
            ;str1-->str2
            MOV CX,0FFFFH
STRCMP1:
            MOV AL,DS:[SI]
            MOV AH,ES:[DI]
            CMP AL,AH
            JE  STRCMP2
            JL  STRCMP22
            MOV AL,2
            JMP STRCMP3
STRCMP2:
            CMP AL,0
            JE  STRCMP3
            INC SI
            INC DI
            LOOP STRCMP1
STRCMP22:   MOV AL,1
STRCMP3:    MOV WORD PTR [BP+4],AX        ;OLD BP
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
            POP CX       ;OLD BP
            POP CX
            POP AX
            POP DI
            POP SI
            POP ES
            POP DS
            
            MOV SP,BP
            MOV BP,WORD PTR [BP+20]        ;OLD BP
            ADD SP,22
            RET
STRCMP      ENDP

STRICMP     PROC FAR
            PUSH DS
            PUSH ES
            PUSH SI
            PUSH DI
            PUSH AX
            PUSH CX
            PUSH BP       ;7
            MOV BP,SP
            MOV DI,WORD PTR [BP+24]       ;4 PARAMETER
            MOV ES,WORD PTR [BP+22]
            MOV SI,WORD PTR [BP+20]
            MOV DS,WORD PTR [BP+18]

            MOV AX,WORD PTR [BP+16]
            MOV WORD PTR [BP+24],AX        ;CS
            MOV AX,WORD PTR [BP+14]
            MOV WORD PTR [BP+22],AX        ;IP
            MOV AX,WORD PTR [BP]
            MOV WORD PTR [BP+20],AX        ;OLD BP
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
            ;str1-->str2
            MOV CX,0FFFFH
STRICMP1:
            MOV AL,DS:[SI]
            MOV AH,ES:[DI]
            ; upper/lower
            CMP AL,61H
            JL  STRICMP11
            CMP AL,7AH
            JA  STRICMP11
            SUB AL,20H
STRICMP11:  
            CMP AH,61H
            JL  STRICMP12
            CMP AH,7AH
            JA  STRICMP12
            SUB AH,20H
            ; upper/lower
STRICMP12:  
            CMP AL,AH
            JE  STRICMP2
            JL  STRICMP22
            MOV AL,2
            JMP STRICMP3
STRICMP2:
            CMP AL,0
            JE  STRICMP3
            INC SI
            INC DI
            LOOP STRICMP1
STRICMP22:  MOV AL,1
STRICMP3:   MOV WORD PTR [BP+4],AX        ;OLD BP
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
            POP CX       ;OLD BP
            POP CX
            POP AX
            POP DI
            POP SI
            POP ES
            POP DS
            
            MOV SP,BP
            MOV BP,WORD PTR [BP+20]        ;OLD BP
            ADD SP,22
            RET
STRICMP     ENDP

LSECTOR_NO_ADDR PROC FAR
            ; in: DS:DX=DOSBOOT or extdosboot EAX=logic sector_no
            ; out ch:cylinder,cl:sector,dh:head

            PUSH EBX
            PUSH ESI
            PUSH EDI

            INC EAX
            MOV SI,DX              ;OFFSET DOSBOOT

            MOV EBX,DS:[SI+1CH]    ;hidden sector_count
            ADD EAX,EBX
            MOV EBX,DS:HIDDEN_SECTOR
            ADD EAX,EBX
            PUSH EAX               ;logic sector_no+1+hidden sector_count
            MOV AX,DS:[SI+1AH]     ;head_count_per cylinder
            MOV BX,DS:[SI+18H]     ;sector_count per head
            XOR DX,DX
            MUL BX                 ;DX:AX head_count * sector_count
            MOVZX EAX,AX
            MOVZX EDX,DX
            SHL   EDX,16
            ADD   EAX,EDX          ;EAX=head_count * sector_count
            MOV   EDI,EAX          ;EDI=head_count * sector_count ---OK
            POP   EAX
            PUSH  EAX
            XOR   EDX,EDX
            DIV   EDI              ;EAX=cylinder_NO
            MOV   EBX,EAX          ;EBX=cylinder_NO -----OK
            XOR   EDX,EDX
            MUL   EDI               
            MOV   ECX,EAX          ;ECX=cylinder_NO * head_count * sector_count
            POP   EAX              
            SUB   EAX,ECX   
            PUSH  EAX              ;logic sector_no+1+hidden sector_count -
                                   ; cylinder_NO * head_count * sector_count
            MOV CX,DS:[SI+18H]    ;sectors per sector
            MOVZX ECX,CX
            XOR EDX,EDX
            DIV ECX                
            MOV ESI,EAX            ;ESI=EAX=head_ON   ----OK
            XOR EDX,EDX
            MUL ECX
            MOV EDI,EAX            ;EDI=head_ON * sectorS per head
            POP EAX
            SUB EAX,EDI            ;AX=sector_ON  --OK
            MOV CL,AL              ;CL=sector_ON  --OK
            MOV DX,SI              ;DL=head_ON
            MOV DH,DL              ;DH=head_ON
            MOV CH,BL              ;CH=low 8 bit cylinder
            SHL BH,6
            AND CL,3FH
            ADD CL,BH

            POP EDI
            POP ESI
            POP EBX
            RET
LSECTOR_NO_ADDR ENDP

DO_DIR      PROC FAR
            MOV AX,V_TOS_DATA_SEL
            MOV ES,AX
            MOV DS,AX
            ;;;;; next for FAT16 file system
            
            MOV EAX,0
            MOV DS:HIDDEN_SECTOR,EAX
            MOV DS:TTDB,AL  ;subs directory
            MOV DS:TTDD1,EAX ;used bytes
            MOV DS:TTDD2,EAX ;free bytes
            MOV DS:TTDD3,EAX ;files_count
            MOV DS:TTDD4,EAX ;directory_count
            ;;;;; disk free bytes
            MOV BX,OFFSET DOSBOOT
            XOR EAX,EAX          
            MOV  EAX,DS:[BX+20H]
            CMP  EAX,0
            JA   DO_DIR00
            MOV  AX,DS:[BX+13H]
DO_DIR00:   DEC  EAX                   ;toatl sectors -1
            MOV  DX,DS:[BX+16H]       ;sectors per FAT
            MOVZX EDX,DX
            SUB  EAX,EDX
            SUB  EAX,EDX
            MOV  DS:TTDD2,EAX           ;toatl sectors - 1 -2*FAT_sectors 
            ;;;;; disk free bytes

            ;;;;;;;;;;;;;;;;;;;; display head line 1
            ; read cursor
            MOV AH,03H 
            MOV BH,0
            INT 80H
            ; set cursor
            MOV AH,02H 
            MOV BH,0
            INC DH
            MOV DL,0
            INT 80H
            MOV AX,V_TOS_DATA_SEL 
            MOV DS,AX
            MOV DX,OFFSET T_DIR1
            CALL STRDISP
            ;;;;;;;;;;;;;;;; display volume_serial_number
            ;display  volume_serial_number part 1
            MOV AX,V_TOS_DATA_SEL
            MOV DS,AX
            MOV BX,OFFSET DOSBOOT
            ADD BX,27H
            MOV AL,DS:[BX+2]
            MOV AH,DS:[BX+3]
            CALL DISP_AX

            ;display '-'
            MOV BH,0
            MOV AL,'-'
            MOV BL,07
            MOV CX,1
            MOV AH,9
            INT 80H
            ; read cursor
            MOV AH,03H 
            MOV BH,0
            INT 80H
            ; set cursor
            MOV AH,02H 
            MOV BH,0
            INC DL
            INT 80H
            ;display volume_serial_number part 2
            MOV BX,OFFSET DOSBOOT
            ADD BX,27H
            MOV AL,DS:[BX]
            MOV AH,DS:[BX+1]
            CALL DISP_AX
            ;;;;;;;;;;; display volume_serial_number
            ;display head line 2
            ; read cursor
            MOV AH,03H 
            MOV BH,0
            INT 80H
            ; set cursor
            MOV AH,02H 
            MOV BH,0
            INC DH
            MOV DL,0
            INT 80H
            MOV AX,V_TOS_DATA_SEL 
            MOV DS,AX
            MOV DX,OFFSET T_DIR2
            CALL STRDISP
            ;;;;;;;;;;;;;;;;
            ;;;;;;;;;;;;;;;;;;; first sector_no of root dir
            MOV AX,V_TOS_DATA_SEL 
            MOV DS,AX
            MOV AL,0
            MOVZX EAX,AL
            MOV DS:HIDDEN_SECTOR,EAX
            MOV BX,OFFSET DOSBOOT
            MOV AX,DS:[BX+16H] ;sectors per FAT
            MOV CX,DS:[BX+10H] ;FAT count
            MUL CX
            INC AX              
            ADC DX,0            ;DX:AX =first sector_no of root dir
            MOVZX ECX,AX
            MOVZX EAX,DX
            SHL EAX,16
            ADD EAX,ECX
            MOV DS:ROOTDIR_FS_NO,EAX  ; first sector_no of root dir
            ;;;;;;;;;;;;;;;;;;; sectors in root dir
            MOV AX,DS:[BX+11H]
            MOV CX,32
            MUL CX              ;DX:AX bytes in root dir
            MOV CX,DS:[BX+0BH]  ; bytes oer sector
            DIV CX              ;AX= sectors in root dir
            ;;;;;;;;;;;;;;;;;;;         last sector_no of root dir
            MOVZX EAX,AX              ; EAX= sectors in root dir
            ;; disk free
            PUSH  EAX
            MOV   EBX,EAX
            MOV   EAX,DS:TTDD2
            SUB   EAX,EBX

            MOV   DS:TTDD2,EAX        ;sectors in file area
            MOV   DX,OFFSET DOSBOOT
            CALL  DISK_FREE
            MOV   DS:TTDD2,EAX        ;disk free
            POP   EAX
            ;; disk free

            MOV EBX,DS:ROOTDIR_FS_NO  ; EBX= first sector_no of root dir
            ADD EAX,EBX
            DEC EAX
            MOV DS:ROOTDIR_LS_NO,EAX  ; last sector_no of root dir
            ;;;;;;;;;;;;;;;;;;   loop read root_dir sector
            MOV EAX,DS:ROOTDIR_FS_NO  
            MOV DS:TTSECTOR_NO,EAX    ; first sector_no of root dir
DO_DIR_1:   
            MOV AX,V_TOS_DATA_SEL 
            MOV DS,AX
            MOV EAX,DS:TTSECTOR_NO
            CMP EAX,DS:ROOTDIR_LS_NO  
            JA  DO_DIR_END
            INC EAX

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -