exceptn.asm

来自「开放源码的编译器open watcom 1.6.0版的源代码」· 汇编 代码 · 共 2,536 行 · 第 1/5 页

ASM
2,536
字号
        .386

_Excep  segment para public 'code' use16
        assume cs:_Excep, ds:_Excep, es:nothing
ExcepStart      label byte


;-------------------------------------------------------------------------
ExcepOpen       proc    near
        assume es:_cwMain
        mov     ExcepDSeg,es            ;Store cwCode selector.
        mov     ExcepDDSeg,ds
        mov     eax,es:SystemFlags
        mov     ExcepSystemFlags,eax
        assume es:nothing
        ;
        mov     bl,0
        mov     ecx,1
        mov     edi,offset OldExc00
        mov     esi,offset DPMIExc00Patch
@@2:    pushm   ebx,ecx,esi,edi
        call    @@1
        popm    ebx,ecx,esi,edi
        add     esi,DPMIExc01Patch-DPMIExc00Patch
        add     edi,6
        inc     bl
        dec     ecx
        jnz     @@2
        ;
        mov     bl,4
        mov     ecx,6
        mov     edi,offset OldExc04
        mov     esi,offset DPMIExc04Patch
@@3:    pushm   ebx,ecx,esi,edi
        call    @@1
        popm    ebx,ecx,esi,edi
        add     esi,DPMIExc01Patch-DPMIExc00Patch
        add     edi,6
        inc     bl
        dec     ecx
        jnz     @@3
        ;
        mov     bl,13
        mov     ecx,3
        mov     edi,offset OldExc13
        mov     esi,offset DPMIExc13Patch
@@0:    pushm   ebx,ecx,esi,edi
        call    @@1
        popm    ebx,ecx,esi,edi
        add     esi,DPMIExc01Patch-DPMIExc00Patch
        add     edi,6
        inc     bl
        dec     ecx
        jnz     @@0
        ;
        mov     bl,0
        sys     GetVect
        test    ExcepSystemFlags,1
        jz      @@i00Use32
        mov     w[OldInt00],dx
        mov     w[OldInt00+2],cx
        jmp     @@i00Done3216
@@i00Use32:     mov     d[OldInt00],edx
        mov     w[OldInt00+4],cx
@@i00Done3216:  mov     edx,offset Int00Handler
        mov     cx,cs
        mov     bl,00
        sys     SetVect
        ;
        clc
        retf
        ;
@@1:    pushm   ebx,esi,edi
        mov     ax,0202h
        int     31h
        popm    ebx,esi,edi
        test    ExcepSystemFlags,1
        jz      @@Use32
        mov     w[edi],dx
        mov     w[edi+2],cx
        mov     w[edi+4],cx
        jmp     @@Use0
@@Use32:        mov     d[edi],edx
        mov     w[edi+4],cx
@@Use0: mov     edx,esi
        mov     cx,cs
        mov     ax,0203h
        int     31h
        ret
ExcepOpen       endp


;-------------------------------------------------------------------------
ExcepClose      proc    near
        push    ds
        assume ds:nothing
        mov     ds,cs:ExcepDDSeg
        assume ds:_Excep
        ;
        mov     bl,0
        mov     ecx,1
        mov     edi,offset OldExc00
@@2:    pushm   ebx,ecx,edi
        call    @@1
        popm    ebx,ecx,edi
        add     edi,6
        inc     bl
        dec     ecx
        jnz     @@2
        ;
        mov     bl,4
        mov     ecx,6
        mov     edi,offset OldExc04
@@3:    pushm   ebx,ecx,edi
        call    @@1
        popm    ebx,ecx,edi
        add     edi,6
        inc     bl
        dec     ecx
        jnz     @@3
        ;
        mov     bl,13
        mov     ecx,3
        mov     edi,offset OldExc13
@@0:    pushm   ebx,ecx,edi
        call    @@1
        popm    ebx,ecx,edi
        add     edi,6
        inc     bl
        dec     ecx
        jnz     @@0
        ;
        cmp     d[OldInt00],0
        jz      @@i2
        test    ExcepSystemFlags,1
        jz      @@i00Use32
        mov     dx,w[OldInt00]
        mov     cx,w[OldInt00+2]
        jmp     @@i00Done3216
@@i00Use32:     mov     edx,d[OldInt00]
        mov     cx,w[OldInt00+4]
@@i00Done3216:  mov     bl,00h
        sys     SetVect
        ;
@@i2:   pop     ds
        clc
        retf
        ;
@@1:    test    ExcepSystemFlags,1
        jz      @@Use32
        movzx   edx,w[edi]
        mov     cx,w[edi+2]
        jmp     @@Use0
@@Use32:        mov     edx,d[edi]
        mov     cx,w[edi+4]
@@Use0: mov     ax,0203h
        int     31h
        ret
        ;
