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

📄 cos_used.asm

📁 操作系统实验教程核心技术与编程实例书中地例子代码
💻 ASM
字号:
GINT0EH     PROC FAR
            pop eax ;important  error code
            PUSH EAX
            PUSH FS
            PUSH DI
            MOV AX,G_PT0_SEL           ;       ;初始化页表0
            MOV FS,AX
                           ;PAGE 2  IN PAGE TABLE 1: invalid
            MOV EAX,402000H    ;8K FROM 4M BEGIN
            OR  EAX,3     ;   ;设置页表0的其它所有表项为为用户页
            MOV DI,1008H
            MOV DWORD PTR FS:[DI],EAX

GINT0EH_END:
            POP DI
            POP FS
            POP EAX
            IRETD   ;iret-->error
GINT0EH     ENDP

;***********PAGE
;V_SEL_SETUP PROC FAR
;            ;setup v_tos_data_sel
;            XOR EDX,EDX
;            MOV EBX,0C0423000H         ;TOS_CODE VIRTUAL BASE ADDR
;            mov dx,TOS_CODELEN
;            and dx,0FFFH
;            cmp dx,0
;            JE  V_SEL1
;            ADD EBX,1000H
;V_SEL1:
;            mov dx,TOS_CODELEN
;            and dx,0F000H
;            MOVZX EDX,DX
;            ADD EBX,EDX                ;EBX=TOS_STACK VIRTUAL BASE ADDR
;            MOV EBX,0C0433000H         ;let tos_code 64K
;
;            MOV AX,GDT_ASDATA_SEL     ;SETUP V_TOS_STACK_SEL
;            MOV DS,AX
;            ;MOV ECX,EBX
;            ;MOV DS:V_TOS_STACK.BASE_L,CX
;            ;SHR ECX,16
;            ;MOV DS:V_TOS_STACK.BASE_M,CL
;            ;MOV DS:V_TOS_STACK.BASE_H,CH 
;
;            mov dx,TOS_STACKLEN
;            MOVZX EDX,DX
;            ADD EBX,EDX   ;EBX=TOS_DATA ADDR
            ;MOV AX,GDT_ASDATA_SEL      ;SETUP V_TOS_DATA_SEL
            ;MOV DS,AX
            ;MOV ECX,EBX
            ;MOV DS:V_TOS_DATA.BASE_L,CX
            ;SHR ECX,16
            ;MOV DS:V_TOS_DATA.BASE_M,CL
            ;MOV DS:V_TOS_DATA.BASE_H,CH 
;
;            ADD EBX,010000H   ;EBX=USER_PSTSSSEG ADDR let TOS_DATA 64k

;            MOV AX,GDT_ASDATA_SEL      ;SETUP V_USER_PSTSS_SEL
;            MOV DS,AX
;            MOV ECX,EBX
;            MOV DS:V_USER_PSTSS.BASE_L,CX
;            SHR ECX,16
;            MOV DS:V_USER_PSTSS.BASE_M,CL
;            MOV DS:V_USER_PSTSS.BASE_H,CH 
;            MOV ECX,EBX                   ;SETUP USER_PSTSS_D
;            MOV DS:USER_PSTSS_D.BASE_L,CX
;            SHR ECX,16
;            MOV DS:USER_PSTSS_D.BASE_M,CL
;            MOV DS:USER_PSTSS_D.BASE_H,CH 

;            ADD EBX,1000H         ;EBX=USER_PSLDTSEG
;            MOV AX,GDT_ASDATA_SEL      ;SETUP V_USER_PSLDT_SEL
;            MOV DS,AX
;            MOV ECX,EBX
;            MOV DS:V_USER_PSLDTT.BASE_L,CX
;            SHR ECX,16
;            MOV DS:V_USER_PSLDTT.BASE_M,CL
;            MOV DS:V_USER_PSLDTT.BASE_H,CH 
;
;            MOV ECX,EBX                  ;SETUP USER_PSLDT_ASDATA_SEL
;            MOV DS:USER_PSLDTT_ASDATA.BASE_L,CX
;            SHR ECX,16
;            MOV DS:USER_PSLDTT_ASDATA.BASE_M,CL
;            MOV DS:USER_PSLDTT_ASDATA.BASE_H,CH 
;

