exceptn.asm

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

ASM
2,472
字号
        .386P

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

;-------------------------------------------------------------------------
ExcepDSeg       dw ?
ExcepDDSeg      dw ?
ExcepSystemFlags dd ?
;
DebugBuffer     label byte
DebugEBP        dd ?
DebugEDI        dd ?
DebugESI        dd ?
DebugEDX        dd ?
DebugECX        dd ?
DebugEBX        dd ?
DebugEAX        dd ?
DebugGS dw ?
DebugFS dw ?
DebugES dw ?
DebugDS dw ?
DebugEIP        dd ?
DebugCS dw ?,?
DebugEFL        dd ?
DebugESP        dd ?
DebugSS dw ?,?
DebugTR dw ?
DebugCR0        dd ?
DebugCR1        dd ?
DebugCR2        dd ?
DebugCR3        dd ?
;
DebugCSApp      dd ?
DebugDSApp      dd ?
DebugESApp      dd ?
DebugFSApp      dd ?
DebugGSApp      dd ?
DebugSSApp      dd ?
;
DebugExceptionIndex dw 0
DebugExceptionCode dd 0
;
DebugName       db 'cw.err',0
;
ResHeader       db 13,10
        db '   Application resource tracking details   ',13,10
        db '===========================================',13,10,'$'
ResHeaderLen    equ     ($-1)-ResHeader
;
SelHeader       db 13,10,13,10
        db 'Selectors',13,10
        db '=========',13,10,13,10
        db ' sel   base     limit  type D mem count',13,10
        db '----------------------------------------',13,10,'$'
SelHeaderLen    equ ($-1)-SelHeader
;
TotalSelsText   db 13,10,"Total selectors: "
TotalSelsNum    db "0000",13,10
TotalSelsTLen   equ     $-TotalSelsText
;
MemHeader       db 13,10,13,10
        db 'Linear memory blocks',13,10
        db '====================',13,10,13,10
        db ' handle    base    length ',13,10
        db '--------------------------',13,10,'$'
MemHeaderLen    equ ($-1)-MemHeader
;
TotalMemText    db 13,10,"Total Linear memory: "
TotalMemNum1    db "00000000 ("
TotalMemNum2    db "00000000) in "
TotalMemNum3    db "00000000 blocks",13,10
TotalMemTLen    equ     $-TotalMemText
;
MouseEHeader    db 13,10,13,10
        db "Mouse event target: ","$"
MouseEHeaderLen equ ($-1)-MouseEHeader
DosMemHeader    db 13,10,13,10
        db "DOS memory blocks",13,10
        db "=================",13,10,13,10
        db " sel   base    length ",13,10
        db "----------------------",13,10,"$"
DosMemHeaderLen equ ($-1)-DosMemHeader
CallBackHeader  db 13,10,13,10
        db "Call-Backs",13,10
        db "==========",13,10,13,10
        db "  real        target",13,10
        db "-----------------------",13,10,"$"
CallBackHeaderLen equ ($-1)-CallBackHeader
LockHeader      db 13,10,13,10
        db 'Linear memory locked',13,10
        db '====================',13,10,13,10
        db '  base    length ',13,10
        db '-----------------',13,10,'$'
LockHeaderLen   equ ($-1)-LockHeader
;
PIntHeader      db 13,10,13,10
        db 'Protected mode interrupt vectors',13,10
        db '================================',13,10,13,10
        db 'No sel   offset ',13,10
        db '----------------',13,10,'$'
PIntHeaderLen   equ ($-1)-PIntHeader
;
EIntHeader      db 13,10,13,10
        db 'Protected mode exception vectors',13,10
        db '================================',13,10,13,10
        db 'No sel   offset ',13,10
        db '----------------',13,10,'$'
EIntHeaderLen   equ ($-1)-EIntHeader
;
RIntHeader      db 13,10,13,10
        db 'Real mode interrupt vectors',13,10
        db '===========================',13,10,13,10
        db 'No seg offset',13,10
        db '-------------',13,10,'$'
RIntHeaderLen   equ ($-1)-RIntHeader
;
TotalLinearMem  dd 0,0,0
TotalSelectors  dd 0
;
DebugHeader     db 13,10,'Exception: '
DebugINum       db '00, Error code: '
DebugENum       db '0000',13,10,13,10
        db 'EAX='
DebugEAXt       db '00000000 '
        db 'EBX='
DebugEBXt       db '00000000 '
        db 'ECX='
DebugECXt       db '00000000 '
        db 'EDX='
DebugEDXt       db '00000000 '
        db 'ESI='
DebugESIt       db '00000000 '
        db 13,10
        db 'EDI='
DebugEDIt       db '00000000 '
        db 'EBP='
DebugEBPt       db '00000000 '
        db 'ESP='
DebugESPt       db '00000000 '
        db 'EIP='
DebugEIPt       db '00000000 '
        db 'EFL='
DebugEFLt       db '00000000 '
        db 13,10,13,10
        db 'CS='
DebugCSt        db '0000-'
DebugCSAppt     db '00000000 '
        db 'DS='
DebugDSt        db '0000-'
DebugDSAppt     db '00000000 '
        db 'ES='
DebugESt        db '0000-'
DebugESAppt     db '00000000 '
        db 13,10
        db 'FS='
DebugFSt        db '0000-'
DebugFSAppt     db '00000000 '
        db 'GS='
DebugGSt        db '0000-'
DebugGSAppt     db '00000000 '
        db 'SS='
DebugSSt        db '0000-'
DebugSSAppt     db '00000000 '
        db 13,10,13,10
        db 'CR0='
DebugCR0t       db '00000000 '
        db 'CR2='
DebugCR2t       db '00000000 '
        db 'CR3='
DebugCR3t       db '00000000 '
        db 'TR='
DebugTRt        db '0000'
        db 13,10,13,10
        db 'Info flags='
DebugSysFlags   db '00000000 '
        db 13,10,13,10,'$'
        db      768 DUP (0)
DebugHeaderEnd  label byte
;
HexTable        db '0123456789ABCDEF'
;
InExcep db 0
InExcepJMP      df 0
;
WritingCWERR    db "Writing CW.ERR file....",13,10,13,10,36
;

CSEIPDebugText  DB      "CS:EIP > ",0
SSESPDebugText  DB      "SS:ESP > ",0
SSEBPDebugText  DB      "SS:EBP > ",0
UserDebugText   DB      "User   > ",0
LoadAddrDebugText       DB      "Program Linear Load Address: ",0
DumpAsciiFlag   DB      ?


;-------------------------------------------------------------------------
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
exc1_2:
        push    ebx
        push    ecx
        push    esi
        push    edi
        call    exc1_1
        pop     edi
        pop     esi
        pop     ecx
        pop     ebx
        add     esi,DPMIExc01Patch-DPMIExc00Patch
        add     edi,6
        inc     bl
        dec     ecx
        jnz     exc1_2
        ;
        mov     bl,4
        mov     ecx,6
        mov     edi,offset OldExc04
        mov     esi,offset DPMIExc04Patch
exc1_3:
        push    ebx
        push    ecx
        push    esi
        push    edi
        call    exc1_1
        pop     edi
        pop     esi
        pop     ecx
        pop     ebx
        add     esi,DPMIExc01Patch-DPMIExc00Patch
        add     edi,6
        inc     bl
        dec     ecx
        jnz     exc1_3
        ;
        mov     bl,13
        mov     ecx,3
        mov     edi,offset OldExc13
        mov     esi,offset DPMIExc13Patch
exc1_0:
        push    ebx
        push    ecx
        push    esi
        push    edi
        call    exc1_1
        pop     edi
        pop     esi
        pop     ecx
        pop     ebx
        add     esi,DPMIExc01Patch-DPMIExc00Patch
        add     edi,6
        inc     bl
        dec     ecx
        jnz     exc1_0
        ;
        mov     bl,0
        sys     GetVect
        test    BYTE PTR ExcepSystemFlags,1
        jz      exc1_i00Use32
        mov     w[OldInt00],dx
        mov     w[OldInt00+2],cx
        jmp     exc1_i00Done3216
exc1_i00Use32:  mov     d[OldInt00],edx
        mov     w[OldInt00+4],cx
exc1_i00Done3216:       mov     edx,offset Int00Handler
        mov     cx,cs
        mov     bl,00
        sys     SetVect
        ;
        clc
        retf
        ;
exc1_1:
        push    ebx
        push    esi
        push    edi
        mov     ax,0202h
        int     31h
        pop     edi
        pop     esi
        pop     ebx
        test    BYTE PTR ExcepSystemFlags,1
        jz      exc1_Use32
        mov     w[edi],dx
        mov     w[edi+2],cx
        mov     w[edi+4],cx
        jmp     exc1_Use0
exc1_Use32:     mov     d[edi],edx
        mov     w[edi+4],cx
exc1_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
exc2_2:
        push    ebx
        push    ecx
        push    edi
        call    exc2_1
        pop     edi
        pop     ecx
        pop     ebx
        add     edi,6
        inc     bl
        dec     ecx
        jnz     exc2_2
        ;
        mov     bl,4
        mov     ecx,6
        mov     edi,offset OldExc04
exc2_3:
        push    ebx
        push    ecx
        push    edi
        call    exc2_1
        pop     edi
        pop     ecx
        pop     ebx
        add     edi,6
        inc     bl
        dec     ecx
        jnz     exc2_3
        ;
        mov     bl,13
        mov     ecx,3
        mov     edi,offset OldExc13
exc2_0:
        push    ebx
        push    ecx
        push    edi
        call    exc2_1
        pop     edi
        pop     ecx
        pop     ebx
        add     edi,6
        inc     bl
        dec     ecx
        jnz     exc2_0
        ;
        cmp     d[OldInt00],0
        jz      exc2_i2
        test    BYTE PTR ExcepSystemFlags,1
        jz      exc2_i00Use32
        mov     dx,w[OldInt00]
        mov     cx,w[OldInt00+2]
        jmp     exc2_i00Done3216
exc2_i00Use32:  mov     edx,d[OldInt00]
        mov     cx,w[OldInt00+4]
exc2_i00Done3216:       mov     bl,00h
        sys     SetVect
        ;
exc2_i2:        pop     ds
        clc
        retf
        ;
exc2_1: test    BYTE PTR ExcepSystemFlags,1
        jz      exc2_Use32
        movzx   edx,w[edi]
        mov     cx,w[edi+2]
        jmp     exc2_Use0
exc2_Use32:     mov     edx,d[edi]
        mov     cx,w[edi+4]
exc2_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    BYTE PTR ExcepSystemFlags,1
        jz      exc3_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,WORD PTR ss:[ebx]
        mov     DebugEIP,eax
        jmp     exc3_Use0_0
        ;
exc3_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
        ;
exc3_Use0_0:    mov     DebugExceptionIndex,0
        mov     DebugExceptionCode,0
        ;
        mov     ds,ExcepDSeg
        assume ds:_cwMain
        mov     DebugDump,1
        push    ds
        push    ds
        push    ds
        pop     gs
        pop     fs
        pop     es
        sti
        jmp     f[TerminationHandler]
        assume ds:_Excep
OldInt00        df 0
Int00Handler    endp


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


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

⌨️ 快捷键说明

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