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

📄 generr.asm

📁 开放源码的编译器open watcom 1.6.0版的源代码
💻 ASM
📖 第 1 页 / 共 2 页
字号:
	add	eax,mcbLen
	add	esi,eax
	jmp	@@mcbs1
@@nomcbsel:	stc
@@s3:	popad
	jc	@@r4
	;
	mov	b[edi],'Y'
	jmp	@@r5
	;
@@r4:	mov	d[edi],'N'
	;
@@r5:	inc	edi
	mov	b[edi],' '
	inc	edi
	;
	mov	eax,es:[esi]
	mov	bx,fs:w[EPSP_SegBase]
	cmp	ax,bx
	jc	@@r2
	mov	bx,fs:w[EPSP_SegSize]
	add	bx,fs:w[EPSP_SegBase]
	cmp	ax,bx
	jnc	@@r2
	mov	bx,fs:w[EPSP_SegBase]
	shr	bx,3
	shr	ax,3
	sub	ax,bx
	inc	ax
	mov	ecx,4
	call	bin2hex_err
	jmp	@@r20
	;
@@r2:	mov	d[edi],'xxxx'
	add	edi,4
	;
@@r20:	mov	b[edi],13
	mov	b[edi+1],10
	mov	b[edi+2],'$'
	add	edi,2
	push	edi
	pop	ecx
	sub	ecx,offset eDebugHeader
	mov	edx,offset eDebugHeader
	mov	ah,40h
	mov	ebx,d[ERRHandle]
	int	21h
	popad
	;
@@r1:	add	esi,4
	inc	edi
	dec	ebp
	jnz	@@r0
	pop	edi
	mov	esi,es:[edi+8]	;link to next list.
	or	esi,esi
	jnz	@@LookLoop
	;


	mov	edi,offset TotalSelsNum
	mov	eax,TotalSelectors
	mov	ecx,4
	call	bin2hex_err
	mov	ecx,TotalSelsTLen
	mov	edx,offset TotalSelsText
	mov	ah,40h
	mov	ebx,d[ERRHandle]
	int	21h
	;
	;Now do memory blocks.
	;
	mov	edx,offset MemHeader
	mov	ah,40h
	mov	ecx,MemHeaderLen
	mov	ebx,d[ERRHandle]
	int	21h
	;
	mov	esi,fs:d[EPSP_Resource]
	mov	es,RealSegment
@@mLookLoop:	push	esi
	mov	ebp,ResNum		;get number of entries.
	mov	edi,esi
	add	esi,ResHead+ResNum
	add	edi,ResHead
@@m0:	cmp	es:b[edi],Res_MEM
	jnz	@@m1
	;
	mov	eax,fs:d[EPSP_INTMem]
	cmp	es:[esi],eax
	jz	@@m1
	cmp	fs:w[EPSP_DPMIMem],0
	jz	@@nodpmimem
	pushad
	mov	bx,fs:w[EPSP_DPMIMem]
	sys	GetSelDet32
	cmp	es:[esi],edx
	popad
	jz	@@m1
	;
@@nodpmimem:	;Check if this is an MCB block.
	;
	push	edi
	cmp	fs:d[EPSP_mcbHead],0
	jz	@@MEM
	mov	ebx,es:[esi]
	mov	edi,fs:d[EPSP_mcbHead]
@@mcbmc0:	cmp	ebx,edi
	jz	@@mcbmc1
	mov	edi,es:[edi+mcbChunkNext]
	or	edi,edi
	jz	@@MEM
	jmp	@@mcbmc0
	;
@@mcbmc1:	;Update Total memory value and skip this block.
	;
	mov	eax,es:[esi+8]
	add	eax,4095
	and	eax,0fffff000h
	add	TotalLinearMem+4,eax
	pop	edi
	jmp	@@m1