OldExc00        df 0
OldExc01        df 0
OldExc02        df 0
OldExc03        df 0
OldExc04        df 0
OldExc05        df 0
OldExc06        df 0
OldExc07        df 0
OldExc08        df 0
OldExc09        df 0
OldExc10        df 0
OldExc11        df 0
OldExc12        df 0
OldExc13        df 0
OldExc14        df 0
OldExc15        df 0
ExcepClose      endp


;-------------------------------------------------------------------------
;
;Handle a divide by zero.
;
Int00Handler    proc    near
        push    ds
        assume ds:nothing
        mov     ds,cs:ExcepDDSeg
        assume ds:_Excep
        mov     DebugEAX,eax
        mov     DebugEBX,ebx
        mov     DebugECX,ecx
        mov     DebugEDX,edx
        mov     DebugESI,esi
        mov     DebugEDI,edi
        mov     DebugEBP,ebp
        pop     ax
        mov     DebugESP,esp
        mov     DebugDS,ax
        mov     DebugES,es
        mov     DebugFS,fs
        mov     DebugGS,gs
        ;
        test    ExcepSystemFlags,1
        jz      @@Use32_0
        add     DebugESP,2+2+2
        movzx   ebx,sp
        mov     ax,ss:[ebx+2+2]
        mov     w[DebugEFL],ax
        mov     ax,ss:[ebx+2]
        mov     DebugCS,ax
        movzx   eax,ss:w[ebx]
        mov     DebugEIP,eax
        jmp     @@Use0_0
        ;
@@Use32_0:      add     DebugESP,4+4+4
        mov     eax,[esp+4+4]
        mov     DebugEFL,eax
        mov     eax,[esp+4]
        mov     DebugCS,ax
        mov     eax,[esp]
        mov     DebugEIP,eax
        ;
@@Use0_0:       mov     DebugExceptionIndex,0
        mov     DebugExceptionCode,0
        ;
        mov     ds,ExcepDSeg
        assume ds:_cwMain
        mov     DebugDump,1
        pushm   ds,ds,ds
        popm    es,fs,gs
        sti
        jmp     f[TerminationHandler]
        assume ds:_Excep
OldInt00        df 0
Int00Handler    endp


;-------------------------------------------------------------------------
DPMIExc00Patch proc     far
        pushm   ds
        assume ds:nothing
        mov     ds,cs:ExcepDDSeg
        assume ds:_Excep
        mov     DebugExceptionIndex,0
        popm    ds
        db 0e9h
        dw offset DPMIExcPatch-($+2)
DPMIExc00Patch endp


;-------------------------------------------------------------------------
DPMIExc01Patch proc     far
        pushm   ds
        assume ds:nothing
        mov     ds,cs:ExcepDDSeg
        assume ds:_Excep
        mov     DebugExceptionIndex,1
        popm    ds
        db 0e9h
        dw offset DPMIExcPatch-($+2)
DPMIExc01Patch endp


;-------------------------------------------------------------------------
DPMIExc02Patch proc     far
        pushm   ds
        assume ds:nothing
        mov     ds,cs:ExcepDDSeg
        assume ds:_Excep
        mov     DebugExceptionIndex,2
        popm    ds
        db 0e9h
        dw offset DPMIExcPatch-($+2)
DPMIExc02Patch endp


;-------------------------------------------------------------------------
DPMIExc03Patch proc     far
        pushm   ds
        assume ds:nothing
        mov     ds,cs:ExcepDDSeg
        assume ds:_Excep
        mov     DebugExceptionIndex,3
        popm    ds
        db 0e9h
        dw offset DPMIExcPatch-($+2)
DPMIExc03Patch endp


;-------------------------------------------------------------------------
DPMIExc04Patch proc     far
        pushm   ds
        assume ds:nothing
        mov     ds,cs:ExcepDDSeg
        assume ds:_Excep
        mov     DebugExceptionIndex,4
        popm    ds
        db 0e9h
        dw offset DPMIExcPatch-($+2)
DPMIExc04Patch endp


;-------------------------------------------------------------------------
DPMIExc05Patch proc     far
        pushm   ds
        assume ds:nothing
        mov     ds,cs:ExcepDDSeg
        assume ds:_Excep
        mov     DebugExceptionIndex,5
        popm    ds
        db 0e9h
        dw offset DPMIExcPatch-($+2)
DPMIExc05Patch endp


;-------------------------------------------------------------------------
DPMIExc06Patch proc     far
        pushm   ds
        assume ds:nothing
        mov     ds,cs:ExcepDDSeg
        assume ds:_Excep
        mov     DebugExceptionIndex,6
        popm    ds
        db 0e9h
        dw offset DPMIExcPatch-($+2)
DPMIExc06Patch endp


;-------------------------------------------------------------------------
DPMIExc07Patch proc     far
        pushm   ds
        assume ds:nothing
        mov     ds,cs:ExcepDDSeg
        assume ds:_Excep
        mov     DebugExceptionIndex,7
        popm    ds
        db 0e9h
        dw offset DPMIExcPatch-($+2)
DPMIExc07Patch endp


