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

📄 asm8.asm

📁 保护模式教程源码 The source code of protection mode in dos
💻 ASM
字号:
;名称:ASM8.ASM
;功能:显示关键寄存器内容及说明操作系统类指令的使用
;编译:TASM ASM8.ASM
;连接:TLINK ASM8.OBJ
;----------------------------------------------------------------------------
INCLUDE         386SCD.INC
;----------------------------------------------------------------------------
GDTSeg          SEGMENT PARA USE16                ;全局描述符表数据段(16位)
;----------------------------------------------------------------------------
GDT             LABEL   BYTE
                ;空描述符
DUMMY           Desc    <>
                ;规范段描述符及选择子
Normal          Desc    <0ffffh,,,ATDW,,>
Normal_Sel      =       Normal-GDT
;----------------------------------------------------------------------------
EFFGDT          LABEL   BYTE
                ;临时任务代码段描述符及选择子
TempCode        Desc    <0ffffh,TempCodeSeg,,ATCE,,>
TempCode_Sel    =       TempCode-GDT
                ;缓冲区段描述符及选择子
Buffer          Desc    <BufferLen-1,BufferSeg,,ATDW,,>
Buffer_Sel      =       Buffer-GDT
                ;测试描述符1及选择子
Test1           Desc    <1111h,,,92h,87h,>
Test1_Sel       =       Test1-GDT
TestR_Sel       =       Test1-GDT+RPL3
                ;测试描述符2及选择子
Test2           Desc    <2222h,,,82h,17h,>
Test2_Sel       =       Test1-GDT
;----------------------------------------------------------------------------
GDNum           =       ($-EFFGDT)/(SIZE Desc)    ;需特殊处理的描述符数
GDTLen          =       $-GDT                     ;全局描述符表长度
;----------------------------------------------------------------------------
GDTSeg          ENDS                              ;全局描述符表段定义结束
;----------------------------------------------------------------------------
BufferSeg       SEGMENT PARA USE16                ;缓冲区数据段
;----------------------------------------------------------------------------
GDTR_V          PDesc   <>                        ;存放GDTR
IDTR_V          PDesc   <>                        ;存放IDTR
;----------------------------------------------------------------------------
MSW_V           DW      0                         ;存放机器状态字
LDTR_V          DW      0                         ;存放LDTR选择子
TR_V            DW      0                         ;存放TR选择子
CR0_V           DD      0                         ;存放控制寄存器CR0
CR3_V           DD      0                         ;存放控制寄存器CR3
DR7_V           DD      0                         ;存放调试寄存器DR7
Test_RPL        DW      0
;----------------------------------------------------------------------------
Test1_SLD       DD      0                         ;演示用变量
Test1_ARD       DD      0
Test1_SLW       DW      0
Test1_ARW       DW      0
Test1_RF        DW      0
Test1_WF        DW      0
;----------------------------------------------------------------------------
Test2_SLD       DD      0                         ;演示用变量
Test2_ARD       DD      0
Test2_SLW       DW      0
Test2_ARW       DW      0
Test2_RF        DW      0
Test2_WF        DW      0
;----------------------------------------------------------------------------
BufferLen       =       $
BufferSeg       ENDS
;----------------------------------------------------------------------------
TempCodeSeg     SEGMENT PARA USE16                ;临时代码段
                ASSUME  CS:TempCodeSeg,DS:BufferSeg
;----------------------------------------------------------------------------
Virtual         PROC    FAR
                mov     ax,Buffer_Sel
                mov     ds,ax
                mov     eax,cr0                   ;存储CR0
                mov     CR0_V,eax
                mov     eax,cr3                   ;存储CR3
                mov     CR3_V,eax
                mov     eax,DR7                   ;存储DR7
                mov     DR7_V,eax
                str     TR_V                      ;存储TR
                sldt    LDTR_V                    ;存储LDTR
                mov     Test_RPL,Test1_Sel
                mov     ax,TestR_Sel
                arpl    Test_RPL,ax               ;说明调整申请特权及指令
                mov     bx,0
                mov     ax,Test1_Sel
Lab1:           mov     edx,0
                mov     cx,0
                lsl     edx,eax                   ;说明装载段界限指令
                lsl     cx,ax
                mov     Test1_SLD[bx],edx
                mov     Test1_SLW[bx],cx
                mov     edx,0
                mov     cx,0
                lar     edx,eax                   ;说明装载存取权指令
                lar     cx,ax
                mov     Test1_ARD[bx],edx
                mov     Test1_ARW[bx],cx
                mov     Test1_RF[bx],0
                verr    ax                        ;说明读检验指令
                jnz     Lab2
                mov     Test1_RF[bx],1
Lab2:           mov     Test1_WF[bx],0
                verw    ax                        ;说明写检验指令
                jnz     Lab3
                mov     Test1_WF[bx],1
Lab3:           add     bx,16
                mov     ax,Test2_Sel
                cmp     bx,32
                jb      Lab1
                ;准备返回实方式
                mov     ax,Normal_Sel
                mov     ds,ax
                mov     eax,cr0
                and     al,11111110b
                mov     cr0,eax                   ;返回实方式
                JUMP16  <SEG Real>,<OFFSET Real>
Virtual         ENDP
;----------------------------------------------------------------------------
TempCodeSeg     ENDS
;----------------------------------------------------------------------------
RCodeSeg        SEGMENT PARA USE16
                ASSUME  CS:RCodeSeg,DS:BufferSeg
;----------------------------------------------------------------------------
VGDTR           PDesc   <GDTLen-1,>
;----------------------------------------------------------------------------
Start           PROC
                mov     ax,BufferSeg
                mov     ds,ax
                sgdt    GDTR_V
                sidt    IDTR_V
                smsw    MSW_V
                ;准备转入保护方式
                push    cs
                pop     ds
                cld
                call    InitGDT
                mov     bx,OFFSET VGDTR
                lgdt    [bx]
                cli
                mov     eax,cr0
                or      al,1
                ;转入保护方式
                mov     cr0,eax
                JUMP16  <TempCode_Sel>,<OFFSET Virtual>
Real:           ;回到实方式
                sti
                ;为了简单,略去了显示相关变量内容的部分代码
                mov     ax,4c00h
                int     21h
Start           ENDP
;----------------------------------------------------------------------------
InitGDT         PROC
                push    ds
                mov     ax,GDTSeg
                mov     ds,ax
                mov     cx,GDNum
                mov     si,OFFSET EFFGDT
InitG:          mov     ax,[si].BaseL
                movzx   eax,ax
                shl     eax,4
                shld    edx,eax,16
                mov     WORD PTR [si].BaseL,ax
                mov     BYTE PTR [si].BaseM,dl
                mov     BYTE PTR [si].BaseH,dh
                add     si,SIZE Desc
                loop    InitG
                pop     ds
                mov     bx,16
                mov     ax,GDTSeg
                mul     bx
                mov     WORD PTR VGDTR.Base,ax
                mov     WORD PTR VGDTR.Base+2,dx
                ret
InitGDT         ENDP
;----------------------------------------------------------------------------
RCodeSeg        ENDS
                END     Start

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -