exceptn.asm
来自「开放源码的编译器open watcom 1.6.0版的源代码」· 汇编 代码 · 共 2,536 行 · 第 1/5 页
ASM
2,536 行
call Bin2Hex
;
;Now print the results.
;
push ds
mov ds,ExcepDseg
assume ds:_cwMain
mov esi,offset Copyright
@@cp0: cmp b[esi],0
jz @@cp1
mov dl,[esi]
mov ah,2
int 21h
inc esi
jmp @@cp0
@@cp1: assume ds:_Excep
pop ds
mov edx,offset DebugHeader
mov ah,9
int 21h
mov edx,offset DebugHeader
mov ecx,offset DebugHeaderEnd-(DebugHeader+1+768)
mov ebx,d[@@Handle]
mov ah,40h
int 21h
;
;Print message about writing cw.err
;
mov edx,offset WritingCWERR
mov ah,9
int 21h
CSEIPDEBUGDUMPCOUNT EQU 256 ; should be multiple of 16
SSESPDEBUGDUMPCOUNT EQU 256 ; should be multiple of 16
SSEBPDEBUGDUMPCOUNT EQU 256 ; should be multiple of 16
push fs
mov fs,ds:ExcepDSeg
assume fs:_cwMain
mov fs,fs:PSPSegment
assume fs:nothing
mov edi,offset DebugHeader
mov edx,OFFSET LoadAddrDebugText
call DebugTextCopy
xor edx,edx
mov eax,fs:[EPSP_MemBase]
mov cx,8
call Bin2Hex
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[@@Handle]
int 21h
;
;Do a CS:EIP dump.
;
mov ecx,CSEIPDEBUGDUMPCOUNT
mov fs,DebugCS
mov esi,DebugEIP
test ExcepSystemFlags,1
jz @@cseip32
movzx esi,si
@@cseip32:
xor eax,eax
mov ax,fs
lsl eax,eax
cmp eax,-1
jz @@flat0
inc eax
@@flat0:
mov ebx,esi
add ebx,ecx
cmp ebx,eax
jc @@cseip2
sub ebx,eax
sub ecx,ebx
jz @@cseip3
js @@cseip3
@@cseip2:
;
mov edi,offset DebugHeader
mov edx,OFFSET CSEIPDebugText
call DebugTextCopy
xor edx,edx
@@cseip0:
push ecx
mov ecx,2
mov al,fs:[esi]
call Bin2Hex
pop ecx
mov b[edi]," "
inc edi
inc esi
inc edx
and dl,0fh
jnz @@cseip1
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
;
@@cseip1:
dec ecx
jnz @@cseip0
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[@@Handle]
int 21h
@@cseip3:
; Do user-defined dump, if appropriate
mov ds,cs:ExcepDSeg
assume ds:_cwMain ; allow access to user input variables
movzx ecx,WORD PTR DebugUserCount
test ecx,ecx ; no user dump defined
je userdone
mov ax,DebugUserSel
verr ax
jnz userdone
mov fs,ax
mov esi,DebugUserOff
mov al,DebugAsciiFlag
mov ds,cs:ExcepDDSeg ; restore ds for normal variable access
assume ds:_Excep
mov DumpAsciiFlag,al
test ExcepSystemFlags,1
jz user32
movzx esi,si
user32:
xor eax,eax
mov ax,fs
lsl eax,eax
cmp eax,-1
jz userflat0
inc eax
userflat0:
mov ebx,esi
add ebx,ecx
cmp ebx,eax
jc user2
sub ebx,eax
sub ecx,ebx
jz userdone
js userdone
user2:
mov edi,offset DebugHeader
mov edx,OFFSET UserDebugText
call DebugTextCopy
xor edx,edx
user0:
push ecx
mov ecx,2
mov al,fs:[esi]
cmp DumpAsciiFlag,0 ; show as ASCII if so flagged
je userbin ; binary
cmp al,' ' ; ensure that space or greater
jae userascii
mov al,'.' ; show a period for control characters
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[@@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 @@ssesp3
mov ecx,SSESPDEBUGDUMPCOUNT
mov fs,DebugSS
mov esi,DebugESP
test ExcepSystemFlags,1
jz @@ssesp32
movzx esi,si
@@ssesp32:
xor eax,eax
mov ax,fs
lsl eax,eax
cmp eax,-1
jz @@flat1
inc eax
@@flat1:
mov ebx,esi
add ebx,ecx
cmp ebx,eax
jc @@ssesp2
sub ebx,eax
sub ecx,ebx
jz @@ssesp3
js @@ssesp3
@@ssesp2:
;
mov edi,offset DebugHeader
mov edx,OFFSET SSESPDebugText
call DebugTextCopy
xor edx,edx
@@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 @@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
;
@@ssesp1:
dec ecx
jnz @@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[@@Handle]
int 21h
@@ssesp3:
;
;Do a SS:EBP dump.
;
cmp DebugExceptionIndex,0ch ;stack problem?
jz @@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 med2 ; yes
mov ecx,esi
med2:
sub esi,ecx
test 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 med3
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
med3:
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[@@Handle]
int 21h
;
ebpdump:
mov ecx,SSEBPDEBUGDUMPCOUNT
mov fs,DebugSS
mov esi,DebugEBP
test ExcepSystemFlags,1
jz @@ssebp32
movzx esi,si
@@ssebp32:
xor eax,eax
mov ax,fs
lsl eax,eax
cmp eax,-1
jz @@flat2
inc eax
@@flat2:
mov ebx,esi
add ebx,ecx
cmp ebx,eax
jc @@ssebp2
sub ebx,eax
sub ecx,ebx
jz @@ssebp3
js @@ssebp3
@@ssebp2:
;
mov edi,offset DebugHeader
mov edx,OFFSET SSEBPDebugText
call DebugTextCopy
xor edx,edx
@@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 @@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
;
@@ssebp1:
dec ecx
jnz @@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[@@Handle]
int 21h
;
@@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 fs:d[EPSP_Resource],0
jz @@r8
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?