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

📄 cos_def.asm

📁 操作系统实验教程核心技术与编程实例书中地例子代码
💻 ASM
字号:
TURN_TO_PROTECT_PAGE1 MACRO
            MOV AX,V86TSSSEG
            MOV DS,AX
            MOV DS:28,G_PDT_ADDR

            MOV AX,DATA
            MOV DS,AX
            MOV AX,STACK
            MOV SAVE_SS,AX
            MOV SAVE_SP,SP
            ; save current GDTR & IDTR
            SGDT FWORD PTR SAVE_GDT
            SIDT FWORD PTR SAVE_IDT
            cli
            LGDT FWORD PTR GDT_ADDR
            MOV AX,DATA_TOS
            MOV DS,AX
            LIDT FWORD PTR DS:IDTSIZE
            CALL OPEN_A20
            MOV EAX,CR0
            OR  EAX,1
            MOV CR0,EAX

TOS_ENTRY_PAGE:                       ;run tos
            JMP EDS_FLUSH2_PAGE1       ;clear instructors
EDS_FLUSH2_PAGE1: DB 0EAH
            DW OFFSET TOS_BEGIN
            DW TOS_CODE_SEL
            ENDM

REAL_PAGE_INIT  MACRO          ;COS HAVE MODIFIED  
            CLI
            MOV AX,STACK
            MOV SS,AX
            STI
            ;set gdt_desc for g_buf
            ;MOV AX,GDTSEG
            ;MOV DS,AX
            ;MOV DI,OFFSET G_BUF
            ;MOV [DI].BASE_L,0      ;base_addr=4M
            ;MOV [DI].BASE_M,G_BUF_BASE
            ;MOV [DI].GRAN,0FH      ;limit=1M
            ;set idt_desc for IDT21
            ;MOV AX,IDTSEG
            ;MOV DS,AX
            ;MOV DI,OFFSET IDT21
            ;MOV AX,OFFSET COSINT21H
            ;MOV DS:[DI].OFF_L,AX
            ;set idt_desc for IDT0E
            MOV AX,IDTSEG
            MOV DS,AX
            MOV DI,OFFSET IDT0E
            MOV AX,OFFSET GINT0EH
            MOV DS:[DI].OFF_L,AX
            ;setup idt
            CLI
            MOV AX,DATA_TOS
            MOV DS,AX
            MOV AX,IDTSEG
            MOV CX,10H
            MUL CX
            ADC DX,0           ;DX:AX=32 address for IDT
            MOV DS:IDTLOAD,AX
            MOV DS:IDTLOAD+2,DX
            MOV AX,OFFSET IDTLEN
            ADD AX,1
            MOV DS:IDTSIZE,AX
            ;;;
            MOV AX,DATA_TOS
            MOV DS,AX
            XOR DX,DX
            MOV AX,V86IDTSEG
            MOV CX,10H
            MUL CX
            ADC DX,0           ;DX:AX=32 address for IDT
            MOV DS:V86_IDTLOAD,AX
            MOV DS:V86_IDTLOAD+2,DX
            MOV AX,OFFSET V86IDTLEN
            ADD AX,1
            MOV DS:V86_IDTSIZE,AX
            ;;;
            MOV AX,DATA
            MOV DS,AX
            ENDM

COS_INIT    MACRO            
            cli
            MOV AX,TOS_DATA_SEL
            MOV DS,AX
            MOV ES,AX
            MOV AX,DATA_SEL
            MOV FS,AX
            MOV AX,G_BUF_SEL
            MOV GS,AX
            MOV AX,TOS_STACK_SEL
            MOV SS,AX
            MOV AX,TOS_STACKLEN
            dec ax
            MOV SP,AX
            MOV AX,G_VRAM_SEL
            MOV ES,AX
            MOV AX,TOS_TSS_SEL
            LTR AX
            ;***********page --->start
            MOV AX,TOS_TSSASDATA_SEL
            MOV DS,AX
            MOV EAX,G_PDT_ADDR
            mov DS:TOS_TASK.trcr3,eax
            ENDM

COS_PAGE_INIT MACRO            
            ;***********MODIFY interrupt --- use 200000H idt
            MOV AX,TOS_DATA_SEL
            MOV DS,AX
            MOV WORD PTR DS:IDTLOAD,0
            MOV WORD PTR DS:IDTLOAD+2,20h
            LIDT FWORD PTR DS:IDTSIZE
            ;***********MODIFY gdt --- use 202000H gdt
            MOV WORD PTR DS:IDTLOAD,2000H
            MOV WORD PTR DS:IDTLOAD+2,20h
            LGDT FWORD PTR DS:IDTSIZE
            ;***********ENTER PAGE
            MOV EAX,G_PDT_ADDR
            MOV CR3,EAX       ; ;把页目录表基址装入控制寄存器CR3
            MOV EAX,CR0
            OR EAX,80000000H
            MOV CR0,EAX       ; ;进入分页模式

            JMP SHORT PAGE_BEGIN ;  ;清除指令缓冲区
PAGE_BEGIN: ;*********************
            DB 0EAH
            DW OFFSET V_TOS_CODE_BEGIN
            DW V_TOS_CODE_SEL           ; USE 2M PROGRAM
V_TOS_CODE_BEGIN:
            MOV AX,V_TOS_DATA_SEL      ; USE 2M DATA
            MOV DS,AX
            ;CLI   should not used
            MOV AX,V_TOS_STACK_SEL     ; USE 2M STACK
            MOV SS,AX
            ;STI
            MOV AX,V_TOS_TSS_SEL       ; USE 2M TSS ONLY USEING IN PS_LDT
            LTR AX                     
            MOV CX,08D0H          ; 清屏
            MOV BX,0              ;ds:tos_data fs:data
scr1:       MOV ES:[BX],0720H
            ADD BX,2
            LOOP scr1
            CALL disp_TOS_in_tos  ; 显示U.EXE的LDT表和开头部分内容,本书未给清单
            ;MOV AH,9              ; 显示"This is a protect_mode program!"
            ;MOV CX,0205H ;15 row 21 column
            ;MOV DX,OFFSET TEST_MSG  
            ;INT 21H
                                  ; HAVE ENTERED PAGE_MODE
            ENDM

⌨️ 快捷键说明

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