📄 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宏结束+++++++++++++++
;---------------------------------------------------------------
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -