⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 generr.asm

📁 开放源码的编译器open watcom 1.6.0版的源代码
💻 ASM
📖 第 1 页 / 共 2 页
字号:
;==-==-==-==-==-==-==-==-==-==-==-==-==-==-==-==-==-==-==-==-==-==-==-==-==-==
;
;Generate a CWD.ERR file for current program.
;
ResSize	equ	4096		;Size of resource block.
ResHead	equ	16		;Size of main header.
ResNum	equ	((((4096-ResHead)/5) shr 2) shl 2)	;Number of entries.
ResCount	equ	ResNum-4		;count for free entry checking.

Res_NULL	equ	0	;MUST be zero.
Res_PSP	equ	1	;single entry.
Res_SEL	equ	2	;single entry.
Res_MEM	equ	3	;3 entries.
Res_LOCK	equ	4	;2 entries.
Res_DOSMEM	equ	5	;?
Res_CALLBACK	equ	6	;3 entries.
Res_NOTHING	equ	254
Res_CHAIN	equ	255	;single entry.

mcbChunkLast	equ	0	;pointer to previous chunk in chain.
mcbChunkNext	equ	4	;pointer to next chunk in chain.
mcbBiggest	equ	8	;biggest free block in this chunk.
mcbChunkSize	equ	10	;size of this chunk.
mcbChunkLen	equ	12	;length of chunk control entry.

mcbID	equ	0	;ID for corruption checking.
mcbLast	equ	1	;previous MCB pointer status.
mcbLastSize	equ	2	;pointer to previous MCB.
mcbFreeUsed	equ	4	;free or used status.
mcbNext	equ	5	;next MCB pointer status.
mcbNextSize	equ	6	;pointer to next MCB.
mcbLen	equ	8	;length of an MCB entry.


GenerateCWD_ERR proc near
	mov	d[ErrHandle],0
	mov	TotalLinearMem,0
	mov	TotalLinearMem+4,0
	mov	TotalLinearMem+8,0
	mov	TotalSelectors,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
	;
	mov	edx,offset eDebugName
	xor	cx,cx
	mov	ax,3c00h
	int	21h
	jc	@@NoFile
	mov	d[ERRHandle],eax
	;
@@NoFile:	;Display debug info.
	;
	mov	esi,offset Copyright+1
	xor	ecx,ecx
@@LookCEnd:	cmp	b[esi],0
	jz	@@AtCEnd
	inc	ecx
	inc	esi
	jmp	@@LookCEnd
@@AtCEnd:	mov	edx,offset Copyright+1
	mov	ebx,d[ERRHandle]
	mov	ah,40h
	int	21h
	;
	mov	ax,DebugTR
	mov	ecx,4
	mov	edi,offset eDebugTRt
	call	bin2hex_err
	mov	eax,DebugCR0
	mov	ecx,8
	mov	edi,offset eDebugCR0t
	call	bin2hex_err
	mov	eax,DebugCR2
	mov	ecx,8
	mov	edi,offset eDebugCR2t
	call	bin2hex_err
	mov	eax,DebugCR3
	mov	ecx,8
	mov	edi,offset eDebugCR3t
	call	bin2hex_err
	;
	mov	eax,DebugEAX
	mov	ecx,8
	mov	edi,offset eDebugEAXt
	call	bin2hex_err
	mov	eax,DebugEBX
	mov	ecx,8
	mov	edi,offset eDebugEBXt
	call	bin2hex_err
	mov	eax,DebugECX
	mov	ecx,8
	mov	edi,offset eDebugECXt
	call	bin2hex_err
	mov	eax,DebugEDX
	mov	ecx,8
	mov	edi,offset eDebugEDXt
	call	bin2hex_err
	mov	eax,DebugESI
	mov	ecx,8
	mov	edi,offset eDebugESIt
	call	bin2hex_err
	mov	eax,DebugEDI
	mov	ecx,8
	mov	edi,offset eDebugEDIt
	call	bin2hex_err
	mov	eax,DebugEBP
	mov	ecx,8
	mov	edi,offset eDebugEBPt
	call	bin2hex_err
	mov	eax,DebugESP
	mov	ecx,8
	mov	edi,offset eDebugESPt
	call	bin2hex_err
	mov	eax,DebugEIP
	mov	ecx,8
	mov	edi,offset eDebugEIPt
	call	bin2hex_err
	mov	eax,DebugEFL
	mov	ecx,8
	mov	edi,offset eDebugEFLt
	call	bin2hex_err
	;
	mov	ax,DebugCS
	mov	ecx,4
	mov	edi,offset eDebugCSt
	call	bin2hex_err
	mov	eax,DebugCSApp
	mov	ecx,8
	mov	edi,offset eDebugCSAppt
	cmp	eax,-1
	jnz	@@0
	mov	d[edi],'xxxx'
	mov	d[edi+4],'xxxx'
	add	edi,8
	jmp	@@1
@@0:	call	bin2hex_err
@@1:	mov	ax,DebugDS
	mov	ecx,4
	mov	edi,offset eDebugDSt
	call	bin2hex_err
	mov	eax,DebugDSApp
	mov	ecx,8
	mov	edi,offset eDebugDSAppt
	cmp	eax,-1
	jnz	@@2
	mov	d[edi],'xxxx'
	mov	d[edi+4],'xxxx'
	add	edi,8
	jmp	@@3
@@2:	call	bin2hex_err
@@3:	mov	ax,DebugES
	mov	ecx,4
	mov	edi,offset eDebugESt
	call	bin2hex_err
	mov	eax,DebugESApp
	mov	ecx,8
	mov	edi,offset eDebugESAppt
	cmp	eax,-1
	jnz	@@4
	mov	d[edi],'xxxx'
	mov	d[edi+4],'xxxx'
	add	edi,8
	jmp	@@5
@@4:	call	bin2hex_err
@@5:	mov	ax,DebugFS
	mov	ecx,4
	mov	edi,offset eDebugFSt
	call	bin2hex_err
	mov	eax,DebugFSApp
	mov	ecx,8
	mov	edi,offset eDebugFSAppt
	cmp	eax,-1
	jnz	@@6
	mov	d[edi],'xxxx'
	mov	d[edi+4],'xxxx'
	add	edi,8
	jmp	@@7
@@6:	call	bin2hex_err
@@7:	mov	ax,DebugGS
	mov	ecx,4
	mov	edi,offset eDebugGSt
	call	bin2hex_err
	mov	eax,DebugGSApp
	mov	ecx,8
	mov	edi,offset eDebugGSAppt
	cmp	eax,-1
	jnz	@@10
	mov	d[edi],'xxxx'
	mov	d[edi+4],'xxxx'
	add	edi,8
	jmp	@@11
@@10:	call	bin2hex_err
@@11:	mov	ax,DebugSS
	mov	ecx,4
	mov	edi,offset eDebugSSt
	call	bin2hex_err
	mov	eax,DebugSSApp
	mov	ecx,8
	mov	edi,offset eDebugSSAppt
	cmp	eax,-1
	jnz	@@12
	mov	d[edi],'xxxx'
	mov	d[edi+4],'xxxx'
	add	edi,8
	jmp	@@13
@@12:	call	bin2hex_err
@@13:	;
	mov	edi,offset DebugSysFlags
	movzx	eax,w[SystemFlags]
	mov	ecx,8
	call	bin2hex_err
	;
	mov	edx,offset eDebugRegs
	mov	ecx,offset eDebugHeaderEnd-(eDebugRegs+1)
	mov	ebx,d[ERRHandle]
	mov	ah,40h
	int	21h

CSEIPDEBUGDUMPCOUNT	EQU	64	; should be multiple of 16, <=256
SSESPDEBUGDUMPCOUNT	EQU	64	; should be multiple of 16, <=256
SSEBPDEBUGDUMPCOUNT	EQU	64	; should be multiple of 16, <=256

	push	fs

	;
	;Do a CS:EIP dump.
	;
	mov	ecx,CSEIPDEBUGDUMPCOUNT
	mov	fs,DebugCS
	mov	esi,DebugEIP
	test	SystemFlags,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 eDebugHeader
	mov	edx,OFFSET CSEIPDebugText
	call	DebugTextCopy
	xor	edx,edx
@@cseip0:
	push	ecx
	mov	ecx,2
	mov	al,fs:[esi]
	call	bin2hex_err
	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 eDebugHeader
	sub	edi,edx
	mov	ecx,edi
	mov	ah,40h
	mov	ebx,d[ErrHandle]
	int	21h
	;

@@cseip3:

	;
	;Do a SS:ESP dump.
	;
	mov	ecx,SSESPDEBUGDUMPCOUNT
	mov	fs,DebugSS
	mov	esi,DebugESP
	test	SystemFlags,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 eDebugHeader
	mov	edx,OFFSET SSESPDebugText
	call	DebugTextCopy
	xor	edx,edx

@@ssesp0:
	push	ecx
	mov	ecx,2
	mov	al,fs:[esi]
	call	bin2hex_err
	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 eDebugHeader
	sub	edi,edx
	mov	ecx,edi
	mov	ah,40h
	mov	ebx,d[ErrHandle]
	int	21h

@@ssesp3:
	;
	;Do a SS:EBP dump.
	;
; 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	SystemFlags,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 eDebugHeader
	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_err
	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 eDebugHeader
	sub	edi,edx
	mov	ecx,edi
	mov	ah,40h
	mov	ebx,d[ErrHandle]
	int	21h
	;

ebpdump:
	mov	ecx,SSEBPDEBUGDUMPCOUNT
	mov	fs,DebugSS
	mov	esi,DebugEBP
	test	SystemFlags,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 eDebugHeader
	mov	edx,OFFSET SSEBPDebugText
	call	DebugTextCopy
	xor	edx,edx

@@ssebp0:
	push	ecx
	mov	ecx,2
	mov	al,fs:[esi]
	call	bin2hex_err
	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 eDebugHeader
	sub	edi,edx
	mov	ecx,edi
	mov	ah,40h
	mov	ebx,d[ErrHandle]
	int	21h
	;

@@ssebp3:
	pop	fs


	;
	;Do resource output stuff.
	;
	push	fs
	mov	fs,DebugPSP
	push	es
	pushad
	cmp	fs:d[EPSP_Resource],0
	jz	@@r8
	mov	edx,offset ResHeader
	mov	ah,40h
	mov	ecx,ResHeaderLen
	mov	ebx,d[ERRHandle]
	int	21h
	mov	edx,offset SelHeader
	mov	ah,40h
	mov	ecx,SelHeaderLen
	mov	ebx,d[ERRHandle]
	int	21h
	mov	es,RealSegment
	mov	esi,fs:d[EPSP_Resource]
@@LookLoop:	push	esi
	mov	ebp,ResNum		;get number of entries.
	mov	edi,esi
	add	esi,ResHead+ResNum
	add	edi,ResHead
@@r0:	cmp	es:b[edi],Res_SEL
	jnz	@@r1
	mov	ax,fs:w[EPSP_DPMIMem]
	cmp	es:w[esi],ax
	jz	@@r1
	;
@@SEL:	pushad
	mov	edi,offset eDebugHeader
	mov	eax,es:[esi]
	mov	ecx,4
	call	bin2hex_err
	mov	b[edi],' '
	inc	edi
	mov	ebx,es:[esi]
	sys	GetSelDet32
	push	ecx
	mov	eax,edx
	mov	ecx,8
	call	bin2hex_err
	mov	b[edi],' '
	inc	edi
	pop	eax
	mov	ecx,8
	call	bin2hex_err
	mov	b[edi],' '
	inc	edi
	mov	eax,es:[esi]
	lar	eax,eax
	test	eax,0000100000000000b
	mov	ebx,'EDOC'
	jnz	@@dc0
	mov	ebx,'ATAD'
@@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	@@Use32It
	mov	bx,"23"
@@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,fs:d[EPSP_Resource]
@@s2:	push	esi
	mov	ebp,ResNum		;get number of entries.
	mov	edi,esi
	add	esi,ResHead+ResNum
	add	edi,ResHead
@@s0:	cmp	es:b[edi],Res_MEM	;Anything here?
	jnz	@@s1
	mov	eax,fs:d[EPSP_INTMem]
	cmp	es:[esi],eax
	jz	@@s1
	cmp	fs:w[EPSP_DPMIMem],0
	jz	@@nodpmi
	pushad
	mov	bx,fs:w[EPSP_DPMIMem]
	sys	GetSelDet32
	cmp	es:[esi],edx
	popad
	jz	@@s1
@@nodpmi:	;
	cmp	ebx,es:[esi]		;Fits this block?
	jnz	@@s1
	pop	esi
	clc
	jmp	@@s3
	;
@@s1:	add	esi,4
	inc	edi
	dec	ebp
	jnz	@@s0
	pop	esi
	mov	esi,es:[esi+8]	;link to next list.
	or	esi,esi
	jnz	@@s2
	;
	;Have a look in the MCB list.
	;
	cmp	fs:d[EPSP_mcbHead],0
	jz	@@nomcbsel
	mov	esi,fs:d[EPSP_mcbHead]
@@mcbs0:	mov	edi,esi
	add	esi,mcbChunkLen
@@mcbs1:	mov	eax,esi
	add	eax,mcbLen
	cmp	ebx,eax
	jnz	@@mcbs2
	clc
	jmp	@@s3
@@mcbs2:	cmp	es:b[esi+mcbNext],"M"
	jz	@@mcbs3
	mov	esi,es:[edi+mcbChunkNext]
	or	esi,esi
	jz	@@nomcbsel
	jmp	@@mcbs0
@@mcbs3:	movzx	eax,es:w[esi+mcbNextSize]

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -