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

📄 asm4.asm

📁 保护模式教程源码 The source code of protection mode in dos
💻 ASM
📖 第 1 页 / 共 2 页
字号:
;名称:ASM4.ASM
;功能:演示任务内有特权级变换的转移
;编译:TASM ASM4.ASM
;连接:TLINK /32 ASM4.OBJ
;----------------------------------------------------------------------------
INCLUDE         386SCD.INC
;----------------------------------------------------------------------------
GDTSeg          SEGMENT PARA USE16                ;全局描述符表数据段(16位)
;----------------------------------------------------------------------------
                ;全局描述符表
GDT             LABEL   BYTE
                ;空描述符
DUMMY           Desc    <>
                ;规范段描述符
Normal          Desc    <0ffffh,,,ATDW,,>
                ;视频缓冲区段描述符(DPL=3)
VideoBuf        Desc    <07fffh,8000h,0bh,ATDW+DPL3,,>
;----------------------------------------------------------------------------
EFFGDT          LABEL   BYTE
                ;任务状态段TSS描述符
DemoTSS         Desc    <DemoTssLen-1,DemoTSSSeg,,AT386TSS,,>
                ;局部描述符表段的描述符
DemoLDTD        Desc    <DemoLDTLen-1,DemoLDTSeg,,ATLDT,,>
                ;临时代码段描述符
TempCode        Desc    <0ffffh,TempCodeSeg,,ATCE,,>
;----------------------------------------------------------------------------
GDTLen          =       $-GDT                     ;全局描述符表长度
GDNum           =       ($-EFFGDT)/(SIZE Desc)    ;需特殊处理的描述符数
;----------------------------------------------------------------------------
Normal_Sel      =       Normal-GDT                ;规范段描述符选择子
Video_Sel       =       VideoBuf-GDT              ;视频缓冲区段描述符选择子
;----------------------------------------------------------------------------
DemoTSS_Sel     =       DemoTSS-GDT               ;任务状态段描述符选择子
DemoLDT_Sel     =       DemoLDTD-GDT              ;局部描述符表段的选择子
TempCode_Sel    =       TempCode-GDT              ;临时代码段的选择子
;----------------------------------------------------------------------------
GDTSeg          ENDS                              ;全局描述符表段定义结束
;----------------------------------------------------------------------------
DemoLDTSeg      SEGMENT PARA USE16                ;局部描述符表数据段(16位)
;----------------------------------------------------------------------------
DemoLDT         LABEL   BYTE                      ;局部描述符表
                ;0级堆栈段描述符(32位段)
DemoStack0      Desc    <DemoStack0Len-1,DemoStack0Seg,,ATDW+DPL0,D32,>
                ;1级堆栈段描述符(32位段)
DemoStack1      Desc    <DemoStack1Len-1,DemoStack1Seg,,ATDW+DPL1,D32,>
                ;3级堆栈段描述符(16位段)
DemoStack3      Desc    <DemoStack3Len-1,DemoStack3Seg,,ATDW+DPL3,,>
                ;代码段描述符(32位段,DPL=3)
DemoCode        Desc    <DemoCodeLen-1,DemoCodeSeg,,ATCE+DPL3,D32,>
                ;过渡代码段描述符(32位段)
T32Code         Desc    <T32CodeLen-1,T32CodeSeg,,ATCE,D32,>
                ;显示子程序代码段描述符(32位段,DPL=1)
EchoSubR        Desc    <EchoSubRLen-1,EchoSubRSeg,,ATCER+DPL1,D32,>
;----------------------------------------------------------------------------
DemoLDNum       =       ($-DemoLDT)/(SIZE Desc)
;----------------------------------------------------------------------------
                ;0级堆栈描述符选择子(RPL=0)
DemoStack0_Sel  =       DemoStack0-DemoLDT+TIL+RPL0
                ;1级堆栈描述符选择子(RPL=1)
DemoStack1_Sel  =       DemoStack1-DemoLDT+TIL+RPL1
                ;3级堆栈描述符选择子(RPL=3)
DemoStack3_Sel  =       DemoStack3-DemoLDT+TIL+RPL3
                ;代码段描述符选择子(RPL=3)
DemoCode_Sel    =       DemoCode-DemoLDT+TIL+RPL3
                ;过渡代码段描述符选择子
T32Code_Sel     =       T32Code-DemoLDT+TIL
                ;显示子程序代码段描述符选择子(RPL=1)
