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

📄 follow.inc

📁 DOS下的调试工具
💻 INC
📖 第 1 页 / 共 2 页
字号:
		mov	bp,bx
		mov	es,[unasm_seg]
		mov	di,@@follow_table - 2

		cld

@@command:
		call	find_first_byte
		jc	@@jump_to_error_exit

		cmp	al,0ffh			;call/jmp mem/reg
		je	@@ref_jump

		test	byte [ref_flags],RF_PREFIX
		jnz	@@error_exit

		cmp	al,70h
		jb	@@next
		cmp	al,7fh
		jbe	@@short_condit_jump

@@next:
		scasw				;add	di,2
		cmp	byte [di],0
		je	@@error_exit
		cmp	byte [di],al
		jne	@@next
		mov	bl,[di+1]
		mov	bh,0
		lea	bx,[@@first_jump+bx]
		jmp	bx

@@first_jump:

@@ref_jump:
		test	byte [ref_flags],RF_32
		jnz	@@error_exit
	es	lodsb
		mov	bl,al
		mov	cl,3
		shr	al,cl
		mov	ah,al
		and	al,111b
		cmp	al,010b

@@jump_to_error_exit:
		jb	@@error_exit
		cmp	al,101b
		ja	@@error_exit
		cmp	al,011b
		ja	@@ref_call
		mov	di,@@last_jump

@@ref_call:
		shr	ah,cl
		cmp	ah,11b
		je	@@reg_ref
		call	calc_mem_address
		mov	es,dx
		cmp	byte [memory_flag],3
		je	@@far_jump
	es	lodsw
		jmp	@@set_cur_seg

@@reg_ref:
		and	bx,111b
		shl	bx,1
		mov	bx,[reg_offs_table+bx]
		mov	ax,[bx]
		jmp	@@set_cur_seg

@@condit_jump:
		cmp	byte [cpu_type],a386
		jb	@@error_exit
	es	lodsb
		cmp	al,80h
		jb	@@error_exit
		cmp	al,8Fh
		jbe	@@near_condit_jump

@@error_exit:
		cmp	bp,[cur_line_ip]
		jne	@@exit
		and	byte [ref_flags],~RF_FOLLOW

@@exit:
		call	popr
		ret

@@short_condit_jump:
		call	@@set_condition

@@short_jump:
		xor	ax,ax
	es	lodsb
		cbw
		jmp	@@near_jump_

@@near_return:
		mov	si,[cpu_regs+REG_SP]
		mov	es,[cpu_regs+REG_SS]
		jmp	@@near_jump

@@far_return:
		mov	si,[cpu_regs+REG_SP]
		mov	es,[cpu_regs+REG_SS]
		jmp	@@far_jump

@@int3:
		mov	ax,3*4
		jmp	@@get_vector

@@into:
		mov	ax,4*4
		jmp	@@get_vector

@@int:
		xor	ax,ax
	es	lodsb
		shl	ax,1
		shl	ax,1

@@get_vector:
		xchg	ax,si
		xor	ax,ax
		mov	es,ax
		jmp	@@far_jump

@@near_condit_jump:
		call	@@set_condition

@@near_jump:
	es	lodsw

@@near_jump_:
		add	ax,si

@@set_cur_seg:
		mov	dx,[unasm_seg]
		jmp	@@normal_exit

@@far_jump:
	es	lodsw
		xchg	ax,dx
	es	lodsw
		xchg	ax,dx

@@normal_exit:
		cmp	bp,[cur_line_ip]
		jne	@@skip
		mov	[follow_seg],dx
		mov	[follow_offs],ax
		or	byte [ref_flags],RF_FOLLOW
@@skip:
		cmp	di,@@last_jump
		jae	@@exit
		or	byte [ref_flags],RF_JUMP
		call	adjust_address
		xchg	ax,bx
		xchg	dx,cx
		mov	dx,[unasm_seg]
		mov	ax,bp
		call	adjust_address
		cmp	dx,cx
		jb	@@exit
		ja	@@set_dir
		cmp	ax,bx
		jb	@@jump_to_exit

@@set_dir:
		or	byte [ref_flags],RF_BACKWARD

@@jump_to_exit:
		jmp	@@exit

@@loop_jump:
		sub	al,0e0h-16
		mov	ah,0
		call	@@set_condition_
		jmp	@@short_jump

@@set_condition:
		and	ax,0fh
@@set_condition_:
		or	byte [ref_flags],RF_CONDITION
		mov	dx,ax
		xchg	ax,bx
		mov	bl,[@@condition_table+bx]
		mov	bh,0
		add	bx,@@jx

@@check_flag:
		mov	cx,[cpu_regs+REG_FL]
		and	cx,0000100011010101b
		push	cx
		popf
		call	bx
		mov	ax,dx
		ret

@@set_result:
		or	byte [ref_flags],RF_TRUE

@@return:
		ret

@@jx:
@@loopne:
		mov	bx,@@jnz
		jmp	@@check_cx

@@loope:
		mov	bx,@@jz
		jmp	@@check_cx

@@loop:
		mov	bx,@@set_result

@@check_cx:
		test	byte [ref_flags],RF_OPERAND_32
		jnz	@@2
		cmp	word [cpu_regs+REG_CX],1
		jmp	@@1

@@2:
	cpu	386
		cmp	dword [cpu_regs+REG_CX],1
	cpu	8086
@@1:
		je	@@return
		jmp	@@check_flag



@@jcxz:
		test	byte [ref_flags],RF_OPERAND_32
		jnz	@@4
		cmp	word [cpu_regs+REG_CX],0
		jmp	@@3

@@4:
	cpu	386
		cmp	dword [cpu_regs+REG_CX],0
	cpu	8086
@@3:
		je	@@set_result
		ret

@@jo:
		jo	@@set_result
		ret

@@jno:
		jno	@@set_result
		ret

@@jb:
		jb	@@set_result
		ret

@@jnb:
		jnb	@@set_result
		ret

@@jz:
		jz	@@set_result
		ret

@@jnz:
		jnz	@@set_result
		ret

@@jna:
		jna	@@set_result
		ret

@@ja:
		ja	@@set_result
		ret

@@js:
		js	@@set_result
		ret

@@jns:
		jns	@@set_result
		ret

@@jp:
		jp	@@set_result
		ret

@@jnp:
		jnp	@@set_result
		ret

@@jl:
		jl	@@set_result
		ret

@@jnl:
		jnl	@@set_result
		ret

@@jng:
		jng	@@set_result
		ret

@@jg:
		jg	@@set_result
		ret


@@follow_table:
		db	0fh				;286+
		db	@@condit_jump	- @@first_jump

		db	0e0h				;loopne/loopnz
		db	@@loop_jump	- @@first_jump

		db	0e1h				;loope/loopz
		db	@@loop_jump	- @@first_jump

		db	0e2h				;loop
		db	@@loop_jump	- @@first_jump

		db	0e3h				;jcxz
		db	@@loop_jump	- @@first_jump

		db	0e9h				;jmp near
		db	@@near_jump	- @@first_jump

		db	0eah				;jmp far
		db	@@far_jump	- @@first_jump

		db	0ebh				;jmp short
		db	@@short_jump	- @@first_jump

@@last_jump:
		db	9ah				;call far
		db	@@far_jump	- @@first_jump

		db	0e8h				;call near
		db	@@near_jump	- @@first_jump

		db	0c2h				;ret near
		db	@@near_return	- @@first_jump

		db	0c3h				;ret near
		db	@@near_return	- @@first_jump

		db	0cah				;ret far
		db	@@far_return	- @@first_jump

		db	0cbh				;ret far
		db	@@far_return	- @@first_jump

		db	0cch				;int 3
		db	@@int3		- @@first_jump

		db	0cdh				;int
		db	@@int		- @@first_jump

		db	0ceh				;into
		db	@@into		- @@first_jump

		db	0cfh				;iret
		db	@@far_return	- @@first_jump

		db	0

@@condition_table:
		db	@@jo	- @@jx		;jo
		db	@@jno	- @@jx		;jno
		db	@@jb	- @@jx		;jb/jnae
		db	@@jnb	- @@jx		;jae/jnb
		db	@@jz	- @@jx		;je/jz
		db	@@jnz	- @@jx		;jne/jnz
		db	@@jna	- @@jx		;jbe/jna
		db	@@ja	- @@jx		;ja/jnbe
		db	@@js	- @@jx		;js
		db	@@jns	- @@jx		;jns
		db	@@jp	- @@jx		;jp/jpe
		db	@@jnp	- @@jx		;jnp/jpo
		db	@@jl	- @@jx		;jl/jnge
		db	@@jnl	- @@jx		;jge/jnl
		db	@@jng	- @@jx		;jle/jng
		db	@@jg	- @@jx		;jg/jnle
		db	@@loopne- @@jx		;loopne
		db	@@loope	- @@jx		;loope
		db	@@loop	- @@jx		;loop
		db	@@jcxz	- @@jx		;jcxz

reg_offs_table:
		dw	cpu_regs+REG_AX
		dw	cpu_regs+REG_CX
		dw	cpu_regs+REG_DX
		dw	cpu_regs+REG_BX
		dw	cpu_regs+REG_SP
		dw	cpu_regs+REG_BP
		dw	cpu_regs+REG_SI
		dw	cpu_regs+REG_DI
;=============================================================================
; adjust_address
;-----------------------------------------------------------------------------
adjust_address:
		push	ax
		shr	ax,1
		shr	ax,1
		shr	ax,1
		shr	ax,1
		add	dx,ax
		pop	ax
		and	ax,000fh
		ret
;=============================================================================
; set_direction
;-----------------------------------------------------------------------------
set_direction:
		call	pushr
		test	byte [ref_flags],RF_JUMP
		jz	@@exit

		cld
		mov	si,buffer + BUF_SIZE	;-offset

@@next_char:
		dec	si
		cmp	byte [si],' '
		je	@@next_char
		mov	di,si
		push	ds
		pop	es
		scasw
		mov	al,18h
		test	byte [ref_flags],RF_BACKWARD
		jnz	@@check_condition
		mov	al,19h

@@check_condition:
		test	byte [ref_flags],RF_CONDITION
		jz	@@set_direction
		test	byte [ref_flags],RF_TRUE
		jnz	@@set_direction
		add	al,1Eh-18h

@@set_direction:
		stosb

@@exit:
		call	popr
		ret
;=============================================================================
; display_code_marks
;-----------------------------------------------------------------------------
display_code_marks:
		call	pushr

		xchg	ax,bp
		mov	ah,al
		mov	al,CPU_WIDTH-1
		call	get_addr
		push	ax

		mov	cx,10
		mov	bp,code_mark_buff
		mov	di,1

@@next_mark:
		test	[code_mark_exist],di
		jz	@@next
		cmp	word [bp],0ffffh
		je	@@next
		mov	ax,[bp+6]
		mov	dx,[bp+4]
		call	adjust_address
		push	bx
		xchg	ax,bx
		mov	si,[unasm_seg]
		xchg	dx,si
		call	adjust_address
		cmp	ax,bx
		pop	bx
		jne	@@next
		mov	ax,atCodeMark*256+'0'+10
		sub	al,cl
		cmp	dx,si
		je	@@write

@@next:
		shl	di,1
		add	bp,4*2
		loop	@@next_mark
		mov	ax,atCodeMark*256+' '

@@write:
		pop	di
		stosw
		call	popr
		ret
;=============================================================================
; E0F
;=============================================================================

⌨️ 快捷键说明

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