📄 p_os.asm
字号:
MOV AX,OS_DATA_SEL ;保存IDT与GDT,以便分页后恢复
MOV DS,AX
SIDT FWORD PTR DS:P_IDT_SIZE
SGDT FWORD PTR DS:P_GDT_SIZE
;-------------------------------------------------------------------
MOV AH,2 ;用浅蓝色清屏
MOV CL,9
INT 21H
MOV AH,07H
MOV BX,120
MOV DX,160
MOV SI,480
MOV DI,220
MOV CH,08H
MOV CL,07H
INT 21H
MOV AH,07H
MOV BX,125
MOV DX,165
MOV SI,480-10
MOV DI,220-10
MOV CH,07H
MOV CL,08H
INT 21H
MOV AX,OS_DATA_SEL ;显示字符串
MOV DS,AX
MOV ES,AX
MOV AX,0100H
MOV DI,OFFSET MSG ;msg1_1
MOV BX,12
MOV DX,35
MOV CL,07H
INT 21H
MOV AX,OS_DATA_SEL ;显示字符串
MOV ES,AX
MOV AX,0100H
MOV DI,OFFSET MSG1_2
MOV BX,16
MOV DX,27
MOV CL,07H
INT 21H
MOV AX,OS_DATA_SEL ;显示字符串
MOV ES,AX
MOV AX,0100H
MOV DI,OFFSET MSG1_3
MOV BX,35
MOV DX,2
MOV CL,07H
INT 21H
MOV AH,7
MOV BX,16*34+4
MOV DX,8*69
MOV SI,8*26
MOV DI,40
MOV CH,08H
MOV CL,0FH
INT 21H
MOV AX,OS_DATA_SEL ;显示字符串
MOV ES,AX
MOV AX,0100H
MOV DI,OFFSET MSG_PLP
MOV BX,35
MOV DX,72
MOV CL,07H
INT 21H
MOV AX,OS_DATA_SEL
MOV ES,AX
MOV SI,OFFSET OS_BMPBUF
MOV AH,5
MOV BX,16*19
MOV DX,8*50
MOV BP,80
MOV CX,80
INT 21H
;-------------------------------------------------------------------
LBL_WAIT_A: ;等待按A键
IN AL,60H
CMP AL,1EH
JNZ LBL_WAIT_A
DB 0EAH ;切换到任务1
DW 0
DW USER1_TSS_SEL
LBL_BACK_TO_OS:
;//////////////////////////////////////////////////////////
;为分页做准备
MOV AX,OS_TSS_ASDATA_SEL
MOV DS,AX
MOV EAX,GDT_PDT_ADDR
MOV DS:STRUCT_TSS.TSS_CR3,EAX
CALL V_SEL_SETUP ;初始化一些分页用的段描述符
CALL SEGS_MOV_2M ;将OS段移到2M处
CALL INIT_PDT ;初始化PDT
MOV AX,OS_DATA_SEL
MOV DS,AX
MOV WORD PTR DS:V_IDT_ADDR,0
MOV WORD PTR DS:V_IDT_ADDR+2,20H
LIDT FWORD PTR DS:V_IDT_SIZE
MOV WORD PTR DS:V_GDT_ADDR,2000H
MOV WORD PTR DS:V_GDT_ADDR+2,20H
LGDT FWORD PTR DS:V_GDT_SIZE
MOV EAX,GDT_PDT_ADDR
MOV CR3,EAX ;设置页目录表的地址
MOV EAX,CR0 ;启动分页
OR EAX,80000000H
MOV CR0,EAX
JMP SHORT PAGE_BEGIN
PAGE_BEGIN:
DB 0EAH ;进入分页模式
DW OFFSET V_OS_CODE_BEGIN
DW V_OS_CODE_SEL
V_OS_CODE_BEGIN:
MOV AX,V_OS_DATA_SEL
MOV DS,AX
MOV AX,V_OS_STACK_SEL
MOV SS,AX
MOV AX,V_OS_TSS_SEL
LTR AX
;-------------------------------------------------------------------
;-------------------------------------------------------------------
MOV AH,2 ;用浅蓝色清屏
MOV CL,9
INT 21H
MOV AH,07H ;显示矩形框
MOV BX,130
MOV DX,200
MOV SI,400
MOV DI,200
MOV CH,08H
MOV CL,07H
INT 21H
MOV AH,07H ;显示矩形框
MOV BX,135
MOV DX,205
MOV SI,400-10
MOV DI,200-10
MOV CH,07H
MOV CL,08H
INT 21H
MOV AX,V_OS_DATA_SEL ;显示字符串
MOV DS,AX
MOV ES,AX
MOV AX,0100H
MOV DI,OFFSET MSG2_1
MOV BX,12
MOV DX,40
MOV CL,07H
INT 21H
MOV AX,V_OS_DATA_SEL ;显示字符串
MOV ES,AX
MOV AX,0100H
MOV DI,OFFSET MSG2_2
MOV BX,16
MOV DX,35
MOV CL,07H
INT 21H
MOV AX,V_OS_DATA_SEL ;显示字符串
MOV ES,AX
MOV AX,0100H
MOV DI,OFFSET MSG2_3
MOV BX,35
MOV DX,2
MOV CL,07H
INT 21H
MOV AH,7 ;显示矩形框
MOV BX,16*34+4
MOV DX,8*69
MOV SI,8*26
MOV DI,40
MOV CH,08H
MOV CL,0FH
INT 21H
MOV AX,V_OS_DATA_SEL ;显示字符串
MOV ES,AX
MOV AX,0100H
MOV DI,OFFSET MSG_PLP
MOV BX,35
MOV DX,72
MOV CL,07H
INT 21H
LBL_WAIT_D: ;等待按D键
IN AL,60H
CMP AL,20H
JNZ LBL_WAIT_D
;------------------------------------------------------------------
MOV AH,2 ;用浅蓝色清屏
MOV CL,9
INT 21H
MOV AH,07H ;显示矩形框
MOV BX,130
MOV DX,200
MOV SI,400
MOV DI,200
MOV CH,07H
MOV CL,08H
INT 21H
MOV AH,07H ;显示矩形框
MOV BX,135
MOV DX,205
MOV SI,400-10
MOV DI,200-10
MOV CH,08H
MOV CL,07H
INT 21H
MOV AX,V_OS_DATA_SEL ;显示字符串
MOV DS,AX
MOV ES,AX
MOV AX,0100H
MOV DI,OFFSET MSG3_1
MOV BX,12
MOV DX,45
MOV CL,07H
INT 21H
MOV AX,V_OS_DATA_SEL ;显示字符串
MOV ES,AX
MOV AX,0100H
MOV DI,OFFSET MSG3_2
MOV BX,16
MOV DX,40
MOV CL,07H
INT 21H
MOV AX,V_OS_DATA_SEL ;显示字符串
MOV ES,AX
MOV AX,0100H
MOV DI,OFFSET MSG3_3
MOV BX,35
MOV DX,2
MOV CL,07H
INT 21H
MOV AH,7 ;显示矩形框
MOV BX,16*34+4
MOV DX,8*69
MOV SI,8*26
MOV DI,40
MOV CH,08H
MOV CL,0FH
INT 21H
MOV AX,V_OS_DATA_SEL ;显示字符串
MOV ES,AX
MOV AX,0100H
MOV DI,OFFSET MSG_PLP
MOV BX,35
MOV DX,72
MOV CL,07H
INT 21H
LBL_WAIT_F: ;等待按F键
IN AL,60H
CMP AL,21H
JNZ LBL_WAIT_F
;------------------------------------------------------------------
MOV AX,V_OS_DATA_SEL
MOV DS,AX
LIDT FWORD PTR DS:P_IDT_SIZE
LGDT FWORD PTR DS:P_GDT_SIZE
DB 0EAH
DW OFFSET PAGE_END
DW OS_CODE_SEL
PAGE_END:
MOV EAX,CR0
AND EAX,7FFFFFFFH
MOV CR0,EAX ;关闭分页
JMP SHORT FROM_PAGE
FROM_PAGE:
;分页结束
;////////////////////////////////////////////////////////
TURN_TO_REAL ;返回到实模式
INCLUDE P_INT.ASM
INCLUDE P_2.ASM
OS_CODE_LEN EQU $
OS_CODE ENDS
;++++++++++++++OS代码段结束+++++++++++++++++++++++++++++++++++++
;---------------------------------------------------------------
;**************中断描述符表开始*********************************
IDT_SEG SEGMENT PARA USE16
IDT0 STRUCT_GATE 21H DUP(<>)
IDT21 STRUCT_GATE<0,OS_CODE_SEL,0,8EH,0>
IDT_LEN EQU $
IDT_SEG ENDS
;++++++++++++++中断描述符表结束+++++++++++++++++++++++++++++++++
;---------------------------------------------------------------
;**************全局描述符表开始*********************************
GDT_SEG SEGMENT
GDT_NULL STRUCT_SEG<0,0,0,0,0,0>
GDT_REAL_SEG STRUCT_SEG<0FFFFH,0,0,92H,0,0>
REAL_SEL EQU GDT_REAL_SEG-GDT_NULL
GDT_INIT_BEGIN LABEL BYTE
GDT_REAL_CODE STRUCT_SEG<0FFFFH,REAL_CODE,0,9AH,0,0>
REAL_CODE_SEL EQU GDT_REAL_CODE-GDT_NULL
GDT_REAL_DATA STRUCT_SEG<REAL_DATA_LEN,REAL_DATA,0,92H,0,0>
REAL_DATA_SEL EQU GDT_REAL_DATA-GDT_NULL
GDT_OS_DATA STRUCT_SEG<OS_DATA_LEN,OS_DATA,0,92H,0,0>
OS_DATA_SEL EQU GDT_OS_DATA-GDT_NULL
GDT_OS_CODE STRUCT_SEG<0FFFFH,OS_CODE,0,9AH,0,0>
OS_CODE_SEL EQU GDT_OS_CODE-GDT_NULL
GDT_OS_STACK STRUCT_SEG<OS_STACK_LEN,OS_STACK,0,92H,0,0>
OS_STACK_SEL EQU GDT_OS_STACK-GDT_NULL
GDT_OS_TSS STRUCT_SEG<OS_TSS_LEN,OS_TSS,0,89H,0,0>
OS_TSS_SEL EQU GDT_OS_TSS-GDT_NULL
GDT_IDT STRUCT_SEG<IDT_LEN,IDT_SEG,0,92H,0,0>
GDT_IDT_SEL EQU GDT_IDT-GDT_NULL
GDT_ASDATA STRUCT_SEG<GDT_LEN,GDT_SEG,0,92H,0,0>
GDT_ASDATA_SEL EQU GDT_ASDATA-GDT_NULL
OS_TSS_ASDATA STRUCT_SEG<OS_TSS_LEN,OS_TSS,0,92H,0,0>
OS_TSS_ASDATA_SEL EQU OS_TSS_ASDATA-GDT_NULL
GDT_USER1_TSS STRUCT_SEG<USER1_TSS_LEN,USER1_TSS,0,89H,0,0>
USER1_TSS_SEL EQU GDT_USER1_TSS-GDT_NULL
GDT_USER1_LDT STRUCT_SEG<USER1_LDT_LEN,USER1_LDT_SEG,0,82H,0,0>
USER1_LDT_SEL EQU GDT_USER1_LDT-GDT_NULL
GDT_INIT_COUNT EQU ($-GDT_INIT_BEGIN)/(SIZE STRUCT_SEG)
;*****************************************************
GDT_PDT STRUCT_SEG<0FFFFH,2000H,21H,92H,0,0>
GDT_PDT_SEL EQU GDT_PDT-GDT_NULL
GDT_PDT0 STRUCT_SEG<0FFFFH,3000H,21H,92H,0,0>
GDT_PDT0_SEL EQU GDT_PDT0-GDT_NULL
GDT_MOV_SEG STRUCT_SEG<0FFFFH,0,20H,92H,0FH,0>
GDT_MOV_SEL EQU GDT_MOV_SEG-GDT_NULL
;****************************************************
V_OS_CODE STRUCT_SEG<0FFFFH,3000H,42H,9AH,0,0C0H>
V_OS_CODE_SEL EQU V_OS_CODE-GDT_NULL
V_OS_STACK STRUCT_SEG<OS_STACK_LEN,0,0,92H,0,0>
V_OS_STACK_SEL EQU V_OS_STACK-GDT_NULL
V_OS_DATA STRUCT_SEG<OS_DATA_LEN,0,0,92H,0,0>
V_OS_DATA_SEL EQU V_OS_DATA-GDT_NULL
V_OS_TSS STRUCT_SEG<OS_TSS_LEN,1000H,40H,89H,0,0C0H>
V_OS_TSS_SEL EQU V_OS_TSS-GDT_NULL
V_GDT_VRAM STRUCT_SEG<0FFFFH,0,0,92H,0,0C0H> ;图形方式显示存储区段
V_GDT_VRAM_SEL EQU GDT_VRAM-GDT_NULL
GDT_VRAM STRUCT_SEG<0FFFFH,0H,0AH,92H,0,0>
GDT_VRAM_SEL EQU GDT_VRAM-GDT_NULL
HZK_SEG STRUCT_SEG<0FFFFH,0,40H,92H,0FH,0> ;汉字库段
HZK_BUF_SEL EQU HZK_SEG-GDT_NULL
GDT_LEN EQU $
GDT_SEG ENDS
;++++++++++++++全局描述符表结束++++++++++++++++++++++++++++++++
;---------------------------------------------------------------
INCLUDE P_USER_1.ASM
END START
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -