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

📄 asm9.asm

📁 保护模式教程源码 The source code of protection mode in dos
💻 ASM
📖 第 1 页 / 共 2 页
字号:
;名称:ASM9.ASM
;功能:演示I/O保护及I/O敏感指令的作用
;编译:TASM ASM9.ASM
;连接:TLINK /32 ASM9.OBJ
;----------------------------------------------------------------------------
INCLUDE         386SCD.INC
;----------------------------------------------------------------------------
GDTSeg          SEGMENT PARA USE16                ;全局描述符表段(16位)
GDT             LABEL   BYTE
                ;空描述符
DUMMY           Desc    <>
                ;规范段描述符及选择子
Normal          Desc    <0ffffh,,,ATDW,,>
Normal_Sel      =       Normal-GDT
                ;视频缓冲区段描述符(DPL=3)及选择子(任何特权级可写)
VideoBuf        Desc    <07fffh,8000h,0bh,ATDW,,>
VideoBuf_Sel    =       VideoBuf-GDT
;----------------------------------------------------------------------------
EFFGDT          LABEL   BYTE
                ;演示任务TSS段描述符及选择子
DemoTSS         Desc    <DemoTSSLen-1,DemoTSSSeg,,AT386TSS,,>
DemoTSS_Sel     =       DemoTSS-GDT
                ;演示任务堆栈段描述符及选择子
DemoStack       Desc    <DemoStackLen-1,DemoStackSeg,,ATDW,D32,>
DemoStack_Sel   =       DemoStack-GDT
                ;演示代码段描述符及选择子
DemoCode        Desc    <DemoCodeLen-1,DemoCodeSeg,,ATCE,D32,>
DemoCode_Sel    =       DemoCode-GDT
                ;属于演示任务的临时代码段描述符及选择子
TempCode        Desc    <0ffffh,TempCodeSeg,,ATCE,,>
TempCode_Sel    =       TempCode-GDT
                ;指向GDT的存储段描述符及选择子
ToGDT           Desc    <GDTLen-1,GDTSeg,,ATDW,,>
ToGDT_Sel       =       ToGDT-GDT
                ;指向通用保护故障处理任务TSS的存储段描述符及选择子
ToGPTSS         Desc    <GPTSSLen-1,GPTSSSeg,,ATDW,,>
ToGPTSS_Sel     =       ToGPTSS-GDT
                ;指向测试任务TSS的存储段描述符及选择子
ToTestTSS       Desc    <TestTSSLen-1,TestTSSSeg,,ATDW,,>
ToTestTSS_Sel   =       ToTestTSS-GDT
                ;测试任务TSS段描述符及选择子
TestTSS         Desc    <TestTSSLen-1,TestTSSSeg,,AT386TSS,,>
TestTSS_Sel     =       TestTSS-GDT
                ;测试任务1堆栈段描述符(DPL=1)及选择子
Test1Stack      Desc    <TestStackLen-1,TestStackSeg,,ATDW+DPL1,D32,>
Test1Stack_Sel  =       Test1Stack-GDT+RPL1
                ;测试任务1代码段描述符(DPL=1)及选择子
Test1Code       Desc    <TestCodeLen-1,TestCodeSeg,,ATCE+DPL1,D32,>
Test1Code_Sel   =       Test1Code-GDT+RPL1
                ;测试任务2堆栈段描述符(DPL=2)及选择子
Test2Stack      Desc    <TestStackLen-1,TestStackSeg,,ATDW+DPL2,D32,>
Test2Stack_Sel  =       Test2Stack-GDT+RPL2
                ;测试任务2代码段描述符(DPL=2)及选择子
Test2Code       Desc    <TestCodeLen-1,TestCodeSeg,,ATCE+DPL2,D32,>
Test2Code_Sel   =       Test2Code-GDT+RPL2
                ;测试任务3堆栈段描述符(DPL=3)及选择子
Test3Stack      Desc    <TestStackLen-1,TestStackSeg,,ATDW+DPL3,D32,>
Test3Stack_Sel  =       Test3Stack-GDT+RPL3
                ;测试任务3代码段描述符(DPL=3)及选择子
Test3Code       Desc    <TestCodeLen-1,TestCodeSeg,,ATCE+DPL3,D32,>
Test3Code_Sel   =       Test3Code-GDT+RPL3
                ;通用保护故障处理任务的TSS段描述符及选择子
GPTSS           Desc    <GPTSSLen-1,GPTSSSeg,,AT386TSS,,>
GPTSS_Sel       =       GPTSS-GDT
                ;通用保护故障处理任务的堆栈段描述符及选择子
GPStack         Desc    <GPStackLen-1,GPStackSeg,,ATDW,D32,>
GPStack_Sel     =       GPStack-GDT
                ;通用保护故障处理任务的代码段描述符及选择子
GPCode          Desc    <GPCodeLen-1,GPCodeSeg,,ATCE,D32,>
GPCode_Sel      =       GPCode-GDT
                ;其它中断或异常处理程序代码段(一致可读)描述符及选择子
ErrCode         Desc    <ErrCodeLen-1,ErrCodeSeg,,ATCCOR,D32,>
ErrCode_Sel     =       ErrCode-GDT
;----------------------------------------------------------------------------
GDNum           =       ($-EFFGDT)/(SIZE Desc)    ;需处理基地址的描述符个数
;----------------------------------------------------------------------------
                ;指向测试任务的任务门
TestTask        Gate    <,TestTSS_Sel,,ATTaskGate,>
Test_Sel        =       TestTask-GDT
;----------------------------------------------------------------------------
GDTLen          =       $-GDT                     ;全局描述符表长度
GDTSeg          ENDS                              ;全局描述符表段定义结束
;----------------------------------------------------------------------------
IDTSeg          SEGMENT PARA USE16                ;中断描述符表段(16位)
IDT             LABEL   BYTE                      ;中断描述符表
                REPT    13
                Gate    <ErrBegin,ErrCode_Sel,,AT386TGate,>
                ENDM
                Gate    <,GPTSS_Sel,,ATTaskGate,> ;通用故障处理程序门描述符
                REPT    242
                Gate    <ErrBegin,ErrCode_Sel,,AT386TGate,>
                ENDM
;----------------------------------------------------------------------------
IDTLen          =       $-IDT
;----------------------------------------------------------------------------
IDTSeg          ENDS                              ;中断描述符表段定义结束
;----------------------------------------------------------------------------
;其它中断或异常处理程序的代码段(一致可读)
;----------------------------------------------------------------------------
ErrCodeSeg      SEGMENT PARA USE32
                ASSUME  CS:ErrCodeSeg
;----------------------------------------------------------------------------
ErrMess         DB      'Error!!!'
ErrMessLen      =       $-ErrMess
;----------------------------------------------------------------------------
ErrBegin        PROC    FAR
                cld
                mov     ax,ErrCode_Sel
                mov     ds,ax
                lea     esi,ErrMess
                mov     ax,VideoBuf_Sel
                mov     es,ax
                mov     edi,1992
                mov     ecx,ErrMessLen
                mov     ah,4eh
Err1:           lodsb
                stosw
                loop    Err1
                jmp     $
ErrBegin        ENDP
;----------------------------------------------------------------------------
ErrCodeLen      =       $
ErrCodeSeg      ENDS
;----------------------------------------------------------------------------
GPTSSSeg        SEGMENT PARA USE16                ;通用保护故障处理任务的TSS
GPTaskSS        LABEL   BYTE
                DD      0                         ;任务嵌套时的链接指针
                DD      0                         ;0级堆栈偏移
                DW      0,0                       ;0级堆栈选择子
                DD      0                         ;1级堆栈偏移
                DW      0,0                       ;1级堆栈选择子
                DD      0                         ;2级堆栈偏移
                DW      0,0                       ;2级堆栈选择子
                DD      0                         ;CR3
                DW      GPBegin,0                 ;EIP
                DD      0                         ;EFLAGS
                DD      0                         ;EAX
                DD      0                         ;ECX
                DD      0                         ;EDX
                DD      0                         ;EBX
                DD      GPStackLen                ;ESP
                DD      0                         ;EBP
                DD      0                         ;ESI
                DD      0                         ;EDI
                DW      VideoBuf_Sel,0            ;ES
                DW      GPCode_Sel,0              ;CS
                DW      GPStack_Sel,0             ;SS
                DW      ToTestTSS_Sel,0           ;DS
                DW      ToGPTSS_Sel,0             ;FS
                DW      0,0                       ;GS
                DW      0,0                       ;LDTR
                DW      0                         ;调试陷阱标志
                DW      $+2                       ;指向I/O许可位图的偏移
                DB      0ffh                      ;I/O许可位图结束标志
GPTSSLen        =       $
GPTSSSeg        ENDS
;----------------------------------------------------------------------------
GPStackSeg      SEGMENT PARA USE32                ;通用保护故障处理任务堆栈段
GPStackLen      =       512
                DB      GPStackLen DUP(0)
GPStackSeg      ENDS
;----------------------------------------------------------------------------
;通用保护故障处理程序代码段
;----------------------------------------------------------------------------
GPCodeSeg       SEGMENT PARA USE32
                ASSUME  CS:GPCodeSeg
;----------------------------------------------------------------------------
GPBegin         PROC    FAR
                ;在屏幕左上角显示故障点
                xor     edi,edi
                mov     ebx,OFFSET TestTaskSS
                mov     edx,DWORD PTR [ebx].TRCS
                call    EchoEDX
                mov     ax,(17h SHL 8)+':'
                stosw
                mov     edx,[ebx].TREIP
                call    EchoEDX
                ;演示以便看清故障点
                mov     ecx,1234567h
                loop    $
                ;调整任务链接指针,中止故障任务
                mov     ebx,OFFSET GPTaskSS
                mov     ax,DemoTSS_Sel
                mov     fs:[ebx].TRLink,ax
                add     esp,4
                iretd
                jmp     GPBegin
GPBegin         ENDP
;----------------------------------------------------------------------------
;显示edx内容的子程序
;----------------------------------------------------------------------------
EchoEDX         PROC
                mov     ah,17h
                mov     ecx,8
EchoEDX1:       rol     edx,4
                mov     al,dl
                call    HToASCII
                stosw
                loop    EchoEDX1
                ret
EchoEDX         ENDP
;----------------------------------------------------------------------------
;把4位二进制数转换成对应的ASCII码
;----------------------------------------------------------------------------
HToASCII        PROC
                and     al,0fh
                add     al,90h
                daa
                adc     al,40h
                daa
                ret
HToASCII        ENDP
;----------------------------------------------------------------------------
GPCodeLen       =       $
GPCodeSeg       ENDS
;----------------------------------------------------------------------------
;测试任务的TSS段
TestTSSSeg      SEGMENT PARA USE16
TestTaskSS      TSS     <>                        ;TSS的固定格式部分
IOMap           LABEL   BYTE                      ;I/O许可位图
                DB      8 DUP(0ffh)               ;端口00h--3fh

⌨️ 快捷键说明

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