exceptn.asm
来自「开放源码的编译器open watcom 1.6.0版的源代码」· 汇编 代码 · 共 2,472 行 · 第 1/5 页
ASM
2,472 行
userascii:
mov BYTE PTR ds:[edi],al
inc edi
jmp usershow
userbin:
call Bin2Hex
usershow:
mov b[edi]," "
pop ecx
inc edi
inc esi
inc edx
and dl,0fh
jnz user1
mov WORD PTR ds:[edi],0a0dh
add edi,2
mov eax,20202020h
mov DWORD PTR ds:[edi],eax
mov DWORD PTR ds:[edi+4],eax
add edi,8
mov BYTE PTR ds:[edi],al
inc edi
user1:
dec ecx
jnz user0
mov DWORD PTR ds:[edi],0a0d0a0dh
add edi,4
mov edx,offset DebugHeader
sub edi,edx
mov ecx,edi
mov ah,40h
mov ebx,d[exc22_Handle]
int 21h
userdone:
mov ds,cs:ExcepDDSeg ; restore ds for normal variable access
assume ds:_Excep
ssesp:
;Do a SS:ESP dump.
;
cmp DebugExceptionIndex,0ch ;stack problem?
jz exc22_ssesp3
mov ecx,SSESPDEBUGDUMPCOUNT
mov fs,DebugSS
mov esi,DebugESP
test BYTE PTR ExcepSystemFlags,1
jz exc22_ssesp32
movzx esi,si
exc22_ssesp32:
xor eax,eax
mov ax,fs
lsl eax,eax
cmp eax,-1
jz exc22_flat1
inc eax
exc22_flat1:
mov ebx,esi
add ebx,ecx
cmp ebx,eax
jc exc22_ssesp2
sub ebx,eax
sub ecx,ebx
jz exc22_ssesp3
js exc22_ssesp3
exc22_ssesp2:
;
mov edi,offset DebugHeader
mov edx,OFFSET SSESPDebugText
call DebugTextCopy
xor edx,edx
exc22_ssesp0:
push ecx
mov ecx,2
mov al,fs:[esi]
call Bin2Hex
pop ecx
mov b[edi]," "
inc edi
inc esi
inc edx
test dl,0fh
jnz exc22_ssesp1
mov WORD PTR ds:[edi],0a0dh
add edi,2
mov eax,20202020h
mov DWORD PTR ds:[edi],eax
mov DWORD PTR ds:[edi+4],eax
add edi,8
mov BYTE PTR ds:[edi],al
inc edi
;
exc22_ssesp1:
dec ecx
jnz exc22_ssesp0
mov DWORD PTR ds:[edi],0a0d0a0dh
add edi,4
; mov b[edi],"$"
;
mov edx,offset DebugHeader
sub edi,edx
mov ecx,edi
mov ah,40h
mov ebx,d[exc22_Handle]
int 21h
exc22_ssesp3:
;
;Do a SS:EBP dump.
;
cmp DebugExceptionIndex,0ch ;stack problem?
jz exc22_ssebp3
; do a pre-EBP dump for stack frames
mov ecx,SSEBPDEBUGDUMPCOUNT
mov fs,DebugSS
mov esi,DebugEBP
test esi,esi ; see if any previous bytes
je ebpdump ; no, nothing to display
cmp esi,ecx ; see if stack frame as large as display byte dump
jae med2d ; yes
mov ecx,esi
med2d:
sub esi,ecx
test BYTE PTR ExcepSystemFlags,1
jz medssebp32
movzx esi,si
medssebp32:
xor eax,eax
mov ax,fs
lsl eax,eax
cmp eax,-1
jz medflat2
inc eax
medflat2:
mov ebx,esi
add ebx,ecx
cmp ebx,eax
jc medssebp2
sub ebx,eax
sub ecx,ebx
jz ebpdump
js ebpdump
medssebp2:
;
xor edx,edx
mov edi,offset DebugHeader
mov eax,20202020h
mov DWORD PTR ds:[edi],eax
mov DWORD PTR ds:[edi+4],eax
add edi,8
mov BYTE PTR ds:[edi],al
inc edi
push ecx
and ecx,0fh
je med3d
mov dl,16 ; high bytes known zero
sub dl,cl ; save hex bytes left to display on row
mov cl,dl
medloop:
mov ds:[edi],ax ; 3-byte pads until at proper display position
mov ds:[edi+2],al
add edi,3
dec ecx
jne medloop
med3d:
pop ecx
medssebp0:
push ecx
mov al,fs:[esi]
mov ecx,2
call Bin2Hex
pop ecx
mov b[edi]," "
inc edi
inc esi
inc edx
test dl,0fh
jnz medssebp1
mov WORD PTR ds:[edi],0a0dh
add edi,2
cmp ecx,1
je medssebp1
mov eax,20202020h
mov DWORD PTR ds:[edi],eax
mov DWORD PTR ds:[edi+4],eax
add edi,8
mov BYTE PTR ds:[edi],al
inc edi
;
medssebp1:
dec ecx
jne medssebp0
; mov WORD PTR ds:[edi],0a0dh
; add edi,2
; mov b[edi],"$"
;
mov edx,offset DebugHeader
sub edi,edx
mov ecx,edi
mov ah,40h
mov ebx,d[exc22_Handle]
int 21h
;
ebpdump:
mov ecx,SSEBPDEBUGDUMPCOUNT
mov fs,DebugSS
mov esi,DebugEBP
test BYTE PTR ExcepSystemFlags,1
jz exc22_ssebp32
movzx esi,si
exc22_ssebp32:
xor eax,eax
mov ax,fs
lsl eax,eax
cmp eax,-1
jz exc22_flat2
inc eax
exc22_flat2:
mov ebx,esi
add ebx,ecx
cmp ebx,eax
jc exc22_ssebp2
sub ebx,eax
sub ecx,ebx
jz exc22_ssebp3
js exc22_ssebp3
exc22_ssebp2:
;
mov edi,offset DebugHeader
mov edx,OFFSET SSEBPDebugText
call DebugTextCopy
xor edx,edx
exc22_ssebp0:
push ecx
mov ecx,2
mov al,fs:[esi]
call Bin2Hex
pop ecx
mov b[edi]," "
inc edi
inc esi
inc edx
test dl,0fh
jnz exc22_ssebp1
mov WORD PTR ds:[edi],0a0dh
add edi,2
mov eax,20202020h
mov DWORD PTR ds:[edi],eax
mov DWORD PTR ds:[edi+4],eax
add edi,8
mov BYTE PTR ds:[edi],al
inc edi
;
exc22_ssebp1:
dec ecx
jnz exc22_ssebp0
mov DWORD PTR ds:[edi],0a0d0a0dh
add edi,4
; mov b[edi],"$"
;
mov edx,offset DebugHeader
sub edi,edx
mov ecx,edi
mov ah,40h
mov ebx,d[exc22_Handle]
int 21h
;
exc22_ssebp3:
pop fs
;
;Do resource output stuff.
;
push fs
mov fs,ExcepDSeg
assume fs:_cwMain
mov fs,fs:PSPSegment
assume fs:nothing
push es
pushad
cmp DWORD PTR fs:[EPSP_Struc.EPSP_Resource],0
jz exc22_r8
mov edx,offset ResHeader
mov ah,40h
mov ecx,ResHeaderLen
mov ebx,d[exc22_Handle]
int 21h
mov edx,offset SelHeader
mov ah,40h
mov ecx,SelHeaderLen
mov ebx,d[exc22_Handle]
int 21h
mov es,ExcepDSeg
assume es:_cwMain
mov es,es:RealSegment
assume es:nothing
mov esi,DWORD PTR fs:[EPSP_Struc.EPSP_Resource]
exc22_LookLoop: push esi
mov ebp,ResNum ;get number of entries.
mov edi,esi
add esi,ResHead+ResNum
add edi,ResHead
exc22_r0: cmp BYTE PTR es:[edi],Res_PSP
jz exc22_r1_0
cmp BYTE PTR es:[edi],Res_SEL
jnz exc22_r1
exc22_r1_0: mov ax,WORD PTR fs:[EPSP_Struc.EPSP_DPMIMem]
cmp WORD PTR es:[esi],ax
jz exc22_r1
;
exc22_SEL: pushad
mov edi,offset DebugHeader
mov eax,es:[esi]
mov cx,4
call Bin2Hex
mov b[edi],' '
inc edi
mov ebx,es:[esi]
sys GetSelDet32
push ecx
mov eax,edx
mov cx,8
call Bin2Hex
mov b[edi],' '
inc edi
pop eax
mov cx,8
call Bin2Hex
mov b[edi],' '
inc edi
mov eax,es:[esi]
lar eax,eax
test eax,0000100000000000b
mov ebx,'EDOC'
jnz exc22_dc0
mov ebx,'ATAD'
exc22_dc0: mov [edi],ebx
add edi,4
mov b[edi],' '
inc edi
mov eax,es:[esi]
lar eax,eax
mov bx,"61"
test eax,00400000h
jz exc22_Use32It
mov bx,"23"
exc22_Use32It: mov [edi],bx
add edi,2
mov b[edi],' '
inc edi
inc TotalSelectors
;
;See if there is a memory block that matches this selector.
;
mov ebx,es:[esi]
sys GetSelDet32
mov ebx,edx
pushad
mov esi,DWORD PTR fs:[EPSP_Struc.EPSP_Resource]
exc22_s2: push esi
mov ebp,ResNum ;get number of entries.
mov edi,esi
add esi,ResHead+ResNum
add edi,ResHead
exc22_s0: cmp BYTE PTR es:[edi],Res_MEM ;Anything here?
jnz exc22_s1
mov eax,DWORD PTR fs:[EPSP_Struc.EPSP_INTMem]
cmp es:[esi],eax
jz exc22_s1
cmp WORD PTR fs:[EPSP_Struc.EPSP_DPMIMem],0
jz exc22_nodpmi
pushad
mov bx,WORD PTR fs:[EPSP_Struc.EPSP_DPMIMem]
sys GetSelDet32
cmp es:[esi],edx
popad
jz exc22_s1
exc22_nodpmi: ;
cmp ebx,es:[esi] ;Fits this block?
jnz exc22_s1
pop esi
clc
jmp exc22_s3
;
exc22_s1: add esi,4
inc edi
dec ebp
jnz exc22_s0
pop esi
mov esi,es:[esi+8] ;link to next list.
or esi,esi
jnz exc22_s2
;
;Have a look in the MCB list.
;
cmp DWORD PTR fs:[EPSP_Struc.EPSP_mcbHead],0
jz exc22_nomcbsel
mov esi,DWORD PTR fs:[EPSP_Struc.EPSP_mcbHead]
exc22_mcbs0: mov edi,esi
add esi,mcbChunkLen
exc22_mcbs1: mov eax,esi
add eax,mcbLen
cmp ebx,eax
jnz exc22_mcbs2
clc
jmp exc22_s3
exc22_mcbs2: cmp BYTE PTR es:[esi+mcbNext],"M"
jz exc22_mcbs3
mov esi,es:[edi+mcbChunkNext]
or esi,esi
jz exc22_nomcbsel
jmp exc22_mcbs0
exc22_mcbs3: movzx eax,WORD PTR es:[esi+mcbNextSize]
add eax,mcbLen
add esi,eax
jmp exc22_mcbs1
exc22_nomcbsel: stc
exc22_s3: popad
jc exc22_r4
;
mov b[edi],'Y'
jmp exc22_r5
;
exc22_r4: mov d[edi],'N'
;
exc22_r5: inc edi
mov b[edi],' '
inc edi
;
mov eax,es:[esi]
mov bx,WORD PTR fs:[EPSP_Struc.EPSP_SegBase]
cmp ax,bx
jc exc22_r2
mov bx,WORD PTR fs:[EPSP_Struc.EPSP_SegSize]
add bx,WORD PTR fs:[EPSP_Struc.EPSP_SegBase]
cmp ax,bx
jnc exc22_r2
mov bx,WORD PTR fs:[EPSP_Struc.EPSP_SegBase]
shr bx,3
shr ax,3
sub ax,bx
inc ax
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?