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