@@MEM:	pop	edi
	pushad
	mov	edi,offset eDebugHeader
	mov	eax,es:[esi+4]
	mov	ecx,8
	call	bin2hex_err
	mov	b[edi],' '
	inc	edi
	mov	eax,es:[esi]
	mov	ecx,8
	call	bin2hex_err
	mov	b[edi],' '
	inc	edi
	mov	eax,es:[esi+8]
	add	TotalLinearMem,eax
	push	eax
	add	eax,4095
	and	eax,0fffff000h
	add	TotalLinearMem+4,eax
	pop	eax
	inc	TotalLinearMem+8
	mov	ecx,8
	call	bin2hex_err
	mov	b[edi],' '
	inc	edi
	;
	mov	b[edi],13
	mov	b[edi+1],10
	mov	b[edi+2],'$'
	add	edi,2
	push	edi
	pop	ecx
	push	es
	sub	ecx,offset eDebugHeader
	mov	edx,offset eDebugHeader
	mov	ah,40h
	mov	ebx,d[ERRHandle]
	int	21h
	pop	es
	popad
	;
@@m1:	add	esi,4
	inc	edi
	dec	ebp
	jnz	@@m0
	pop	edi
	mov	esi,es:[edi+8]	;link to next list.
	or	esi,esi
	jnz	@@mLookLoop
	;
	;Now print MCB controlled blocks.
	;
	cmp	fs:d[EPSP_mcbHead],0
	jz	@@nomcbdis
	mov	esi,fs:d[EPSP_mcbHead]
@@mcb0:	mov	edi,esi
	add	esi,mcbChunkLen
@@mcb1:	cmp	es:b[esi+mcbFreeUsed],"J"	;Free block?
	jz	@@mcb2
	mov	eax,fs:d[EPSP_INTMem]
	sub	eax,mcbLen
	cmp	esi,eax
	jz	@@mcb2
	cmp	fs:w[EPSP_DPMIMem],0
	jz	@@nodpmimemhere
	pushad
	mov	bx,fs:w[EPSP_DPMIMem]
	sys	GetSelDet32
	sub	edx,mcbLen
	cmp	esi,edx
	popad
	jz	@@mcb2
@@nodpmimemhere:
	pushad
	mov	edi,offset eDebugHeader
	mov	eax,esi
	add	eax,mcbLen
	mov	cx,8
	call	bin2hex_err
	mov	b[edi],' '
	inc	edi
	mov	eax,esi
	add	eax,mcbLen
	mov	cx,8
	call	bin2hex_err
	mov	b[edi],' '
	inc	edi
	movzx	eax,es:w[esi+mcbNextSize]
	inc	TotalLinearMem+8
	mov	cx,8
	push	eax
	call	bin2hex_err
	mov	b[edi],' '
	inc	edi
	pop	eax
	add	TotalLinearMem,eax
	;
	mov	b[edi],13
	mov	b[edi+1],10
	mov	b[edi+2],'$'
	add	edi,2
	push	edi
	pop	ecx
	push	es
	sub	ecx,offset eDebugHeader
	mov	edx,offset eDebugHeader
	mov	ah,40h
	mov	ebx,d[ERRHandle]
	int	21h
	pop	es
	popad
@@mcb2:	cmp	es:b[esi+mcbNext],"M"	;end of the chain?
	jz	@@mcb3
	mov	esi,es:[edi+mcbChunkNext]
	or	esi,esi
	jnz	@@mcb0
	jmp	@@nomcbdis
	;
@@mcb3:	movzx	eax,es:w[esi+mcbNextSize]
	add	eax,mcbLen
	add	esi,eax
	jmp	@@mcb1
	;
@@nomcbdis:	;Display totals.
	;
	mov	edi,offset TotalMemNum1
	mov	eax,TotalLinearMem
	mov	ecx,8
	call	bin2hex_err
	mov	edi,offset TotalMemNum2
	mov	eax,TotalLinearMem+4
	mov	ecx,8
	call	bin2hex_err
	mov	edi,offset TotalMemNum3
	mov	eax,TotalLinearMem+8
	mov	ecx,8
	call	bin2hex_err
	mov	ecx,TotalMemTLen
	mov	edx,offset TotalMemText
	mov	ah,40h
	mov	ebx,d[ERRHandle]
	int	21h
	;
	;Now do lock details.
	;
	mov	edx,offset LockHeader
	mov	ah,40h
	mov	ecx,LockHeaderLen
	mov	ebx,d[ERRHandle]
	int	21h
	;
	mov	esi,fs:d[EPSP_Resource]
