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