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宏结束+++++++++++++++ ;---------------------------------------------------------------