@@lLookLoop:	push	esi
	mov	ebp,ResNum		;get number of entries.
	mov	edi,esi
	add	esi,ResHead+ResNum
	add	edi,ResHead
@@l0:	cmp	es:b[edi],Res_LOCK
	jnz	@@l1
	;
@@LOCK:	pushad
	mov	edi,offset eDebugHeader
	mov	eax,es:[esi]
	mov	cx,8
	call	bin2hex_err
	mov	b[edi],' '
	inc	edi
	mov	eax,es:[esi+4]
	mov	cx,8
	call	bin2hex_err
	mov	b[edi],' '
	inc	edi
	;
	mov	b[edi],13
	mov	b[edi+1],10
	mov	b[edi+2],'$'
	add	edi,2
	push	edi
	pop	ecx
	sub	ecx,offset eDebugHeader
	mov	edx,offset eDebugHeader
	mov	ah,40h
	mov	ebx,d[ERRHandle]
	int	21h
	popad
	;
@@l1:	add	esi,4
	inc	edi
	dec	ebp
	jnz	@@l0
	pop	edi
	mov	esi,es:[edi+8]	;link to next list.
	or	esi,esi
	jnz	@@lLookLoop
	;
	;Now do DOS memory details.
	;
	mov	edx,offset DosMemHeader
	mov	ah,40h
	mov	ecx,DosMemHeaderLen
	mov	ebx,d[ERRHandle]
	int	21h
	;
	mov	esi,fs:d[EPSP_Resource]
@@dmLookLoop:	push	esi
	mov	ebp,ResNum		;get number of entries.
	mov	edi,esi
	add	esi,ResHead+ResNum
	add	edi,ResHead
@@dm0:	cmp	es:b[edi],Res_DOSMEM
	jnz	@@dm1
	;
	pushad
	mov	edi,offset eDebugHeader
	mov	eax,es:[esi]
	mov	cx,4
	call	bin2hex_err
	mov	b[edi],' '
	inc	edi
	pushm	ebx,ecx,edx
	mov	bx,es:[esi]
	sys	GetSelDet32
	mov	eax,edx
	popm	ebx,ecx,edx
	mov	cx,8
	call	bin2hex_err
	mov	b[edi],' '
	inc	edi
	mov	eax,es:[esi+4]
	mov	cx,8
	call	bin2hex_err
	mov	b[edi],' '
	inc	edi
	;
	mov	b[edi],13
	mov	b[edi+1],10
	mov	b[edi+2],'$'
	add	edi,2
	push	edi
	pop	ecx
	sub	ecx,offset eDebugHeader
	mov	edx,offset eDebugHeader
	mov	ah,40h
	mov	ebx,d[ERRHandle]
	int	21h
	popad
	;
@@dm1:	add	esi,4
	inc	edi
	dec	ebp
	jnz	@@dm0
	pop	edi
	mov	esi,es:[edi+8]	;link to next list.
	or	esi,esi
	jnz	@@dmLookLoop
	cmp	fs:d[EPSP_INTMem],0
	jz	@@r8
	;
	;Now do protected mode int details.
	;
	mov	edx,offset PIntHeader
	mov	ah,40h
	mov	ecx,PIntHeaderLen
	mov	ebx,d[ERRHandle]
	int	21h
	;
	mov	ecx,256
	mov	esi,fs:d[EPSP_INTMem]
	mov	ebx,0
@@pv0:	pushm	ebx,ecx,esi
	sys	GetVect
	cmp	cx,es:w[esi+4]
	jnz	@@pv10
	cmp	edx,es:d[esi]
	jz	@@pv1
