www.pudn.com > czxtsycx1.zip > P_BASE.ASM


;PAGE 
;操作系统的基本的结构定义及宏 
;By 潘龙平/nuaa/08990115 
;Date:4/30/2002 
;=============================================================== 
 
GDT_PDT_ADDR	EQU 212000H 
GDT_PDT0_ADDR	EQU 213000H 
 
;*************段描述符结构开始************** 
;包括各种段描述符、任务状态段描述符 
STRUCT_SEG STRUC 
LIMIT_L		DW ? 
BASE_L		DW ? 
BASE_M		DB ? 
ACCESS		DB ? 
LIMIT_H		DB ? 
BASE_H		DB ? 
STRUCT_SEG ENDS 
;+++++++++++++段描述符结构结束+++++++++++++++ 
;-------------------------------------------------------------- 
;*************门描述符结构开始*************** 
;包括中断门、任务门、陷阱门、调用门 
STRUCT_GATE STRUC 
OFFSET_L	DW 0 
SELECTOR	DW 0 
DCOUNT		DB 0 
GATETYPE	DB 0 
OFFSET_H	DW 0 
STRUCT_GATE ENDS 
;++++++++++++门描述符结构结束+++++++++++++++ 
;-------------------------------------------------------------- 
;-------------------------------------------------------------- 
;*************任务状态段结构开始************ 
STRUCT_TSS STRUC 
TSS_LINK	DW 0,0 
TSS_ESP0	DD 0 
TSS_SS0		DW 0,0 
TSS_ESP1	DD 0 
TSS_SS1		DW 0,0 
TSS_ESP2	DD 0 
TSS_SS2		DW 0,0 
TSS_CR3		DD 0 
TSS_EIP		DD 0 
TSS_EFLAGS	DD 0 
TSS_EAX		DD 0 
TSS_ECX		DD 0 
TSS_EDX		DD 0 
TSS_EBX		DD 0 
TSS_ESP		DD 0 
TSS_EBP		DD 0 
TSS_ESI		DD 0 
TSS_EDI		DD 0 
TSS_ES		DW 0,0 
TSS_CS		DW 0,0 
TSS_SS		DW 0,0 
TSS_DS		DW 0,0 
TSS_FS		DW 0,0 
TSS_GS		DW 0,0 
TSS_LDT		DW 0,0 
TSS_FLAG_T	DW 0 
TSS_BITMAP	DW $+2 
STRUCT_TSS ENDS 
;++++++++++++++任务状态段结构结束++++++++++ 
;--------------------------------------------------------------- 
;**************OPEN_A20宏开始************++ 
;打开A20地址线 
OPEN_A20	MACRO 
		PUSH AX 
		IN AL,92H 
		OR AL,2 
		OUT 92H,AL 
		POP AX 
		ENDM 
;+++++++++++++OPEN_A20宏结束+++++++++++++++ 
;--------------------------------------------------------------- 
;*************CLOSE_A20宏开始************++ 
;关闭A20地址线 
CLOSE_A20	MACRO 
		PUSH AX 
		IN AL,92H 
		AND AL,0FDH 
		OUT 92H,AL 
		POP AX 
		ENDM 
;+++++++++++++CLOSE_A20宏结束++++++++++++++ 
;--------------------------------------------------------------- 
;*************TURN_TO_PROTECT宏开始******** 
;将SS、SP、GDT、LDT保存并转到保护模式 
;到实模式,程序调用该宏后,应接着调用INIT_PROCTECT宏 
;来进行初始化 
TURN_TO_PROTECT MACRO    
	MOV AX,REAL_DATA 
	MOV DS,AX 
	MOV AX,REAL_STACK 
	MOV SAVE_SS,AX 
	MOV SAVE_SP,SP 
	SGDT FWORD PTR SAVE_GDT 
	SIDT FWORD PTR SAVE_IDT 
	CLI 
	LGDT FWORD PTR GDT_SIZE 
	LIDT FWORD PTR IDT_SIZE 
	OPEN_A20 
	MOV EAX,CR0 
	OR EAX,1 
	MOV CR0,EAX 
	JMP TURN_TO_PROTECT_LBL1 
TURN_TO_PROTECT_LBL1: 
	DB 0EAH 
	DW OFFSET OS_BEGIN 
	DW OS_CODE_SEL 
	ENDM 
;+++++++++++++TURN_TO_PROTECT宏结束+++++++++++++++ 
;--------------------------------------------------------------- 
;*************INIT_PROCTECT宏开始***************** 
;进入保护模式后,初始化段寄存器、堆栈、任务寄存器 
INIT_PROCTECT   MACRO 
	CLI 
	MOV AX,OS_DATA_SEL 
	MOV DS,AX 
	MOV ES,AX 
	MOV FS,AX 
	MOV GS,AX 
	MOV AX,OS_STACK_SEL 
	MOV SS,AX 
	MOV AX,OS_STACK_LEN 
	MOV SP,AX 
	MOV AX,OS_TSS_SEL 
	LTR AX 
	ENDM 
;+++++++++++++INIT_PROCTECT宏结束+++++++++++++++ 
;--------------------------------------------------------------- 
;*************TURN_TO_REAL宏开始**************** 
;转到实模式,程序调用该宏后,应接着调用RETURN_TO_REAL_1宏 
;来恢复一些寄存器值 
TURN_TO_REAL	MACRO 
	CLI 
	MOV AX,REAL_SEL 
	MOV DS,AX 
	MOV ES,AX 
	MOV FS,AX 
	MOV GS,AX 
	MOV SS,AX 
	MOV EAX,CR0 
	AND EAX,0FFFFFFFEH 
	MOV CR0,EAX 
	JMP TURN_TO_REALLBL1 
TURN_TO_REALLBL1: 
	DB 0EAH 
	DW OFFSET LBL_TO_REAL 
	DW REAL_CODE 
	ENDM 
;+++++++++++++TURN_TO_REAL宏结束++++++++++++++++++ 
;--------------------------------------------------------------- 
;*************RETURN_TO_REAL_1宏开始***************** 
;转到实模式后恢复SS、SP、GDT、LDT 
RETURN_TO_REAL_1	MACRO 
	CLTS 
	CLI 
	CLOSE_A20 
	MOV AX,REAL_DATA 
	MOV DS,AX 
	MOV SS,SAVE_SS 
	MOV SP,SAVE_SP 
	LGDT FWORD PTR SAVE_GDT 
	LIDT FWORD PTR SAVE_IDT 
	STI 
	ENDM 
;+++++++++++++RETURN_TO_REAL_1宏结束+++++++++++++++ 
;---------------------------------------------------------------