;-------------------------------------------------------------------------
DPMIExc08Patch proc     far
        pushm   ds
        assume ds:nothing
        mov     ds,cs:ExcepDDSeg
        assume ds:_Excep
        mov     DebugExceptionIndex,8
        popm    ds
        db 0e9h
        dw offset DPMIExcPatch-($+2)
DPMIExc08Patch endp


;-------------------------------------------------------------------------
DPMIExc09Patch proc     far
        pushm   ds
        assume ds:nothing
        mov     ds,cs:ExcepDDSeg
        assume ds:_Excep
        mov     DebugExceptionIndex,9
        popm    ds
        db 0e9h
        dw offset DPMIExcPatch-($+2)
DPMIExc09Patch endp


;-------------------------------------------------------------------------
DPMIExc10Patch proc     far
        pushm   ds
        assume ds:nothing
        mov     ds,cs:ExcepDDSeg
        assume ds:_Excep
        mov     DebugExceptionIndex,10
        popm    ds
        db 0e9h
        dw offset DPMIExcPatch-($+2)
DPMIExc10Patch endp


;-------------------------------------------------------------------------
DPMIExc11Patch proc     far
        pushm   ds
        assume ds:nothing
        mov     ds,cs:ExcepDDSeg
        assume ds:_Excep
        mov     DebugExceptionIndex,11
        popm    ds
        db 0e9h
        dw offset DPMIExcPatch-($+2)
DPMIExc11Patch endp


;-------------------------------------------------------------------------
DPMIExc12Patch proc     far
        pushm   ds
        assume ds:nothing
        mov     ds,cs:ExcepDDSeg
        assume ds:_Excep
        mov     DebugExceptionIndex,12
        popm    ds
        db 0e9h
        dw offset DPMIExcPatch-($+2)
DPMIExc12Patch endp


;-------------------------------------------------------------------------
DPMIExc13Patch proc     far
        pushm   ds
        assume ds:nothing
        mov     ds,cs:ExcepDDSeg
        assume ds:_Excep
        mov     DebugExceptionIndex,13
        popm    ds
        db 0e9h
        dw offset DPMIExcPatch-($+2)
DPMIExc13Patch endp


;-------------------------------------------------------------------------
DPMIExc14Patch proc     far
        push    ds
        assume ds:nothing
        mov     ds,cs:ExcepDDSeg
        assume ds:_Excep
        mov     DebugExceptionIndex,14
        pop     ds
        db 0e9h
        dw offset DPMIExcPatch-($+2)
DPMIExc14Patch endp


;-------------------------------------------------------------------------
DPMIExc15Patch proc     far
        pushm   ds
        assume ds:nothing
        mov     ds,cs:ExcepDDSeg
        assume ds:_Excep
        mov     DebugExceptionIndex,15
        popm    ds
        db 0e9h
        dw offset DPMIExcPatch-($+2)
DPMIExc15Patch endp



;-------------------------------------------------------------------------
DPMIExcPatch    proc    far
        pushm   ds,es,fs,gs
        pushm   eax,ebx,ecx,edx,esi,edi,ebp             ;save general registers.
        assume ds:nothing
        mov     ds,cs:ExcepDDSeg
        assume ds:_Excep
        ;
        cmp     DebugExceptionIndex,14
        jnz     @@Not14Special
        push    ds
        mov     ds,ExcepDSeg
        assume ds:_cwMain
        cmp     LinearAddressCheck,0
        assume ds:_Excep
        pop     ds
        jz      @@Not14Special
        push    ds
        mov     ds,ExcepDSeg
        assume ds:_cwMain
        mov     LinearAddressCheck,0
        test    cs:ExcepSystemFlags,1
        assume ds:_Excep
        pop     ds
        popm    eax,ebx,ecx,edx,esi,edi,ebp             ;save general registers.
        popm    ds,es,fs,gs
        mov     esi,0
        jz      @@S14_32
        retf
@@S14_32:       ;
        db 66h
        retf
        ;
@@Not14Special: ;Retrieve register values and get outa here.
        ;
        cmp     InExcep,0
        jz      @@ok
        movzx   esi,DebugExceptionIndex
        add     esi,esi
        mov     eax,esi
        add     esi,esi
        add     esi,eax
        add     esi,offset OldExc00
        mov     eax,[esi]
        mov     d[InExcepJMP],eax
        mov     ax,[esi+4]
        mov     w[InExcepJMP+4],ax
        popm    eax,ebx,ecx,edx,esi,edi,ebp             ;save general registers.
        popm    ds,es,fs,gs
        assume ds:nothing
        jmp     cs:f[InExcepJMP]
        assume ds:_Excep
        ;
@@ok:   or      InExcep,-1
        push    ds
        pop     es
        assume es:_Excep
        mov     ax,ss
        mov     ds,ax
        assume ds:nothing
        mov     esi,esp
        test    es:ExcepSystemFlags,1
        jz      @@SP320

⌨️ 快捷键说明

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