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

📄 operands.asm

📁 比dos下的debug更好的debug程序源码
💻 ASM
📖 第 1 页 / 共 3 页
字号:
	push	edi
	mov	al,[di+OPERAND.THEREG]
	push	ax
	xchg	si,di
	mov	si,offset stsreg
	call	strcpy
	pop	ax
	add	al,'0'
	dec	di
	stosb
	mov	al,')'
	stosb
	sub	al,al
	stosb
	dec	di
	xchg	si,di
	pop	edi
	ret
GetST	ENDP	


GetStdReg	PROC	
	push	edi
	or	al,al
	jnz	short gsrnoe
	mov	BYTE PTR [si],'e'
	inc	si
gsrnoe:
	mov	di,offset regs
	movzx	edi,di
	movzx	ecx,cx
	mov	ax,[edi+ecx *2]
	mov	[si],al
	inc	si
	mov	[si],ah
	inc	si
	mov	BYTE PTR [si],0
	pop	edi
	ret
GetStdReg	ENDP	


GetReg	PROC	
	movzx	cx,al
	sub	al,al
	inc	al
	bt	[di+OPERAND.OEFLAGS],OMF_BYTE
	jc	short grno32
	bt	[di+OPERAND.OEFLAGS],OMF_OP32
	jnc	short grno32
	dec	al
grno32:
	bt	[di+OPERAND.OEFLAGS],OMF_BYTE
	jc	short isbyte
	or	cl,8
isbyte:
	call	GetStdReg
	ret
GetReg	ENDP	


GetSpecial	PROC	
	mov	al,[bx]
	mov	[si],al
	inc	si
	inc	bx
	mov	al,[bx]
	mov	[si],al
	inc	si
	inc	bx
	movzx	eax,[di+OPERAND.THEREG]
	movzx	ebx,bx
	mov	al,[ebx +eax]
	mov	[si],al
	inc	si
	mov	BYTE PTR [si],0
	ret
GetSpecial	ENDP	


GetSeg	PROC	
	push	edi
	push	ax
	mov	di,offset psegs
	movzx	edi,di
	movzx	ecx,cx
	mov	ax,[edi+ecx *2]
	mov	[si],al
	inc	si
	mov	[si],ah
	inc	si
	pop	ax
	or	al,al
	mov	al,':'
	jz	short nocolon
	mov	[si],al
	inc	si
nocolon:
	mov	BYTE PTR [si],0
	pop	edi
	ret
GetSeg	ENDP	


SegOverride	PROC	
	mov	al,1
	sub	cx,cx
	test	[segs],SG_ES
	jz	short so_testcs
	call	GetSeg
so_testcs:
	inc	cx
	test	[segs],SG_CS
	jz	short so_testss
	call	GetSeg
so_testss:
	inc	cx
	test	[segs],SG_SS
	jz	short so_testds
	call	GetSeg
so_testds:
	inc	cx
	test	[segs],SG_DS
	jz	short so_testfs
	call	GetSeg
so_testfs:
	inc	cx
	test	[segs],SG_FS
	jz	short so_testgs
	call	GetSeg
so_testgs:
	inc	cx
	test	[segs],SG_GS
	jz	short so_done
	call	GetSeg
so_done:
	mov	[segs],0
	ret
SegOverride	ENDP	


Scaled	PROC	
	push	DWORD PTR [di+OPERAND.OEFLAGS]
	btr	[di+OPERAND.OEFLAGS],OMF_BYTE
	bts	[di+OPERAND.OEFLAGS],OMF_OP32
	or	al,al
	jz	short notbased
	sub	al,al
	mov	al,[di+OPERAND.THEREG]
	call	GetReg
notbased:
	bt	[di+OPERAND.OEFLAGS],OMF_SCALED
	jnc	short notscaled2
	mov	byte ptr [si],'+'
	inc	si
	mov	al,[di+OPERAND.SCALEREG]
	call	GetReg
	movzx	cx,[di+OPERAND.SCALE]
	or	cx,cx
	jz	notscaled2
	add	cx,cx
	add	cx,offset scales
	movzx	ecx,cx
	mov	ax,[ecx]
	call	put2
notscaled2:
	pop	DWORD PTR [di+OPERAND.OEFLAGS]
	ret
