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 + -
显示快捷键?