Echo_Sel1       =       EchoSubR-DemoLDT+TIL+RPL1
                ;显示子程序代码段描述符选择子(RPL=3)
Echo_Sel3       =       EchoSubR-DemoLDT+TIL+RPL3
;----------------------------------------------------------------------------
                ;指向过渡代码段内T32Begin点的调用门(DPL=0)
ToT32GateA      Gate    <T32Begin,T32Code_Sel,,AT386CGate,>
                ;指向过渡代码段内T32End点的调用门(DPL=3)
ToT32GateB      Gate    <T32End,T32Code_Sel,,AT386CGate+DPL3,>
                ;指向显示子程序代码段的调用门(DPL=3)
ToEchoGate      Gate    <EchoSub,Echo_Sel3,,AT386CGate+DPL3,>
;----------------------------------------------------------------------------
DemoLDTLen      =       $-DemoLDT
;----------------------------------------------------------------------------
                ;指向过渡代码段内T32Begin点的调用门的选择子
ToT32A_Sel      =       ToT32GateA-DemoLDT+TIL
                ;指向过渡代码段内T32End点的调用门的选择子
ToT32B_Sel      =       ToT32GateB-DemoLDT+TIL
                ;显示子程序调用门的选择子
ToEcho_Sel      =       ToEchoGate-DemoLDT+TIL
;----------------------------------------------------------------------------
DemoLDTSeg      ENDS                              ;局部描述符表段定义结束
;----------------------------------------------------------------------------
DemoTSSSeg      SEGMENT PARA USE16                ;任务状态段TSS
;----------------------------------------------------------------------------
                DD      0                         ;Back
                DD      DemoStack0Len             ;0级堆栈指针
                DD      DemoStack0_Sel            ;初始化
                DD      DemoStack1Len             ;1级堆栈指针
                DD      DemoStack1_Sel            ;初始化
                DD      0                         ;2级堆栈指针
                DD      0                         ;未初始化
                DD      0                         ;CR3
                DD      0                         ;EIP
                DD      0                         ;EFLAGS
                DD      0                         ;EAX
                DD      0                         ;ECX
                DD      0                         ;EDX
                DD      0                         ;EBX
                DD      0                         ;ESP
                DD      0                         ;EBP
                DD      0                         ;ESI
                DD      0                         ;EDI
                DD      0                         ;ES
                DD      0                         ;CS
                DD      0                         ;SS
                DD      0                         ;DS
                DD      0                         ;FS
                DD      0                         ;GS
                DD      DemoLDT_Sel               ;LDT
                DW      0                         ;调试陷阱标志
                DW      $+2                       ;指向I/O许可位图
                DW      0ffffh                    ;I/O许可位图结束标志
;----------------------------------------------------------------------------
DemoTSSLen      =       $
;----------------------------------------------------------------------------
DemoTSSSeg      ENDS                              ;任务状态段TSS结束
;----------------------------------------------------------------------------
DemoStack0Seg   SEGMENT DWORD STACK USE32         ;0级堆栈段(32位段)
DemoStack0Len   =       512
                DB      DemoStack0Len DUP(?)
DemoStack0Seg   ENDS                              ;0级堆栈段结束
;----------------------------------------------------------------------------
DemoStack1Seg   SEGMENT DWORD STACK USE32         ;1级堆栈段(32位段)
DemoStack1Len   =       512
                DB      DemoStack1Len DUP(?)
DemoStack1Seg   ENDS                              ;1级堆栈段结束
;----------------------------------------------------------------------------
DemoStack3Seg   SEGMENT DWORD STACK USE16         ;3级堆栈段(16位段)
DemoStack3Len   =       512
                DB      DemoStack3Len DUP(?)
DemoStack3Seg   ENDS                              ;3级堆栈段结束
;----------------------------------------------------------------------------
EchoSubRSeg     SEGMENT PARA USE32                ;显示子程序代码段(32位,1级)
                ASSUME  CS:EchoSubRSeg
;----------------------------------------------------------------------------
Message         DB      'CPL=',0                  ;显示信息(该代码段可读)
;----------------------------------------------------------------------------
EchoSub         PROC    FAR
                cld
                push    ebp
                mov     ebp,esp
                mov     ax,Echo_Sel1              ;该代码段是可读段
                mov     ds,ax                     ;采用RPL=1的选择子
                mov     ax,Video_Sel
                mov     es,ax
                mov     edi,1996
                mov     esi,OFFSET Message

⌨️ 快捷键说明

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