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

📄 g_def.asm

📁 实现了分段分页
💻 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 + -