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

📄 v86_used.asm

📁 操作系统实验教程核心技术与编程实例书中地例子代码
💻 ASM
字号:
COS_INT08   PROC FAR
            PUSH EAX
            PUSH EBX
            PUSH ECX
            PUSH EDX
            PUSH GS
            PUSH FS
            PUSH ES
            PUSH DS
            MOV  EAX,ESP
            ADD  EAX,36
            PUSH EAX          ;ESP
            PUSH SS           ;ss
            PUSH ESI
            PUSH EDI
            PUSH EBP
            MOV AX,V86_DATA_GDT_SEL
            MOV FS,AX
            DEC BYTE PTR FS:[TIME_COUNT]
            MOV AL,0
            CMP BYTE PTR FS:[TIME_COUNT],AL
            JNZ INT08_11
            ; display time
            MOV BYTE PTR FS:[TIME_COUNT],18
            MOV BX,OFFSET COS_TIME
            ADD BX,7
            INC BYTE PTR FS:[BX]
            CMP BYTE PTR FS:[BX],3AH   ;SECOND 1
            JNZ INT08_2
            MOV BYTE PTR FS:[BX],30H
            DEC BX
            INC BYTE PTR FS:[BX]
            CMP BYTE PTR FS:[BX],36H   ;SECOND 10
            JNZ INT08_2
            MOV BYTE PTR FS:[BX],30H
            DEC BX
            DEC BX
            INC BYTE PTR FS:[BX]
            ;
            CMP BYTE PTR FS:[BX],3AH   ;MONUTE 1
            JNZ INT08_2
            MOV BYTE PTR FS:[BX],30H
            DEC BX
            INC BYTE PTR FS:[BX]
            CMP BYTE PTR FS:[BX],36H   ;MINUTE 10
            JNZ INT08_2
            MOV BYTE PTR FS:[BX],30H
            DEC BX
            DEC BX
            INC BYTE PTR FS:[BX]
            ;
            CMP WORD PTR FS:[BX-1],3234H   ;HOUR 24
            JNZ INT08_3
            MOV WORD PTR FS:[BX-1],3030H
            JMP INT08_2
INT08_3:    CMP WORD PTR FS:[BX],3AH      ;HOUR 1
            JNZ INT08_2
            MOV BYTE PTR FS:[BX],30H
            DEC BX
            INC BYTE PTR FS:[BX]
INT08_2:
            MOV AX,G_VRAM_SEL
            MOV ES,AX
            MOV AH,41H  
            MOV BX,OFFSET COS_TIME
            MOV AL,BYTE PTR FS:[BX]      ;HOUR10
            MOV WORD PTR ES:[3982],AX
            INC BX
            MOV AL,BYTE PTR FS:[BX]      ;HOUR10
            MOV WORD PTR ES:[3984],AX
            INC BX
            MOV AL,BYTE PTR FS:[BX]      ;:
            MOV WORD PTR ES:[3986],AX
            INC BX
            MOV AL,BYTE PTR FS:[BX]      ;MINUTE10
            MOV WORD PTR ES:[3988],AX
            INC BX
            MOV AL,BYTE PTR FS:[BX]      ;MINUTE1
            MOV WORD PTR ES:[3990],AX
            INC BX
            MOV AL,BYTE PTR FS:[BX]      ;:
            MOV WORD PTR ES:[3992],AX
            INC BX
            MOV AL,BYTE PTR FS:[BX]      ;SECOND10
            MOV WORD PTR ES:[3994],AX
            INC BX
            MOV AL,BYTE PTR FS:[BX]      ;SECOND1
            MOV WORD PTR ES:[3996],AX
            ; display time
INT08_1:
            MOV AX,V_TOS_DATA_SEL
            MOV DS,AX
            CMP BYTE PTR DS:[NEED_RESCHED],1
            JNZ INT08_11

;jmp int08_11    
;;;;;;1.    save to TSS of PCB
            MOV AX,V_PCB_SEL 
            MOV FS,AX
            MOV EBP,DS:[CURRENT]
