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

📄 asm7.asm

📁 保护模式教程源码 The source code of protection mode in dos
💻 ASM
📖 第 1 页 / 共 3 页
字号:
OtherCodeSeg    SEGMENT PARA USE16
                ASSUME  CS:OtherCodeSeg
;----------------------------------------------------------------------------
OtherBegin      PROC    FAR
                mov     si,OFFSET MessOther
                int     0feh                      ;显示提示信息
                mov     WORD PTR es:[0],ax
                jmp     $                         ;进入无限循环
OtherBegin      ENDP
;----------------------------------------------------------------------------
OtherCodeLen    =       $
OtherCodeSeg    ENDS
;----------------------------------------------------------------------------
;除法出错故障处理程序代码段
;----------------------------------------------------------------------------
DivCodeSeg      SEGMENT PARA USE16
                ASSUME  CS:DivCodeSeg
;----------------------------------------------------------------------------
DivBegin        PROC    FAR
                mov     si,OFFSET Mess0
                mov     di,0
                int     0feh                      ;显示提示信息
                shr     ax,1                      ;处理模拟的除法错误
                iretd                             ;返回
DivBegin        ENDP
;----------------------------------------------------------------------------
DivCodeLen      =       $
DivCodeSeg      ENDS
;----------------------------------------------------------------------------
;溢出陷阱处理程序代码段
;----------------------------------------------------------------------------
OFCodeSeg       SEGMENT PARA USE16
                ASSUME  CS:OFCodeSeg
;----------------------------------------------------------------------------
OFBegin         PROC    FAR
                mov     si,OFFSET Mess4
                mov     di,0
                int     0feh                      ;显示提示信息
                iretd                             ;返回
OFBegin         ENDP
;----------------------------------------------------------------------------
OFCodeLen       =       $
OFCodeSeg       ENDS
;----------------------------------------------------------------------------
;段不存在故障处理程序代码段
;----------------------------------------------------------------------------
SNPCodeSeg      SEGMENT PARA USE16
                ASSUME  CS:SNPCodeSeg
;----------------------------------------------------------------------------
SNPBegin        PROC    FAR
                mov     si,OFFSET MessB
                mov     di,0
                int     0feh                      ;显示提示信息
                pop     eax                       ;弹出出错代码
                CALL16  SubCode_Sel,SubBegin      ;显示出错代码
                pop     eax
                add     eax,2                     ;按模拟的引起段不存在指令
                push    eax                       ;调整返回地址
                iretd
SNPBegin        ENDP
;----------------------------------------------------------------------------
SNPCodeLen      =       $
SNPCodeSeg      ENDS
;----------------------------------------------------------------------------
;堆栈段故障处理程序代码段
;----------------------------------------------------------------------------
SSECodeSeg      SEGMENT PARA USE16
                ASSUME  CS:SSECodeSeg
;----------------------------------------------------------------------------
SSEBegin        PROC    FAR
                mov     si,OFFSET MessC
                mov     di,0
                int     0feh                      ;显示提示信息
                pop     eax                       ;弹出出错代码
                CALL16  SubCode_Sel,SubBegin      ;显示出错代码
                pop     eax
                add     eax,4                     ;按模拟的引起堆栈段错误的
                push    eax                       ;指令调整返回地址
                iretd
SSEBegin        ENDP
;----------------------------------------------------------------------------
SSECodeLen      =       $
SSECodeSeg      ENDS
;----------------------------------------------------------------------------
;通用保护故障处理程序代码段
;----------------------------------------------------------------------------
GPCodeSeg       SEGMENT PARA USE16
                ASSUME  CS:GPCodeSeg
;----------------------------------------------------------------------------
GPBegin         PROC    FAR
                push    ebp
                mov     ebp,esp
                push    eax
                push    esi
                push    edi                       ;保护现场
                mov     si,OFFSET MessD
                mov     di,0
                int     0feh                      ;显示提示信息
                mov     eax,[bp+4]                ;从堆栈中取出出错代码
                CALL16  SubCode_Sel,SubBegin      ;显示出错代码
                pop     edi
                pop     esi
                pop     eax                       ;恢复部分现场
                add     DWORD PTR [ebp+8],2       ;按模拟的故障指令调整返回
                pop     ebp                       ;地址
                add     esp,4                     ;废除堆栈中的出错代码
                iretd
GPBegin         ENDP
;----------------------------------------------------------------------------
;显示出错码过程代码段
;----------------------------------------------------------------------------
SubCodeSeg      SEGMENT PARA USE16
                ASSUME  CS:SubCodeSeG
;----------------------------------------------------------------------------
SubBegin        PROC                              ;AX中含出错代码
                push    ax                        ;保护现场
                push    cx
                push    dx
                push    si
                push    di
                mov     si,OFFSET ErrCode
                mov     dx,ax
                mov     cx,4
SubR1:          rol     dx,4                      ;把16位出错代码转换成4位
                mov     al,dl                     ;十六进制数的ASCII码并保存
                and     al,0fh
                add     al,30h
                cmp     al,'9'
                jbe     SubR2
                add     al,7
SubR2:          mov     [si],al
                inc     si
                loop    SubR1
                mov     si,OFFSET ErrMess
                Mov     di,80*2                   ;从第二行行首开始
                int     0feh                      ;显示出错码
                pop     di                        ;恢复现场
                pop     si
                pop     dx
                pop     cx
                pop     ax
                retf                              ;返回
SubBegin        ENDP
;----------------------------------------------------------------------------
SubCodeLen      =       $
SubCodeSeg      ENDS
;----------------------------------------------------------------------------
GPCodeLen       =       $
GPCodeSeg       ENDS
;----------------------------------------------------------------------------
;实现显示的陷阱处理程序代码段
;入口参数--DS:SI指向显示信息串,ES:DI指向显示缓冲区
;----------------------------------------------------------------------------
EchoCodeSeg     SEGMENT PARA USE16
                ASSUME  CS:EchoCodeSeg
;----------------------------------------------------------------------------
EchoBegin       PROC    FAR
                pushad                            ;保护现场
                cld
                mov     ah,7
                mov     al,20h
                mov     cx,80
                push    di
                rep     stosw                     ;清所在显示行
                pop     di
Echo1:          lodsb
                or      al,al
                jz      Echo2
                stosw                             ;显示指定信息串
                jmp     Echo1
Echo2:          popad                             ;恢复现场
                iretd
EchoBegin       ENDP
;----------------------------------------------------------------------------
EchoCodeLen     =       $
EchoCodeSeg     ENDS
;----------------------------------------------------------------------------
;缓冲区数据段
;----------------------------------------------------------------------------
BufferSeg       SEGMENT PARA USE16
KeyASCII        DB      ?
Buffer          DB      128 DUP(?)
BufferLen       =       $
BufferSeg       ENDS
;----------------------------------------------------------------------------
;演示任务局部描述符表段
;----------------------------------------------------------------------------
DemoLDTSeg      SEGMENT PARA USE16
;----------------------------------------------------------------------------
DLDT            LABEL   BYTE
                ;演示任务TSS段作为数据段的描述符及选择子
ToDemoTSS       Desc    <DemoTSSLen-1,DemoTSSSeg,,ATDW,,>
ToDemoTSS_Sel   =       ToDemoTSS-DLDT+TIL
                ;演示任务堆栈段描述符及选择子
DemoStack       Desc    <DemoStackLen-1,DemoStackSeg,,ATDWA,,>
DemoStack_Sel   =       DemoStack-DLDT+TIL
                ;演示任务数据段描述符及选择子
DemoData        Desc    <DemoDataLen-1,DemoDataSeg,,ATDW,,>
DemoData_Sel    =       DemoData-DLDT+TIL
                ;除法出错故障处理程序代码段描述符及选择子
Divide          Desc    <DivCodeLen-1,DivCodeSeg,,ATCE,,>
Divide_Sel      =       Divide-DLDT+TIL
                ;溢出陷阱处理程序代码段描述符及选择子
OverFlow        Desc    <OFCodeLen-1,OFCodeSeg,,ATCE,,>
OF_Sel          =       OverFlow-DLDT+TIL
                ;段不存在故障处理程序代码段描述符及选择子
SNPCode         Desc    <SNPCodeLen-1,SNPCodeSeg,,ATCE,,>
SNP_Sel         =       SNPCode-DLDT+TIL
                ;堆栈段出错故障处理程序代码段描述符及选择子
SSECode         Desc    <SSECodeLen-1,SSECodeSeg,,ATCE,,>
SSE_Sel         =       SSECode-DLDT+TIL
                ;通用保护故障处理程序代码段描述符及选择子
GPCode          Desc    <GPCodeLen-1,GPCodeSeg,,ATCE,,>

⌨️ 快捷键说明

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