Scaled	ENDP	


FOM_FSTREG	PROC	
	mov	di,offset stalone
	call	strcat
	ret
FOM_FSTREG	ENDP	


FOM_CRX	PROC	
	mov	bx,offset crreg
	call	GetSpecial
	ret
FOM_CRX	ENDP	


FOM_DRX	PROC	
	mov	bx,offset drreg
	call	GetSpecial
	ret
FOM_DRX	ENDP	


FOM_TRX	PROC	
	mov	bx,offset trreg
	call	GetSpecial
	ret
FOM_TRX	ENDP	


FOM_SUD	PROC	
	mov	bx,offset sudreg
	call	GetSpecial
	ret
FOM_SUD	ENDP	


FOM_PORT	PROC	
	mov	al,SY_PORT
	jmp	FormatValue
FOM_PORT	ENDP	


FOM_INT	PROC	
	mov	al,SY_INTR
	jmp	FormatValue
FOM_INT	ENDP	


FOM_SHIFT	PROC	
	bt	[di+OPERAND.OEFLAGS],OMF_CL
	jnc	fos_notcl
	mov	ax,"cl"
	call	put2
	ret
fos_notcl:
	cmp	[di+OPERAND.ADDRESS],1
	mov	al,SY_SHIFT
	jnz	FormatValue
	mov	BYTE PTR [si],'1'
	inc	si
	mov	BYTE PTR [si],0
	ret
FOM_SHIFT	ENDP	


FOM_RETURN	PROC	
	mov	al,SY_RETURN
	jmp	FormatValue
FOM_RETURN	ENDP	


FOM_SHORTBRANCH	PROC	
	mov	al,SY_SHORTBRANCH
	jmp	FormatValue
FOM_SHORTBRANCH	ENDP	


FOM_LONGBRANCH	PROC	
	mov	al,SY_LONGBRANCH
	jmp	FormatValue
FOM_LONGBRANCH	ENDP	


FOM_FARBRANCH	PROC	
	mov	al,SY_SEGMENT
	call	FormatValue
	mov	BYTE PTR [si],':'
	inc	si
	mov	al,SY_ABSBRANCH
	jmp	FormatValue
FOM_FARBRANCH	ENDP	


FOM_ABSOLUTE	PROC	
	call	DoreqsPtrSizeOvride
	call	SegOverride
	mov	BYTE PTR [si],'['
	inc	si
	mov	BYTE PTR [si],0
	bt	[di+OPERAND.OEFLAGS],OMF_SCALED
	jnc	foa_notscaled
	mov	al,SY_WORDOFS
	call	FormatValue
	sub	ax,ax
	call	Scaled
	jmp	short foa_finish
foa_notscaled:
	mov	al,SY_ABSOLUTE
	call	FormatValue
foa_finish:
	mov	BYTE PTR [si],']'
	inc	si
	mov	BYTE PTR [si],0
	ret
FOM_ABSOLUTE	ENDP	


FOM_IMMEDIATE	PROC	
	bt	[di+OPERAND.OEFLAGS],OMF_BYTE
	mov	al,SY_WORDIMM
	jnc	short absformat
	test	[optsignedimm],1
	jnz	fi_signed
	push	ebx
	movzx	ebx,byte ptr [di + OPERAND.ADDRESS]
	mov	[di + OPERAND.ADDRESS],ebx
	pop	ebx
	jmp	FormatValue
fi_signed:
	mov	al,SY_BYTEOFS
	bt	[di+OPERAND.OEFLAGS],OMF_SIGNED
	jnc	short absformat
	mov	al,SY_SIGNEDIMM
	test	[optsignedimm],1
	jnz	absformat
	movsx	eax,byte ptr [di + OPERAND.ADDRESS]
	mov	[di + OPERAND.ADDRESS],eax
	mov	al,SY_WORDIMM
absformat:
	jmp	FormatValue
FOM_IMMEDIATE	ENDP	


FOM_REG	PROC	
	bt	[di+OPERAND.OEFLAGS],OMF_FST
	jnc	short foreg
	call	GetST
	ret
foreg:
	mov	al,[di+OPERAND.THEREG]
	call	GetReg
	ret
FOM_REG	ENDP	