;mov eax,ebp
;call disp_ax
            ; next for return to the procedure of before time_interrupt
            POP EAX ;EBP
            MOV FS:[EBP+138+60],EAX
            POP EAX ;EDI
            MOV FS:[EBP+138+68],EAX
            POP EAX ;ESI
            MOV FS:[EBP+138+64],EAX
            POP AX  ;;;;;;;;;;;;;;;;;;;;;;;;SS
            MOV FS:[EBP+138+80],EAX
            POP EAX ;;;;;;;;;;;;;;;;;;;;;;;;ESP
            MOV FS:[EBP+138+56],EAX
            POP AX ;DS
            MOV FS:[EBP+138+84],AX
            POP AX ;ES
            MOV FS:[EBP+138+72],AX
            POP AX ;FS
            MOV FS:[EBP+138+88],AX
            POP AX ;GS
            MOV FS:[EBP+138+92],AX
            POP EDX
            MOV FS:[EBP+138+48],EDX
            POP ECX
            MOV FS:[EBP+138+44],ECX
            POP EBX
            MOV FS:[EBP+138+52],EBX
            POP EAX
            MOV FS:[EBP+138+40],EAX
            POP EAX
            MOV FS:[EBP+138+32],EAX    ;EIP
            POP EAX
            MOV FS:[EBP+138+76],EAX    ;CS
            POP EAX
            MOV FS:[EBP+138+36],EAX    ;EFLAG
;;;;;;1.    save to TSS of PCB
            MOV AL,20H
            OUT 20H,AL
            MOV AX,V_TOS_CODE_SEL    ;turn to schedule
            MOVZX EAX,AX
            PUSH EAX
            MOV EAX,OFFSET SCHED
            PUSH EAX
            RETD

INT08_11:
            POP EBP
            POP EDI
            POP ESI
            POP SS
            POP EAX ;ESP         ;pop ss&esp:error
            POP AX  ;DS
            POP ES
            POP FS
            POP GS
            POP EDX
            POP ECX
            POP EBX

            MOV AL,20H
            OUT 20H,AL
            POP EAX
            IRETD
COS_INT08   ENDP


COS_TIME_INIT   PROC FAR
      PUSH FS
      MOV AX,V86_DATA_GDT_SEL
      MOV FS,AX
      MOV AX,G_VRAM_SEL
      MOV ES,AX
      MOV AH,02H 
      INT 8AH
      MOV BX,OFFSET COS_TIME
      MOV AH,41H  
      MOV AL,DH
      AND AL,00001111B
      ADD AL,30H
      MOV BYTE PTR FS:[BX+7],AL
      MOV AL,DH
      SHR AL,4
      ADD AL,30H
      MOV BYTE PTR FS:[BX+6],AL
      MOV AL,CL
      AND AL,00001111B
      ADD AL,30H
      MOV BYTE PTR FS:[BX+4],AL
      MOV AL,CL
      SHR AL,4
      ADD AL,30H
      MOV BYTE PTR FS:[BX+3],AL
      MOV AL,CH
      AND AL,00001111B
      ADD AL,30H
      MOV BYTE PTR FS:[BX+1],AL
      MOV AL,CH
      SHR AL,4
      ADD AL,30H
      MOV BYTE PTR FS:[BX],AL
      POP FS
      RET
COS_TIME_INIT ENDP

COS_DOSINT  PROC FAR
            ; 10H02/03 13H02/03 16H10 21H09 21H0A
COS_DOSINT10:
            PUSH EBP
            MOV BP,10H      ;interrupt number
            JMP DO_DOSINTX
COS_DOSINT13:
            PUSH EBP
            MOV BP,13H      ;interrupt number
            JMP DO_DOSINTX
COS_DOSINT16:
            PUSH EBP
            MOV BP,16H      ;interrupt number  read 1 charater
            JMP DO_DOSINTX
COS_DOSINT1A:
            PUSH EBP
            MOV BP,1AH      ;interrupt number REAL TIMER
            JMP DO_DOSINTX
COS_DOSINT21:
            PUSH EBP
            MOV BP,21H      
            JMP DO_DOSINTX
DO_DOSINTX:
            PUSH EAX
            PUSH EBX
            PUSH ECX
            PUSH EDX
            PUSH ESI
            PUSH EDI
            PUSH DS          ;ADD
            PUSH ES          ;ADD
            PUSH FS          ;ADD
            PUSH GS

            PUSH AX
            MOV AX,V86_DATA_GDT_SEL
            MOV GS,AX
            POP AX
            MOV GS:G_INT,BP
            MOV GS:V86_AX,AX
            MOV GS:V86_BX,BX
            MOV GS:V86_CX,CX
            MOV GS:V86_DX,DX
            MOV GS:V86_ES,ES
            MOV GS:V86_DS,DS

            CMP BP,13H      
            JE  BIOS13H
            CMP BP,16H      
            JE  BIOS16H
            CMP BP,21H      
            JE  DOS21H
            JMP COSINT_A  ;10H,1AH NOTHING TO DO
BIOS13H:    CMP AH,03H    ;13H02 NOTHING TO DO
            JE  BIOS13H03  
            JMP COSINT_A  
BIOS13H03:  JMP COSINT_A  

BIOS16H:    CMP AH,00H    ;16H00 NOTHING TO DO
            JE  BIOS16H00  
            JMP COSINT_A  
BIOS16H00:  JMP COSINT_A  

DOS21H:     CMP AH,09H
            JE DOS21H09
            CMP AH,4CH
            JE  DOS21H4C
            CMP AH,4EH
            JE  DOS21H4E
            JMP COSINT_A  ;21H0A NOTHING TO DO
DOS21H09:   
            MOV SI,DX
            XOR DI,DI
DOS21H09_1: MOV AH,DS:[SI]
            MOV GS:V86_BUFFER[DI],AH
            CMP AH,24H
            JE DOS21H09_END
            INC SI
            INC DI
            CMP DI,4096                ;int 09H one time 4096 bytes
            JL DOS21H09_1
DOS21H09_END:
            MOV AH,24H
            MOV GS:V86_BUFFER[4096],AH
            MOV CX,DI
            MOV GS:V86_CX,CX          ;len of string
            JMP COSINT_A  
            ;*******************************enter TO V86 TASK
            ;*******************************enter TO V86 TASK
COSINT_A:   
            ; FOLLOWS:INITIAL 
            MOV AX,V86TSS_ASDATA_SEL
            MOV DS,AX

            MOV DS:[4],V86_STACK0LEN
            MOV DS:[32],V86BEGIN
            MOV DS:[36],3000H
            MOV DS:[38],2
            MOV DS:[56],V86_STACK3LEN
            MOV DS:[60],0
            MOV DS:[76],V86CODESEG
            MOV DS:[80],V86_STACK3SEG
            MOV DS:[84],V86_DATASEG
            MOV AX,V86_DATA_GDT_SEL
            MOV DS,AX
            SLDT DS:CURRENT_LDT
            STR DS:CURRENT_TR
            MOV AX,V_TOS_DATA_SEL
            MOV DS,AX
            MOV AX,SS
            MOV DS:CURRENT_SS,AX
            LIDT FWORD PTR DS:V86_IDTSIZE
            MOV BX,V86LDT_SEL
            LLDT BX

            PUSH ES
            PUSH FS
            
            MOV AX,REAL_SEL
            MOV ES,AX
            MOV FS,AX
            MOV GS,AX
            MOV DS,AX
            MOV SS,AX
            jmp COSINT_A_jmp
COSINT_A_jmp:   
            DB 0EAH  ;CALL=9AH  ;JMP=0EAH  ;
            DW 0;V86BEGIN
            DW V86TSS_SEL
FROM_V86:   
            MOV AX,V_TOS_DATA_SEL
            MOV DS,AX
            MOV AX,DS:CURRENT_SS
            MOV SS,AX
            LIDT FWORD PTR DS:IDTSIZE
            POP FS
            POP ES
            
;  push gs
;  mov ebx,01fffffh
;df123:
;  MOV AX,G_VRAM_SEL
;  MOV gS,AX
;  MOV AL,'-'
;  MOV AH,41H  
;  MOV WORD PTR gS:[804],AX
;  dec ebx
;  jnz df123
;  pop gs
; test

            MOV AX,V86_DATA_GDT_SEL  ;END_DEAL
            MOV GS,AX

            MOV AX,GS:G_INT
            CMP AX,10H
            JE  G10H_END
            CMP AX,13H
            JE  G13H_END
            CMP AX,16H
            JE  G16H_END
            CMP AX,1AH
            JE  G1AH_END
            CMP AX,21H
            JE  G21H_END
            JMP COS_DOSINT_END
G10H_END:   MOV AX,GS:V86_AX
            CMP AH,03H
            JE G10H03_END
            JMP COS_DOSINT_END
G10H03_END:
            MOV BP,SP
            MOV AX,GS:V86_DX_O
            MOV WORD PTR [BP+16],AX     ;OLD=10
            JMP COS_DOSINT_END
G13H_END:   MOV AX,GS:V86_AX
            CMP AH,02H
            JE G13H02_END
            JMP COS_DOSINT_END
G13H02_END: MOV BX,GS:V86_BX
            MOV DX,GS:V86_ES
            PUSH DS
            MOV DS,DX
            MOV CX,512
            MOV AX,OFFSET V86_BUFFER
            MOV SI,AX
G13H02_LOOP: 
            MOV  AL,GS:[SI]    ;V86_BUFFER
            MOV  DS:[BX],AL       ;USER BUFFER
            INC  BX
            INC SI
            LOOP G13H02_LOOP
            POP  DS
            JMP COS_DOSINT_END

G16H_END:   MOV AX,GS:V86_AX_O
            JMP COS_DOSINT_END
G1AH_END:   
            MOV CX,GS:V86_CX_O
            MOV DX,GS:V86_DX_O
            ;
            POP GS
            POP FS
            POP ES
            POP DS
            POP EDI
            POP ESI
            POP EBP            ;POP EDX  REMAINS DX
            POP EBP            ;POP ECX  REMAINS CX
            POP EBX
            POP EAX            
            POP EBP
sti
            IRETD
            ;
G21H_END:   MOV AX,GS:V86_AX
            CMP AH,0AH
            JE  G21H0A_END
            JMP COS_DOSINT_END
G21H0A_END: MOV BX,GS:V86_DX
            MOV DX,GS:V86_DS
            PUSH DS
            MOV DS,DX            ;DS:BX  USER_BUF
            MOV AX,OFFSET V86_BUFFER ;GS:SI  V86_BUFFER
            MOV SI,AX
            INC SI
            MOV CL,GS:[SI]
            INC BX               ;SECOND FOR USER_BUF
            MOV CH,0
            MOV DS:[BX],CL
            INC SI
            INC BX
            CMP CL,0
            JLE G21H0A_0
G21H0A_LOOP: 
            MOV  AL,GS:[SI]       ;V86_BUFFER
            MOV  DS:[BX],AL       ;USER BUFFER
            INC  BX
            INC  SI
            LOOP G21H0A_LOOP
G21H0A_0:
            MOV  DS:[BX],0       ;ADDITION 'NULL'
            POP  DS
            JMP  COS_DOSINT_END
DOS21H4C:
            POP GS
            POP FS
            POP ES
            POP DS
            POP EDI
            POP ESI
            POP EDX
            POP ECX
            POP EBX
            POP EBP            ;POP EAX  REMAINS AX
            POP EBP
            jmp DOS21H4C1
DOS21H4C1:  
            DB 0EAH  ;CALL=9AH  ;JMP=0EAH  ;
            DW 0;V86BEGIN
            DW V_TOS_TSS_SEL
            
DOS21H4E:
            CALL DO_DOS21H4E

COS_DOSINT_END:            
;mmmmmmmmmmm
;  push gs
;  mov ebx,02fffffh
;dff123:
;  MOV AX,G_VRAM_SEL
;  MOV gS,AX
;  MOV AL,'+'
;  MOV AH,41H  
;  MOV WORD PTR gS:[804],AX
;  dec ebx
;  jnz dff123
;  pop gs
;mmmmmmmmmmmm

            POP GS
            POP FS
            POP ES
            POP DS
            POP EDI
            POP ESI
            POP EDX
            POP ECX
            POP EBX
            POP EBP            ;POP EAX  REMAINS AX
            POP EBP
            IRETD
            ;*******************************enD V86 TASK
            ;*******************************enD V86 TASK
COS_DOSINT  ENDP
;test
  ;PUSH ES
  ;PUSH AX
  ;MOV AX,G_VRAM_SEL
  ;MOV ES,AX
  ;MOV AL,'z'
  ;MOV AH,41H  
  ;MOV WORD PTR ES:[804],AX
  ;POP AX
  ;POP ES
; test

;mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm
COS_INT09   PROC FAR
            PUSH EAX
            PUSH EBX
            PUSH ECX
            PUSH EDX
            PUSH GS
            PUSH FS
            PUSH ES
            PUSH DS
            ;PUSH ESP
            ;PUSH SS
            PUSH ESI
            PUSH EDI
            PUSH EBP

            MOV AX,G_VRAM_SEL
            MOV ES,AX
            MOV AH,41H  
            MOV AL,'G'
            MOV WORD PTR ES:[3996],AX
            
            POP EBP
            POP EDI
            POP ESI
            ;POP SS
            ;POP ESP
            POP DS
            POP ES
            POP FS
            POP GS
            POP EDX
            POP ECX
            POP EBX
tt1239:
;            MOV AL,20H
;            OUT 20H,AL
tt12329:
            POP EAX
            IRETD
COS_INT09   ENDP
;mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm

⌨️ 快捷键说明

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