;            MOV AX,TOS_DATA_SEL
;            MOV DS,AX
;            RET
;V_SEL_SETUP ENDP

SEGS_MOV_2M PROC FAR   ;mov to 2M  
            ;mov tos segs--->2M  use ds,es
            PUSH DS
            PUSH ES
            PUSH FS
            MOV AX,G_MOV_SEL
            MOV ES,AX
            XOR ESI,ESI
            XOR EDI,EDI
;;
            mov ebx,0
            MOV AX,idt_SEL
            MOV FS,AX
            MOV ESI,0
            MOV CX,idtLEN
G_MOV1:
            mov al,FS:[ESI]
            mov es:[EBX],al
            inc esi
            inc EBX
            loop G_MOV1
;;            G_MOV IDT_SEL,G_MOV_SEL,0,0,IDTLEN  ;     4K
            ;     s       d         s:offset  d:offset

            MOV AX,TOS_DATA_SEL
            MOV DS,AX
            MOV DS:IDT_M.PH_ADDR,200000H    ;IDT: 2M
            MOV DS:IDT_M.LO_ADDR,0C0400000H    ;IDT: 3G+4M
;;
            mov ebx,1000h
            MOV AX,TOS_TSSASDATA_SEL
            MOV FS,AX
            MOV ESI,0
            MOV CX,tos_tssLEN
G_MOV2:
            mov al,FS:[ESI]
            mov es:[EBX],al
            inc esi
            inc EBX
            loop G_MOV2
;;            G_MOV TOS_TSSASDATA_SEL,G_MOV_SEL,0,1000H,TOS_TSSLEN ;4K
            MOV AX,TOS_DATA_SEL
            MOV DS,AX
            MOV DS:TOS_TSS_M.PH_ADDR,201000H    ;TOS_TSS:2M+4k
            MOV DS:TOS_TSS_M.LO_ADDR,0C0401000H 
;;
            mov ebx,2000h
            MOV AX,GDT_ASDATA_SEL
            MOV FS,AX
            MOV ESI,0
            MOV CX,gdtsegLEN
G_MOV3:
            mov al,FS:[ESI]
            mov es:[EBX],al
            inc esi
            inc EBX
            loop G_MOV3
;;            G_MOV GDT_ASDATA_SEL,G_MOV_SEL,0,2000H,GDTSEGLEN     ;16*4K
            MOV AX,TOS_DATA_SEL
            MOV DS,AX
            MOV DS:GDT_M.PH_ADDR,202000H    ;
            MOV DS:GDT_M.LO_ADDR,0C0402000H    ;
            MOV DS:GPDT_M.PH_ADDR,212000H    ;4K
            MOV DS:GPDT_M.LO_ADDR,0C0412000H    ;4K
            MOV DS:GPT0_M.PH_ADDR,213000H    ;4K*16 16PAGES
            MOV DS:GPT0_M.LO_ADDR,0C0413000H    ;4K*16 16PAGES
;;
            mov ebx,23000h
            MOV AX,tos_code_SEL
            MOV FS,AX
            MOV ESI,0
            MOV CX,tos_codeLEN
G_MOV4:
            mov al,FS:[ESI]
            mov es:[EBX],al
            inc esi
            inc EBX
            loop G_MOV4
;;            G_MOV TOS_CODE_SEL,G_MOV_SEL,0,23000H,TOS_CODELEN
            MOV AX,TOS_DATA_SEL
            MOV DS,AX
            MOV DS:TOS_CODE_M.PH_ADDR,223000H    ;
            MOV DS:TOS_CODE_M.LO_ADDR,0C0423000H    ;

            XOR EDX,EDX
            MOV EBX,0
            mov dx,TOS_CODELEN
            and dx,0FFFH
            cmp dx,0
            JE g_mov_1
            ADD EBX,1000H
g_mov_1:
            mov dx,TOS_CODELEN
            and dx,0F000H
            ADD EBX,EDX
            ADD EBX,23000H         ;EBX PHISICAL OFFSET FOR stack

            MOV EBX,33000H         ;let tos_code 64k
            PUSH EBX               ;ebx=33000h
;;
            MOV AX,tos_stack_SEL
            MOV FS,AX
            MOV ESI,0
            MOV CX,tos_stacklen
G_MOV5:
            mov al,FS:[ESI]
            mov es:[EBX],al
            inc esi
            inc EBX
            loop G_MOV5
;;            G_MOV TOS_STACK_SEL,G_MOV_SEL,0,EBX,TOS_STACKLEN 
            pop ebx
            push ebx                          ;ebx=33000h
            ADD EBX,200000H
            MOV AX,TOS_DATA_SEL
            MOV DS,AX
            MOV DS:TOS_STACK_M.PH_ADDR,EBX    ;GDT:2M+18*4k+EDX
            ADD EBX,0C0200000H
            MOV DS:TOS_STACK_M.LO_ADDR,EBX    ;GDT:2M+18*4k+EDX

            POP EBX
            XOR EDX,EDX
            mov dx,TOS_STACKLEN
            MOVZX EDX,DX
            ADD EBX,EDX                        ;ebx=33000+tos_stacklen
            MOV EBX,34000H                     ; LET tos_stacklen=1000h
            PUSH EBX
;;
            MOV AX,TOS_DATA_SEL
            MOV FS,AX
            MOV ESI,0
            MOV CX,DATA_TOSLEN
G_MOV6:
            mov al,FS:[ESI]
            mov es:[EBX],al
            inc esi
            inc EBX
            loop G_MOV6
;;            G_MOV TOS_DATA_SEL,G_MOV_SEL,0,EBX,DATA_TOSLEN
            pop ebx
            ADD EBX,200000H
            MOV AX,TOS_DATA_SEL
            MOV DS,AX
            MOV DS:DATA_TOS_M.PH_ADDR,EBX    ;GDT:2M+18*4k+EDX
            ADD EBX,0C0200000H
            MOV DS:DATA_TOS_M.LO_ADDR,EBX    ;GDT:2M+18*4k+EDX


            MOV AX,USER_SEGS_mov_SEL
            MOV ES,AX
            MOV EBX,4096
            MOV AX,USER_PSTSS_MOV_SEL
            MOV FS,AX
            MOV ESI,0
            MOV CX,USER_PSTSSLEN
G_MOV7:
            mov al,FS:[ESI]
            mov es:[EBX],al
            inc esi
            inc EBX
            loop G_MOV7
;;            G_MOV USER_PSTSS_MOV_SEL,G_MOV_SEL,0,EBX,USER_PSTSSLEN

            MOV EBX,8192
            MOV AX,USER_PSldt_MOV_SEL
            MOV FS,AX
            MOV ESI,0
            MOV CX,USER_PSLDTLEN
G_MOV8:
            mov al,FS:[ESI]
            mov es:[EBX],al
            inc esi
            inc EBX
            loop G_MOV8
;;            G_MOV USER_PSLDT_MOV_SEL,G_MOV_SEL,0,EBX,USER_PSLDTLEN

SEGS_MOV_2M0:
            POP FS
            POP ES
            POP DS
            RET
SEGS_MOV_2M ENDP
;///////////
PGT_INIT    PROC FAR
            ; USE ES
            ; page DICTIONRY
            MOV AX,G_PDT_SEL           ;       ;初始化页目录表
            MOV ES,AX
            XOR DI,DI
            MOV CX,1024              ;  ;把其它所有项清空,置无效
            XOR EAX,EAX
            REP STOSD
            MOV EAX,G_PT0_ADDR OR 7  ;3:system  7 user important   
            MOV DWORD PTR ES:[0],EAX    ;0PAGE FOR TOS_CODE
            ADD EAX,1000H               
            MOV DWORD PTR ES:[4],EAX    ;1PAGE FOR G_BUF
            ADD EAX,1000H               
            MOV DWORD PTR ES:[3072],EAX ;768PAGE(3G) FOR VRAM   
            ADD EAX,1000H               
            MOV DWORD PTR ES:[3076],EAX ;769PAGE FOR TOS SYSTEM
            ADD EAX,1000H               
            MOV DWORD PTR ES:[4092],EAX ;1023PAGE FOR SFT
            ADD EAX,1000H               
            MOV DWORD PTR ES:[4088],EAX ;1022PAGE FOR PCB
            ADD EAX,1000H               
            MOV DWORD PTR ES:[4084],EAX ;1021PAGE FOR PCB

            ; ;设置页目录表中页表0的表项为用户页
            ;;(U/S=0),可读写页(R/W=1),和页有效(PL=1)

                            ;PAGE0 AND PAGE1
            MOV AX,G_PT0_SEL           ;       ;初始化页表0
            MOV ES,AX
            XOR EDI,EDI
            MOV CX,2048
            XOR EAX,EAX
            OR EAX,7     ;   ;设置页表0的其它所有表项为为用户页
            ;;(U/S=0),可读写页(R/W=1),和页有效(PL=1)
PGT_INIT0:
            ;STOSD
            mov es:[edi],eax
            add edi,4
            ADD EAX,1000H  ;PH_ADDR=LO_ADDR
            LOOP PGT_INIT0

            MOV CX,16
            MOV EAX,0B8000H  ;PAGE768 
            OR EAX,7     ;   ;设置页表0的其它所有表项为为用户页
PGT_INIT768:    ;3G
            ;STOSD
            mov es:[edi],eax
            add edi,4
            ADD EAX,1000H  
            LOOP PGT_INIT768
            add edi,4032

            MOV CX,512       ;phiscal:2M->4M virtual 3G+4M->3G+6
            MOV EAX,200000H  ;PAGE769  2M
            OR EAX,7     ;   ;设置页表0的其它所有表项为为用户页
PGT_INIT769:    
            ;STOSD
            mov es:[edi],eax
            add edi,4
            ADD EAX,1000H  
            LOOP PGT_INIT769

            ;sft sft_buf and 64k      page1023 last 128k +64K
            MOV EDI,20288      ;4 PAGE table(16384)+976items*4 only fill last 48 items
            MOV CX,48         ;48items
            MOV EAX,1D0000H   ;PAGE1023  
            OR EAX,7     ;   ;设置页表0的其它所有表项为为用户页
PGT_INIT1023:    
            ;STOSD
            mov es:[edi],eax
            add edi,4
            ADD EAX,1000H  
            LOOP PGT_INIT1023
            ;file system part

            ;PCB       page1022 4M
            ;MOV DI,   AFTER SFT
            MOV CX,1024         ;1K items
            MOV EAX,800000H   ;PAGE1022  8m START
            OR EAX,7     ;   ;设置页表0的其它所有表项为为用户页
PGT_INIT1022:    
            ;STOSD
            mov es:[edi],eax
            add edi,4
            ADD EAX,1000H  
            LOOP PGT_INIT1022
            ;file system part

            ;USER_SEGS       page1021 4M
            ;MOV DI,   AFTER SFT
            MOV CX,1024         ;1K items
            MOV EAX,0C00000H   ;PAGE1021  12m START
            OR EAX,7     ;   ;设置页表0的其它所有表项为为用户页
PGT_INIT1021:    
            ;STOSD
            mov es:[edi],eax
            add edi,4
            ADD EAX,1000H  
            LOOP PGT_INIT1021
            ;file system part

PGT_INIT_END:
            MOV AX,G_VRAM_SEL
            MOV ES,AX
            RET
PGT_INIT    ENDP

⌨️ 快捷键说明

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