FOM_BASED	PROC	
	call	DoreqsPtrSizeOvride
	call	SegOverride
	mov	BYTE PTR [si],'['
	inc	si
	mov	BYTE PTR [si],0
	bt	[di+OPERAND.OEFLAGS],OMF_ADR32
	jnc	fob_notscaled
	mov	al,1
	call	scaled
	jmp	short fob2
fob_notscaled:
	push	di
	push	si
	movzx	eax,BYTE PTR [di+OPERAND.THEREG]
	xchg	si,di
	mov	si,offset based
	movzx	esi,si
	movzx	ecx,cx
	mov	si,[esi+eax * 2]
	call	strcpy
	pop	si
	pop	di
	call	strlen
	add	si,ax
fob2:
	test	[di+OPERAND.OEFLAGS],OMF_OFFSET
	jz	short fob_noofs
	bt	[di+OPERAND.OEFLAGS],OMF_SIGNED_OFFSET
	mov	al,SY_SIGNEDOFS
	jc	fob_format
	mov	al,SY_WORDOFS
	bt	[di+OPERAND.OEFLAGS],OMF_WORD_OFFSET
	jc	fob_format
	mov	al,SY_BYTEOFS
fob_format:
	call	FormatValue
fob_noofs:
	mov	BYTE PTR [si],']'
	inc	si
	mov	BYTE PTR [si],0
	ret
FOM_BASED	ENDP	


FOM_SEGMENT	PROC	
	movzx	cx,[di+OPERAND.THEREG]
	sub	ax,ax
	call	GetSeg
	ret
FOM_SEGMENT	ENDP	


PutOperand	PROC	
	call	strlen
	add	si,ax
	mov	al,[di+OPERAND.CODE]
	dec	al
	js	short po_none
	push	0
	call	TableDispatch
	dw	17
	dw	fom_based
	dw	fom_segment
	dw	fom_reg
	dw	fom_immediate
	dw	fom_absolute
	dw	fom_farbranch
	dw	fom_longbranch
	dw	fom_shortbranch
	dw	fom_return
	dw	fom_shift
	dw	fom_int
	dw	fom_port
	dw	fom_sud
	dw	0
	dw	fom_trx
	dw	fom_drx
	dw	fom_crx
	dw	fom_fstreg
po_none:
	ret
PutOperand	ENDP	


FormatDisassembly	PROC	
	ENTER	256,0
	push	si
	lea	di,[bp-256]
	mov	BYTE PTR [di],0
	test	[segs],SG_REPZ
	push	di
	jz	fd_notrepz
	mov	si,offset st_repz
	call	strcpy
fd_notrepz:
	test	[segs],SG_REPNZ
	jz	fd_notrepnz
	mov	si,offset st_repnz
	call	strcpy
fd_notrepnz:
	pop	di
	xchg	si,di
	call	strlen
	add	si,ax
	xchg	si,di
	mov	si,offset nmmnemonic
	call	strcat
	lea	si,[bp-256]
	sub	ax,ax
	mov	al,TAB_ARGPOS
	call	TabTo
	mov	di,offset dest
	call	PutOperand
	mov	di,offset source
	test	[di+OPERAND.CODE],-1
	jz	short nosource
	mov	BYTE PTR [si],','
	inc	si
	mov	BYTE PTR [si],0
	call	PutOperand
nosource:
	mov	di,offset extraoperand
	test	[di+OPERAND.CODE],-1
	jz	short noextra
	mov	BYTE PTR [si],','
	inc	si
	mov	BYTE PTR [si],0
	call	PutOperand
noextra:
	pop	si	
	mov	BYTE PTR [si],0
	call	SegOverride
	mov	di,si
	lea	si,[bp-256]
	call	strcat
	LEAVE
	ret
FormatDisassembly	ENDP	


putdword:
	push	eax		; To print a dword
	shr	eax,16		; Print the high 16 bits
	call	putword
	pop	eax		; And the low 16 bits
putword:
	push	ax		; To print a word
	mov	al,ah		; Print the high byte
	call	putbyte
	pop	ax		; And the low byte
putbyte:
	push	ax		; To print a byte
	shr	ax,4		; Print the high nibble
	call	putnibble
	pop	ax		; And the low nibble
putnibble:
	and	al,0fh		; Get a nibble
	add	al,'0'		; Make it numeric
	cmp	al,'9'		; If supposed to be alphabetic
	jle	onib
	add	al,7		; Add 7
onib:
	mov	[si],al
	inc	si
	ret

putwordox:
	bt	[di+OPERAND.OEFLAGS],OMF_OP32
	jnc	putword
	jmp	putdword
putwordax:
	bt	[di+OPERAND.OEFLAGS],OMF_ADR32
	jnc	putword
	jmp	putdword
FSY_SIGNEDOFS	PROC	
	push	bx
	mov	eax,[di+OPERAND.ADDRESS]
	bt	eax,7
	mov	bl,'+'
	jnc	fso_pos
	mov	bl,'-'
	neg	al
fso_pos:
	mov	byte ptr [si],bl
	inc si
	call	putbyte
	pop	bx
	ret
FSY_SIGNEDOFS	ENDP	


FSY_WORDOFS	PROC	
	push	bx
	mov	eax,[di+OPERAND.ADDRESS]
	cmp	ax,-4000h
	mov	bl,'+'
	jc	fsy_wouseplus
	neg	ax
	mov	bl,'-'
fsy_wouseplus:
	mov	byte ptr [si],bl
	inc si
	call	putwordax
	pop	bx
	ret
FSY_WORDOFS	ENDP	


FSY_BYTEOFS	PROC	
	mov	eax,[di+OPERAND.ADDRESS]
	call	putbyte
	ret
FSY_BYTEOFS	ENDP	


FSY_ABSOLUTE	PROC	
	mov	eax,[di+OPERAND.ADDRESS]
	call	putwordax
	ret
FSY_ABSOLUTE	ENDP	


FSY_SIGNEDIMM	PROC	
	jmp	fsy_signedofs
FSY_SIGNEDIMM	ENDP	


FSY_WORDIMM	PROC	
	mov	eax,[di+OPERAND.ADDRESS]
	call	putwordox
	ret
FSY_WORDIMM	ENDP	


FSY_BYTEIMM	PROC	
	mov	eax,[di+OPERAND.ADDRESS]
	call	putbyte
	ret
FSY_BYTEIMM	ENDP	


FSY_PORT	PROC	
	mov	eax,[di+OPERAND.ADDRESS]
	call	putbyte
	ret
FSY_PORT	ENDP	


FSY_INTR	PROC	
	mov	eax,[di+OPERAND.ADDRESS]
	call	putbyte
	ret
FSY_INTR	ENDP	


FSY_RETURN	PROC	
	mov	eax,[di+OPERAND.ADDRESS]
	call	putword
	ret
FSY_RETURN	ENDP	


FSY_ABSBRANCH	PROC	
	mov	eax,[di+OPERAND.ADDRESS]
	call	putword
	ret
FSY_ABSBRANCH	ENDP	


FSY_LONGBRANCH	PROC	
	mov	eax,[di+OPERAND.ADDRESS]
	call	putword
	ret
FSY_LONGBRANCH	ENDP	


FSY_SHORTBRANCH	PROC	
	mov	eax,[di+OPERAND.ADDRESS]
	call	putword
	ret
FSY_SHORTBRANCH	ENDP	


FSY_SHIFT	PROC	
	mov	eax,[di+OPERAND.ADDRESS]
	call	putbyte
	ret
FSY_SHIFT	ENDP	


FSY_SEGMENT	PROC	
	mov	ax,[di+OPERAND.OESEG]
	call	putword
	ret
FSY_SEGMENT	ENDP	


FormatValue	PROC	
	dec	al
	push	0
	call	TableDispatch
	dw	14
	dw	FSY_SIGNEDOFS,FSY_WORDOFS,FSY_BYTEOFS,FSY_ABSOLUTE
	dw	FSY_SIGNEDIMM,FSY_WORDIMM,FSY_BYTEIMM,FSY_PORT
	dw	FSY_INTR,FSY_RETURN,FSY_ABSBRANCH,FSY_LONGBRANCH
	dw	FSY_SHORTBRANCH,FSY_SHIFT,FSY_SEGMENT
	mov	byte ptr [si],0
	ret
FormatValue	ENDP	




































































END

⌨️ 快捷键说明

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