📄 g_def.asm
字号:
;(3)包含文件\TC\G\INCLUDE\G_DEF.ASM清单
;(本程序仅用GDT_DESC结构、若干常量定义、宏TO_DOS)
GDT_DESC STRUC ; 全局、局部描述符表结构
LIMIT DW ? ; 限长
BASE_L DW ? ; 段基址0-15
BASE_M DB ? ; 段基址16-23
ACCESS DB ? ; 段属性
GRAN DB ? ; 段属性
BASE_H DB ? ; 段基址24-31
GDT_DESC ENDS
SZ_GDT_DESC EQU SIZE GDT_DESC
PE_ON EQU 01H;Protection Enable
GDT_CS_SEL EQU 08H;00001000 第一个
GDT_DS_SEL EQU 10H;00010000 第二个
GDT_SS_SEL EQU 18H;00011000 第三个
VRAM_SEL EQU 20H;00100000 第四个
GDT_BUF_SEL EQU 28H;00101000 第五个
G_BUF_BASE = 04H ;4M
G_PDT_ADDR = 212000H ;页目录物理基地址
G_PT0_ADDR = 213000H ;页表物理基地址
GAT_DESC STRUC ;门描述符结构
OFFSET_L DW 0 ;32位偏移的低16位
SELECTOR DW 0 ;选择子
DCOUNT DB 0 ;双字计数字段
GTYPE DB 0 ;类型
OFFSET_H DW 0 ;32位偏移的高16位
GAT_DESC ENDS
IDT_DESC STRUC ;中断描述符表结构
OFF_L DW ? ;32位位移的低16位
SELECTOR DW ? ;选择子
ATTR DW ? ;属性
OFF_H DW ? ; 32位位移的高6位
IDT_DESC ENDS
TASKSS STRUC ;任务状态段结构
TRLINK DW 0,0 ;链接字
TRESP0 DW 0,0 ;0级堆栈指针
TRSS0 DW 0,0
TRESP1 DW 0,0 ;1级堆栈指针
TRSS1 DW 0,0
TRESP2 DW 0,0 ;2级堆栈指针
TRSS2 DW 0,0
TRCR3 DD 0
TREIP DW 0,0
TREFLAG DD 0
TREAX DD 0
TRECX DD 0
TREDX DD 0
TREBX DD 0
TRESP DW 0,0
TREBP DD 0
TRESI DD 0
TREDI DD 0
TRES DW 0,0
TRCS DW 0,0
TRSS DW 0,0
TRDS DW 0,0
TRFS DW 0,0
TRGS DW 0,0
TRLDT DW 0,0
TRFLAG DW 0 ;TSS的特别属性字
TRIOMAP DW 0068h ;指向I/O许可位图区的指针
dd 5 dup(0) ;I/O许可位图区
TASKSS ENDS
TO_DOS MACRO ;宏:返回DOS操作系统
CLTS
cli
CALL CLOSE_A20 ;关A20地址线,回实模式
MOV AX,DATA
MOV DS,AX
MOV SS,SAVE_SS ;恢复实模式下堆栈段基址
MOV SP,SAVE_SP ;恢复栈指针
LGDT FWORD PTR SAVE_GDT ;恢复GDT和IDT(在DOS下的)实模式下的
LIDT FWORD PTR SAVE_IDT
MOV AL,11111100B ;允许时钟和键盘中断
OUT 21H,AL
sti
LEA DX,OK_MSG
mov cx,0C00H
MOV AH,9
INT 21H;显示OK字符
MOV AX,4C00H
INT 21H;带返回码结束,回DOS,这里是TOS下的中断过程,用于返回DOS
ENDM
TURN_TO_PROTECT_PAGE MACRO ; 宏:由实模式->保护模式
MOV AX,DATA
MOV DS,AX
MOV AX,STACK
MOV SAVE_SS,AX
MOV SAVE_SP,SP
SGDT FWORD PTR SAVE_GDT ;保存当前的GDTR & IDTR
SIDT FWORD PTR SAVE_IDT
cli
LGDT FWORD PTR GDT_ADDR ;载入COS用
MOV AX,DATA_TOS
MOV DS,AX
LIDT FWORD PTR DS:IDTSIZE
CALL OPEN_A20
MOV EAX,CR0
OR EAX,1
MOV CR0,EAX ;将CR0的最低位PE置1,允许保护模式
TOS_ENTRY_PAGE:
JMP EDS_FLUSH2_PAGE ;清指令
EDS_FLUSH2_PAGE: DB 0EAH
DW OFFSET TOS_BEGIN ;跳转到COS系统执行
DW TOS_CODE_SEL
ENDM
;本宏要完成的任务:SS=STACK , 设置G_BUF ,设置IDT21,设置 IDT , IDT地址存入IDTLOAD;IDT大小存入IDTSIZE; DS=DSTA
REAL_BEGIN_PAGE MACRO ;实模式初始处理
CLI
MOV AX,STACK
MOV SS,AX
STI
MOV AX,GDTSEG ;设置g_buf的描述符
MOV DS,AX
MOV DI,OFFSET G_BUF
MOV [DI].BASE_L,0 ;基址=4M G_BUF.BASE_L=0
MOV [DI].BASE_M,G_BUF_BASE ;G_BUF.BASE_M=G_BUF_BASE,其实就是G_BUF.BASE_M=04H
MOV [DI].GRAN,0FH ;限长=1M ;G_BUF.GRAN=0FH
MOV AX,IDTSEG ;设置IDT21的描述符
MOV DS,AX
MOV DI,OFFSET IDT21
MOV AX,OFFSET GINT21H
MOV DS:[DI].OFF_L,AX
CLI ;设置IDT
MOV AX,DATA_TOS
MOV DS,AX
MOV AX,IDTSEG
MOV CX,10H
MUL CX
ADC DX,0 ;DX:AX=32 位IDT表地址
MOV DS:IDTLOAD,AX
MOV DS:IDTLOAD+2,DX
MOV AX,OFFSET IDTLEN
ADD AX,1
MOV DS:IDTSIZE,AX
MOV AX,DATA
MOV DS,AX
ENDM
TOS_BEGIN0 MACRO ;保护模式初始处理
cli
MOV AX,TOS_DATA_SEL
MOV DS,AX
MOV ES,AX
MOV AX,DATA_SEL
MOV FS,AX
MOV AX,G_BUF_SEL
MOV GS,AX
MOV AX,TOS_STACK_SEL
MOV SS,AX
MOV AX,TOS_STACKLEN
dec ax
MOV SP,AX
MOV AX,G_VRAM_SEL
MOV ES,AX
MOV AX,TOS_TSS_SEL
LTR AX ;LTR是Load Task Register的缩写,书上没有出现解释
ENDM
;分页系统使用的宏
G_MOV MACRO s_selector,d_selector,s_offset,d_offset,mlen;移动内存数据块
LOCAL G_MOV1
MOV AX,s_selector ;源选择子
MOV DS,AX
MOV AX,d_selector ;目标选择子
MOV ES,AX
MOV SI,s_offset ;源偏移
MOV EDI,d_offset ;目标偏移
MOV CX,mlen ;移动的字节数
G_MOV1:
mov al,ds:[si]
mov es:[edi],al
inc si
inc edi
loop G_MOV1
MOV AX,g_vram_sel
MOV ES,AX
MOV AX,TOS_data_sel
MOV dS,AX
ENDM
SEGMAP_DESC STRUC
PH_ADDR DD ?
LO_ADDR DD ?
SEGMAP_DESC ENDS
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -