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

📄 p_os.asm

📁 操作系统实验教程核心技术与编程实例书中地例子代码
💻 ASM
📖 第 1 页 / 共 2 页
字号:
	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 + -