@@pv10:	;
	mov	edi,offset eDebugHeader
	mov	eax,ebx
	mov	cx,2
	call	bin2hex_err
	mov	b[edi],' '
	inc	edi
	mov	ax,es:w[esi+4]
	mov	cx,4
	call	bin2hex_err
	mov	b[edi],' '
	inc	edi
	mov	eax,es:d[esi]
	mov	cx,8
	call	bin2hex_err
	mov	b[edi],' '
	inc	edi
	;
	mov	b[edi],13
	mov	b[edi+1],10
	mov	b[edi+2],'$'
	add	edi,2
	push	edi
	pop	ecx
	sub	ecx,offset eDebugHeader
	mov	edx,offset eDebugHeader
	mov	ah,40h
	mov	ebx,d[ERRHandle]
	int	21h
	;
@@pv1:	popm	ebx,ecx,esi
	add	esi,6
	inc	ebx
	loop	@@pv0
	;
	;Now do protected mode exception details.
	;
	mov	edx,offset EIntHeader
	mov	ah,40h
	mov	ecx,EIntHeaderLen
	mov	ebx,d[ERRHandle]
	int	21h
	;
	mov	ecx,32
	mov	esi,fs:d[EPSP_INTMem]
	add	esi,256*6
	mov	ebx,0
@@pe0:	pushm	ebx,ecx,esi
	sys	GetEVect
	cmp	cx,es:w[esi+4]
	jnz	@@pv100
	cmp	edx,es:d[esi]
	jz	@@pe1
@@pv100:	;
	mov	edi,offset eDebugHeader
	mov	eax,ebx
	mov	cx,2
	call	bin2hex_err
	mov	b[edi],' '
	inc	edi
	mov	ax,es:w[esi+4]
	mov	cx,4
	call	bin2hex_err
	mov	b[edi],' '
	inc	edi
	mov	eax,es:d[esi]
	mov	cx,8
	call	bin2hex_err
	mov	b[edi],' '
	inc	edi
	;
	mov	b[edi],13
	mov	b[edi+1],10
	mov	b[edi+2],'$'
	add	edi,2
	push	edi
	pop	ecx
	sub	ecx,offset eDebugHeader
	mov	edx,offset eDebugHeader
	mov	ah,40h
	mov	ebx,d[ERRHandle]
	int	21h
	;
@@pe1:	popm	ebx,ecx,esi
	add	esi,6
	inc	ebx
	loop	@@pe0
	;
	;Now do real mode int details.
	;
	mov	edx,offset RIntHeader
	mov	ah,40h
	mov	ecx,RIntHeaderLen
	mov	ebx,d[ERRHandle]
	int	21h
	;
	mov	ecx,256
	mov	esi,fs:d[EPSP_INTMem]
	add	esi,(256*6)+(32*6)
	mov	ebx,0
@@ri0:	pushm	ebx,ecx,esi
	sys	GetRVect
	cmp	cx,es:w[esi+2]
	jnz	@@pv1000
	cmp	dx,es:w[esi]
	jz	@@ri1
@@pv1000:	;
	mov	edi,offset eDebugHeader
	mov	eax,ebx
	mov	cx,2
	call	bin2hex_err
	mov	b[edi],' '
	inc	edi
	mov	ax,es:w[esi+2]
	mov	cx,4
	call	bin2hex_err
	mov	b[edi],' '
	inc	edi
	mov	ax,es:w[esi]
	mov	cx,4
	call	bin2hex_err
	mov	b[edi],' '
	inc	edi
	;
	mov	b[edi],13
	mov	b[edi+1],10
	mov	b[edi+2],'$'
	add	edi,2
	push	edi
	pop	ecx
	sub	ecx,offset eDebugHeader
	mov	edx,offset eDebugHeader
	mov	ah,40h
	mov	ebx,d[ERRHandle]
	int	21h
	;
@@ri1:	popm	ebx,ecx,esi
	add	esi,4
	inc	ebx
	loop	@@ri0
	;
	;Now do call-back details.
	;
	mov	edx,offset CallBackHeader
	mov	ah,40h
	mov	ecx,CallBackHeaderLen
	mov	ebx,d[ERRHandle]
	int	21h
	;
	mov	esi,fs:d[EPSP_Resource]
@@cbLookLoop:	push	esi
	mov	ebp,ResNum		;get number of entries.
	mov	edi,esi
	add	esi,ResHead+ResNum
	add	edi,ResHead
