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

📄 gfat16_p.asm

📁 操作系统实验教程核心技术与编程实例书中地例子代码
💻 ASM
📖 第 1 页 / 共 5 页
字号:
;////////////////// use by tos task
TURN_TO_REAL PROC FAR
            cli
            MOV AX,REAL_SEL
            MOV ES,AX
            MOV FS,AX
            MOV GS,AX
            MOV DS,AX
            MOV SS,AX

            MOV EAX,CR0
            AND EAX,0FFFFFFFEH
            MOV CR0,EAX
            DB 0EAH
            DW OFFSET REAL_MODE
            DW CODE
            RET
TURN_TO_REAL ENDP
DISP_TOS_IN_TOS PROC FAR
            ; DISP 'COS'
            MOV AH,24H;07 for white/black
            mov al,43h
            mov es:320,ax
            mov al,4fh
            mov es:322,ax
            mov al,53h
            mov es:324,ax
            RET
            ; DISP 'COS'
DISP_TOS_IN_TOS ENDP

GINT21H     PROC FAR
            cli
            PUSH BX
            PUSH CX
            PUSH DX
            PUSH SI
            PUSH ES
            PUSH DS

            CMP AH,4CH
            JE  GINT21H_4C
            CMP AH,9
            JE  GINT21H_9
            JNE GINT21H_END
GINT21H_4C:
            POP DS
            POP ES
            POP SI
            POP DX
            POP CX
            POP BX

            db 0eah
            dw COMEBACK_TO_TOS
            dw ps_TO_TOS_SEL
GINT21H_9:            
            MOV AX,G_VRAM_SEL
            MOV ES,AX
            MOV SI,DX
            MOV DX,CX
            MOV DH,0

            PUSH DX
            MOV CL,CH
            MOV CH,0
            MOV AX,CX
            MOV CX,160
            MUL CX
            MOV BX,AX
            POP DX

            ADD BX,DX
            ADD BX,DX
            MOV AH,24H;07 for white/black
LGINT21H1:  MOV AL,DS:[SI]
            CMP AL,'$'
            JE GINT21H_END
            MOV ES:[BX],AX
            ADD BX,2
            INC SI
            LOOP LGINT21H1
GINT21H_END:
            POP DS
            POP ES
            POP SI
            POP DX
            POP CX
            POP BX
            IRETD
GINT21H     ENDP

DISP2_16    PROC FAR
            ;in al code 2 using ah
            ;out ah:al:code 16
            mov ah,al
            shr ah,4
            cmp ah,9
            jle disp2_16_1
            add ah,7    
disp2_16_1: add ah,30h
            and al,0fh
            cmp al,9
            jle disp2_16_2
            add al,7
disp2_16_2: add al,30h
            RET
DISP2_16    ENDP

;;;;;;;;;;;; file changed
DISP_AX     PROC FAR
            ;in cx:position call inner tos_seg 
            PUSH DS
            PUSH AX
            PUSH BX
            PUSH DX

            MOV DX,V_TOS_DATA_SEL
            MOV DS,DX
            MOV BX,AX
            mov al,BH
            CALL DISP2_16
            mov DS:V_DISP_AX,ah
            mov DS:V_DISP_AX[1],al
            MOV AL,BL
            CALL DISP2_16
            mov DS:V_DISP_AX[2],ah
            mov DS:V_DISP_AX[3],al
            mov DS:V_DISP_AX[4],'$'
            MOV AH,9
            MOV DX,OFFSET V_DISP_AX
            INT 21H
            POP DX
            POP BX
            POP AX
            POP DS
            RET
DISP_AX     ENDP

DISP_EXT_AX PROC FAR
            ;in cx:position call out tos_seg
            PUSH AX
            PUSH BX
            PUSH DX
            MOV BX,AX
            mov al,BH
            db 9ah
            dw DISP2_16
            dw TOS_CODE_SEL
            mov DS:t_string,ah
            mov DS:t_string[1],al
            MOV AL,BL
            db 9ah
            dw DISP2_16
            dw TOS_CODE_SEL
            mov DS:t_string[2],ah
            mov DS:t_string[3],al
            mov DS:t_string[4],'$'
            MOV AH,9
            MOV DX,OFFSET t_string
            ;add dx,16
            INT 21H
            POP DX
            POP BX
            POP AX
            RET
DISP_EXT_AX     ENDP
            
            ;*******************************FILE
EAX_STR     PROC FAR
            ;in : eax      ds:dx string_address
            ;out: ds:dx string_address  use str3
            ; read cursor
            PUSH EBX
            PUSH ECX
            PUSH EDX
            PUSH SI
            PUSH DI
            PUSH DS

            PUSH DX       ;dest string_address
            ;EAX-->ds:dx ASCIIZ STRING
            PUSH EAX      ;remains

            MOV SI,OFFSET STR3
            MOV DS:[SI+13],0
            MOV EBX,1000000000
            PUSH EBX
DISP_EAX1:  POP EBX 
            POP EAX
            CMP EBX,10
            JL  DISP_EAX_END1
            XOR EDX,EDX
            DIV EBX
            PUSH EDX         ;next remains
DISP_EAX2:  ADD AL,30H
            MOV DS:[SI],AL
            INC SI
            MOV EAX,EBX
            XOR EDX,EDX
            MOV ECX,10
            DIV ECX
            PUSH EAX         ; next diveder
            JMP DISP_EAX1
DISP_EAX_END1:
            ADD AL,30H
            MOV DS:[SI],AL

            ;;;;;;; STR3: add ','-->dest address
            MOV SI,OFFSET STR3
            POP  DI           ;dest address
            PUSH DI
            MOV AL,DS:[SI]
            MOV DS:[DI],AL
            INC SI
            INC DI

            MOV BL,3
DISP_EAX_END2:
            MOV AL,","
            MOV DS:[DI],AL
            INC DI
            CLD
            MOV CX,3
DISP_EAX_END3:
            MOVSB
            LOOP DISP_EAX_END3
            DEC BL
            CMP BL,0
            JA  DISP_EAX_END2
            MOV DS:[DI],0
            ;;;;;;; STR3: add ',' -->dest address

            ;;;;;;; cut first'0' or ','
            POP SI                  ;dest address
            MOV CX,12
DISP_EAX_END4:
            MOV AL,DS:[SI]
            CMP AL,'0'
            JE  DISP_EAX_END5
            CMP AL,','
            JE  DISP_EAX_END5
            JMP DISP_EAX_END6
DISP_EAX_END5:
            MOV AL,' '
            MOV DS:[SI],AL
            INC SI
            LOOP DISP_EAX_END4
DISP_EAX_END6:
            ;;;;;;;STR2 cut first'0' or ','

            POP DS
            POP DI
            POP SI
            POP EDX
            POP ECX
            POP EBX
            RET  
EAX_STR     ENDP

STRIPOS     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]       ; str2
            MOV SI,WORD PTR [BP+20]
            MOV DS,WORD PTR [BP+18]       ; str1

            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+18],AX        ;OLD BP
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
            PUSH GS
            PUSH DI

            PUSH DX
            MOV DX,SI
            CALL STRLEN         ;get length of str1
            MOV DX,V_TOS_DATA_SEL
            MOV GS,DX
            MOV GS:TTDW1,AX     ;length of str1--->GS:TTDW1   ok
            POP DX
            ;find str1 in str2
            MOV WORD PTR GS:TTDW2,DI
            ; out loop
SICMP0:     ;         <-----------------------------------------
            MOV DI,WORD PTR GS:TTDW2                          ;|
            MOV AH,ES:[DI]
            CMP AH,0
            JE  SICMP_ERROR           ;not found
            MOV SI,WORD PTR [BP+20]
            MOV CX,WORD PTR GS:TTDW1  ;length of str1
            INC CX
            ; inner loop
SICMP1:     ;         <-----------------------------------------

            MOV AL,DS:[SI]
            CMP AL,0
            JE SICMP_OK
            MOV AH,ES:[DI]
            CMP AH,0
            JE SICMP_ERROR
            ; upper/lower
            CMP AL,61H
            JL  SICMP11
            CMP AL,7AH
            JA  SICMP11
            SUB AL,20H
SICMP11:  
            CMP AH,61H
            JL  SICMP12
            CMP AH,7AH
            JA  SICMP12
            SUB AH,20H
            ; upper/lower
SICMP12:    ; 
            CMP AL,AH    ;al=str1       ah=str2
            JE  SICMP2
            JMP  SICMP22 ;to next position in str2
SICMP2:
            INC SI
            INC DI
            LOOP SICMP1
SICMP22:    INC WORD PTR GS:TTDW2
            JMP SICMP0
SICMP_OK:                 ;end  have found
            MOV AX,WORD PTR GS:TTDW2
            POP DI
            SUB AX,DI   ;str1'offset in str2
            JMP SICMP_END
            ;;;;;;;;;;;
SICMP_ERROR:
            MOV AX,65535
            POP DI
SICMP_END:
            POP GS
SICMP3:     ;MOV WORD PTR [BP+4],AX        ;OLD BP
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
            POP CX       ;OLD BP
            POP CX
            POP DI       ;AX = position of return
            POP DI
            POP SI
            POP ES
            POP DS
            
            MOV SP,BP
            MOV BP,WORD PTR [BP+4]        ;OLD BP  -7*2 of above
            ADD SP,22
            RET
STRIPOS     ENDP

STRLEN PROC FAR
       ;in : ds:dx addr of string
       PUSH DI
       PUSH ES
       PUSH CX
       MOV DI,DX
       MOV CX,DS
       MOV ES,CX
       MOV AL,0
       MOV CX,0FFFFH
       REPNE SCASB
       MOV AX,DI
       SUB AX,DX
       DEC AX
       POP CX
       POP ES
       POP DI
       RET
STRLEN ENDP

DISP_COS_HEAD PROC FAR
            MOV AX,G_VRAM_SEL
            MOV ES,AX
            MOV AX,V_TOS_DATA_SEL
            MOV DS,AX

            MOV AH,7H       ;COVER OLD "COS"
            MOV AL,20H
            MOV ES:320,AX
            MOV ES:322,AX
            MOV ES:324,AX

            MOV CX,21
            MOV AH,24H
            MOV DI,0
            MOV AL,20H
DISP_COS_HEAD0:            
            MOV ES:[DI],AX
            INC DI
            INC DI
            LOOP DISP_COS_HEAD0

            MOV SI,OFFSET COS_HEAD
            MOV CX,37
DISP_COS_HEAD1:            
            MOV AL,DS:[SI]
            MOV ES:[DI],AX
            INC DI
            INC DI
            INC SI
            LOOP DISP_COS_HEAD1

            MOV CX,22
            MOV AL,20H
DISP_COS_HEAD2:            
            MOV ES:[DI],AX
            INC DI
            INC DI
            LOOP DISP_COS_HEAD2
            ; setup cursor
            MOV BH,0
            MOV DX,0000H
            MOV AH,2
            INT 80H
            ;; begin command line mode
            ;;;;;;            display "C:\>"
            ; 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 COS_FLAG
            CALL STRDISP           ;display "C:\>"
            ;;;;;;;;;;;;;;;;set "C:\" as current directory
            RET
DISP_COS_HEAD ENDP

STRNCPY     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+26]       ;5 PARAMETER
            MOV ES,WORD PTR [BP+24]
            MOV SI,WORD PTR [BP+22]
            MOV DS,WORD PTR [BP+20]
            MOV CX,WORD PTR [BP+18]

⌨️ 快捷键说明

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