exceptn.asm

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

ASM
2,472
字号


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


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


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


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


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


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


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


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


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


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


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


;-------------------------------------------------------------------------
DPMIExc13Patch proc     far
        push    ds
        assume ds:nothing
        mov     ds,cs:ExcepDDSeg
        assume ds:_Excep
        mov     DebugExceptionIndex,13
        pop     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
        push    ds
        assume ds:nothing
        mov     ds,cs:ExcepDDSeg
        assume ds:_Excep
        mov     DebugExceptionIndex,15
        pop     ds
        db 0e9h
        dw offset DPMIExcPatch-($+2)
DPMIExc15Patch endp



;-------------------------------------------------------------------------
DPMIExcPatch    proc    far
        push    ds
        push    es
        push    fs
        push    gs
        push    eax
        push    ebx
        push    ecx
        push    edx
        push    esi
        push    edi
        push    ebp
        assume ds:nothing
        mov     ds,cs:ExcepDDSeg
        assume ds:_Excep
        ;
        cmp     DebugExceptionIndex,14
        jnz     exc20_Not14Special
        push    ds
        mov     ds,ExcepDSeg
        assume ds:_cwMain
        cmp     LinearAddressCheck,0
        assume ds:_Excep
        pop     ds
        jz      exc20_Not14Special
        push    ds
        mov     ds,ExcepDSeg
        assume ds:_cwMain
        mov     LinearAddressCheck,0
        test    BYTE PTR cs:ExcepSystemFlags,1
        assume ds:_Excep
        pop     ds
        pop     ebp
        pop     edi
        pop     esi
        pop     edx
        pop     ecx
        pop     ebx
        pop     eax
        pop     gs
        pop     fs
        pop     es
        pop     ds
        mov     esi,0
        jz      exc20_S14_32
        retf
exc20_S14_32:   ;
        db 66h
        retf
        ;
exc20_Not14Special: ;Retrieve register values and get outa here.
        ;
        cmp     InExcep,0
        jz      exc20_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
        pop     ebp
        pop     edi
        pop     esi
        pop     edx
        pop     ecx
        pop     ebx
        pop     eax
        pop     gs
        pop     fs
        pop     es
        pop     ds
        assume ds:nothing
        jmp     FWORD PTR cs:[InExcepJMP]
        assume ds:_Excep
        ;
exc20_ok:       or      InExcep,-1
        push    ds
        pop     es
        assume es:_Excep
        mov     ax,ss
        mov     ds,ax
        assume ds:nothing
        mov     esi,esp
        test    BYTE PTR es:ExcepSystemFlags,1
        jz      exc20_SP320
        movzx   esi,si
exc20_SP320:    mov     edi,offset DebugBuffer
        mov     ecx,(4+4+4+4+4+4+4)+(2+2+2+2)
        cld
        rep     movs b[edi],[esi]    ;copy registers off the stack.
        ;
        test    BYTE PTR es:ExcepSystemFlags,1
        jz      exc20_Use32Bit17
        movzx   ebp,sp
        movzx   eax,w[ebp+(4+4+4+4+4+4+4)+(2+2+2+2)+(2+2)]
        mov     es:DebugExceptionCode,eax
        add     esi,2+2+2               ;skip return address/flags.
        movs    w[edi],[esi]
        add     edi,2
        movs    w[edi],[esi]
        add     edi,2
        movs    w[edi],[esi]
        add     edi,2
        jmp     exc20_Use16Bit17
        ;
exc20_Use32Bit17:       mov     eax,[esp+(4+4+4+4+4+4+4)+(2+2+2+2)+(4+4)]
        mov     es:DebugExceptionCode,eax
        add     esi,4+4+4               ;skip return address/flags.
        mov     ecx,4+4+4
        cld
        rep     movs b[edi],[esi]       ;get real return address.
exc20_Use16Bit17:       ;
        test    BYTE PTR es:ExcepSystemFlags,1
        jz      exc20_Use32Bit678
        movzx   eax,w[esi]
        mov     es:DebugESP,eax
        mov     ax,[esi+2]
        mov     es:DebugSS,ax
        jmp     exc20_Use16Bit678
        ;
exc20_Use32Bit678:      mov     eax,[esi]
        mov     es:DebugESP,eax
        mov     ax,[esi+4]
        mov     es:DebugSS,ax
exc20_Use16Bit678:      ;
        push    es
        pop     ds
        assume es:nothing
        assume ds:_Excep
        ;
        mov     DebugTR,0
        mov     DebugCR0,0
        mov     DebugCR2,0
        mov     DebugCR3,0
        ;
        ;Process segment registers to produce application relative base
        ;addresses.
        ;
        mov     ax,DebugCS
        mov     edi,offset DebugCSApp
        call    DebugSegmentDPMI
        mov     ax,DebugDS
        mov     edi,offset DebugDSApp
        call    DebugSegmentDPMI
        mov     ax,DebugES
        mov     edi,offset DebugESApp
        call    DebugSegmentDPMI
        mov     ax,DebugFS
        mov     edi,offset DebugFSApp
        call    DebugSegmentDPMI
        mov     ax,DebugGS
        mov     edi,offset DebugGSApp
        call    DebugSegmentDPMI
        mov     ax,DebugSS
        mov     edi,offset DebugSSApp
        call    DebugSegmentDPMI
        ;
        pop     ebp
        pop     edi
        pop     esi
        pop     edx
        pop     ecx
        pop     ebx
        pop     eax
        pop     gs
        pop     fs
        pop     es
        pop     ds
        ;
        push    eax
        push    ebp
        push    ds
        assume ds:nothing
        mov     ds,cs:ExcepDSeg
        assume ds:_cwMain
        mov     DebugDump,1
        mov     ErrorNumber,9
        ;
        mov     ebp,esp         ;make stack addresable.
        ;
        ;Now modify origional CS:EIP,SS:ESP values and return control
        ;to this code via interupt structure to restore stacks.
        ;
        test    BYTE PTR SystemFlags,1
        jz      exc20_Use32_2
        mov     eax,offset exc20_Use0_2
        mov     w[bp+(4+4+2)+(2+2+2)+(0)],ax
        mov     w[bp+(4+4+2)+(2+2+2)+(2)],cs
        pop     ds
        pop     ebp
        pop     eax
        retf
        ;
exc20_Use32_2:  mov     eax,offset exc20_Use0_2
        mov     d[ebp+(4+4+2)+(4+4+4)+(0)],eax
        mov     w[ebp+(4+4+2)+(4+4+4)+(4)],cs
        pop     ds
        pop     ebp
        pop     eax
        db 66h
        retf
        ;
exc20_Use0_2:   assume ds:nothing
        mov     ds,cs:ExcepDSeg
        assume ds:_cwMain
        mov     ss,StackSegment
        mov     esp,offset _cwStackEnd-256
        push    ds
        push    ds
        push    ds
        pop     gs
        pop     fs
        pop     es
        jmp     f[TerminationHandler]
        assume ds:_Excep
DPMIExcPatch    endp


;-------------------------------------------------------------------------
;
;Convert segment value into real & application relative.
;
;On Entry:-
;
;AX     - Selector.
;DS:EDI - Buffer address.
;
DebugSegmentDPMI proc near
        push    ds
        assume ds:nothing
        mov     ds,cs:ExcepDSeg
        assume ds:_cwMain
        push    fs
        mov     fs,PSPSegment
        mov     ebx,-1
        ;
        push    eax
        mov     ax,fs
        movzx   eax,ax
        lsl     eax,eax
        cmp     eax,(size PSP_Struc)+(size EPSP_Struc.EPSP_Struc)
        pop     eax
        jc      exc21_9
        ;
        mov     dx,ax
        cmp     ax,WORD PTR fs:[EPSP_Struc.EPSP_SegBase]        ;inside application selector space?
        jc      exc21_9
        mov     cx,WORD PTR fs:[EPSP_Struc.EPSP_SegSize]
;       shl     cx,3            ;8 bytes per selector.
        add     cx,WORD PTR fs:[EPSP_Struc.EPSP_SegBase]        ;add in base selector.
        cmp     ax,cx
        jnc     exc21_9         ;outside application startup selectors.
        mov     bx,dx
        push    cx
        push    dx
        mov     ax,0006h
        int     31h
        mov     ax,cx
        shl     eax,16
        mov     ax,dx
        pop     dx
        pop     cx
        sub     eax,DWORD PTR fs:[EPSP_Struc.EPSP_MemBase]      ;get offset within application.
        mov     ebx,eax
exc21_9:        pop     fs
        pop     ds
        mov     [edi],ebx               ;store generated value.
        assume ds:_Excep
        ret
DebugSegmentDPMI endp


;-------------------------------------------------------------------------
;
;Do a debug dump. Very rough but it works for now....
;
DebugDisplay    proc    far

IFDEF DEBUG4
        push    eax
        push    ebx
        push    ecx
        push    edx
        push    ds
        push    cs
        pop     ds
        mov     edx,OFFSET debuggtext1
debuggloop2:
        cmp     BYTE PTR ds:[edx],0
        je      debuggb
        mov     ecx,1
        mov     bx,1
        mov     ah,40h
        int     21h
        inc     edx
        jmp     debuggloop2
debuggb:
        mov     edx,OFFSET debuggtext2
        push    cs
        pop     ds
        mov     ecx,2
        mov     bx,1
        mov     ah,40h
        int     21h
        pop     ds

⌨️ 快捷键说明

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