@@cb0:	cmp	es:b[edi],Res_CALLBACK
	jnz	@@cb1
	;
	pushad
	mov	edi,offset eDebugHeader
	mov	eax,es:[esi]
	shr	eax,16
	mov	cx,4
	call	bin2hex_err
	mov	b[edi],':'
	inc	edi
	mov	eax,es:[esi]
	mov	cx,4
	call	bin2hex_err
	mov	b[edi],' '
	inc	edi
	mov	eax,es:[esi+8]
	mov	cx,4
	call	bin2hex_err
	mov	b[edi],':'
	inc	edi
	mov	eax,es:[esi+4]
	mov	cx,8
	call	bin2hex_err
	;
	mov	b[edi],13
	mov	b[edi+1],10
	mov	b[edi+2],'$'
	add	edi,2
	push	edi
	pop	ecx
	sub	ecx,offset eDebugHeader
	mov	edx,offset eDebugHeader
	mov	ah,40h
	mov	ebx,d[ERRHandle]
	int	21h
	popad
	;
@@cb1:	add	esi,4
	inc	edi
	dec	ebp
	jnz	@@cb0
	pop	edi
	mov	esi,es:[edi+8]	;link to next list.
	or	esi,esi
	jnz	@@cbLookLoop
@@r8:	popad
	pop	es
	pop	fs
	;
	mov	ebx,d[ERRHandle]
	mov	ah,3eh
	int	21h
	;
@@9:	ret
GenerateCWD_ERR endp


;-------------------------------------------------------------------------
;
;Convert number into ASCII Hex version.
;
;On Entry:-
;
;EAX	- Number to convert.
;CX	- Digits to do.
;DS:EDI	- Buffer to put string in.
;
Bin2Hex_err	proc	near
	pushm	eax,ebx,ecx,edx,edi
	movzx	ecx,cx
	mov	ebx,offset HexTable
	add	edi,ecx
	dec	edi
	mov	edx,eax
@@0:	mov	al,dl
	shr	edx,4
	and	al,15
	xlat	[ebx]
	mov	[edi],al
	dec	edi
	dec	ecx
	jnz	@@0
	popm	eax,ebx,ecx,edx,edi
	push	ecx
	movzx	ecx,cx
	add	edi,ecx
	pop	ecx
	ret
Bin2Hex_err	endp


;-------------------------------------------------------------------------
;
;Convert segment value into real & application relative.
;
;On Entry:-
;
;AX	- Selector.
;DS:EDI	- Buffer address.
;
DebugSegmentDPMI proc near
	push	fs
	mov	fs,DebugPSP
	mov	ebx,-1
	;
	push	eax
	mov	ax,fs
	movzx	eax,ax
	lsl	eax,eax
	cmp	eax,(size PSP_Struc)+(size EPSP_Struc)
	pop	eax
	jc	@@9
	;
	mov	dx,ax
	cmp	ax,fs:w[EPSP_SegBase]	;inside application selector space?
	jc	@@9
	mov	cx,fs:w[EPSP_SegSize]
	add	cx,fs:w[EPSP_SegBase]	;add in base selector.
	cmp	ax,cx
	jnc	@@9		;outside application startup selectors.
	mov	bx,dx
	pushm	cx,dx
	mov	ax,0006h
	int	31h
	mov	ax,cx
	shl	eax,16
	mov	ax,dx
	popm	cx,dx
	sub	eax,fs:d[EPSP_MemBase]	;get offset within application.
	mov	ebx,eax
@@9:	pop	fs
	mov	[edi],ebx		;store generated value.
	ret
DebugSegmentDPMI endp

;-------------------------------------------------------------------------
; copy debug text into output buffer
; upon entry ds:edi -> out buffer, ds:edx -> in buffer
;
DebugTextCopy	PROC	NEAR

dbdloop:
	mov	al,ds:[edx]
	test	al,al
	je	dbdret		; null terminator flags end of text, don't transfer
	mov	ds:[edi],al
	inc	edx
	inc	edi
	jmp	dbdloop

dbdret:
	ret
DebugTextCopy	ENDP

⌨️ 快捷键说明

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