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

📄 unasm.inc

📁 DOS下的调试工具
💻 INC
📖 第 1 页 / 共 4 页
字号:
;=============================================================================
; Insight, real-mode debugger for MS DOS / PC DOS / FreeDOS.
; Copyright (c) Victor M. Gamayunov, Sergey Pimenov, 1993, 96, 97, 2002.
; Modifications by Oleg O. Chukaev (2006, 2007).
;-----------------------------------------------------------------------------
; unasm.inc
; Disassembler.
;-----------------------------------------------------------------------------
; This program is free software; you can redistribute it and/or
; modify it under the terms of the GNU General Public License
; as published by the Free Software Foundation; either version 2
; of the License, or (at your option) any later version.
;
; This program is distributed in the hope that it will be useful,
; but WITHOUT ANY WARRANTY; without even the implied warranty of
; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
; GNU General Public License for more details.
; 
; You should have received a copy of the GNU General Public License
; along with this program; if not, write to the Free Software
; Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
; 02111-1307, USA.
;=============================================================================


cpu_type	db	a86

;=============================================================================
; unassemble
;-----------------------------------------------------------------------------
; Unassembles command from unasm_seg:SI
unassemble:
		push	ax
		push	bx
		push	cx
		push	dx
		push	di
		push	ds
		push	es
		cld
		xor	ax,ax
		mov	[memory_flag],al
		mov	[mem_disp_offs],ax
		mov	[jcnear],al
		mov	byte [mem_disp_type],8
		mov	[mem_prefix],ax
		mov	ds,[cs:unasm_seg]
		push	cs
		pop	es
		mov	[cs:unasm_cur_ip],si
		mov	[cs:ignore_prefix],al
get_next_cmd:
		call	clear_buffer
		mov	di,CMD_X
		xor	ax,ax
		mov	[cs:op_size_flag],al
		mov	[cs:addr_size_flag],al
		mov	[cs:str_flag],al
		mov	[cs:cur_rep],ax
		mov	[cs:db_flag],al
get_next_byte:
		lodsb
		mov	[cs:cur_cmd],al
		xor	bx,bx
		mov	bl,al
		shl	bx,1
		mov	byte [cs:inst_286],0
		mov	byte [cs:print_flag],0
		mov	dx,[cs:cmd_parameters+bx]
		mov	[cs:cur_param],dx
		mov	dx,[cs:cmd_addrs+bx]
		cmp	dx,size_prefixes
		jb	not_size_prefix
		jmp	analyze_size_prefix
not_size_prefix:
		cmp	dx,seg_prefixes
		jb	not_seg_prefix
		jmp	analyze_seg_prefix
not_seg_prefix:
		cmp	dx,unasm_rep_prefixes
		jb	get_code_name
		jmp	analyze_rep_prefix
get_code_name:
		call	analyze_code
		mov	dx,[cs:cur_param]
		cmp	byte [cs:inst_286],0
		je	param_8086

		mov	bl,dh
		mov	bh,0
		add	bx,bx
		mov	dx,[cs:table_286_param+bx]
		mov	[cs:cur_param],dx

param_8086:
		or	dx,dx
		jz	no_params
		or	dh,dh
		jne	@@no_print
		mov	byte [cs:print_flag],1
@@no_print:
		mov	al,dl
		call	analyze_param
		cmp	byte [cs:db_flag],0
		jne	make_db_command
		mov	dx,[cs:cur_param]
		or	dh,dh
		jz	unasm_one_param
		cmp	dh,aemp
		je	unasm_one_param
		call	delimit
		mov	al,dh
		call	analyze_param
		cmp	byte [cs:db_flag],0
		jne	make_db_command
no_params:
unasm_one_param:
		cmp	word [cs:cur_rep],0
		je	no_rep
		cmp	byte [cs:str_flag],1
		je	no_rep
		mov	word [cs:cur_rep],0
make_db_command:
		call	clear_buffer
		mov	dx,cdb
		mov	word [cs:cur_param],0
		mov	di,CMD_X
		mov	si,[cs:unasm_cur_ip]
		lodsb
		jmp	get_code_name
no_rep:
		cmp	word [cs:cur_prefix],0
		jne	prefix_not_used

prefix_now_used:
						;[1245 - 1.01]
		cmp	byte [cs:op_size_flag],0
		je	@@skip_param_32
		mov	byte [cs:memory_flag],3

@@skip_param_32:
						;[1245 - 1.01]
		push	di
		mov	cx,si
		sub	cx,[cs:unasm_cur_ip]
		mov	[cs:cmd_length],cx
		mov	di,buffer+6
		call	fill_codes
		mov	di,buffer
		call	fill_addr
		pop	di
		pop	es
		pop	ds
		lea	ax,[di-(CMD_X-offset_0100h+100h)]
		mov	[cmd_text_size],ax
		pop	di
		pop	dx
		pop	cx
		pop	bx
		pop	ax
		ret

cmd_length	dw	0

; Return from unassemble --------------------------
analyze_size_prefix:
		mov	ah,[cs:cur_param]
		cmp	ah,[cs:cpu_type]
		ja	bad_prefix
		cmp	dx,op_size
		je	set_op_size
		mov	byte [cs:addr_size_flag],1
		jmp	get_next_byte
set_op_size:
		mov	byte [cs:op_size_flag],1
		jmp	get_next_byte

prefix_not_used:
many_prefs:
		mov	si,[cs:unasm_cur_ip]
		mov	word [cs:cur_prefix],0
		mov	byte [cs:ignore_prefix],1
		jmp	get_next_cmd

analyze_seg_prefix:
		mov	ah,[cs:cur_param]
		cmp	ah,[cs:cpu_type]
		jbe	pref_ok
bad_prefix:
		mov	dx,cdb
loc_get_code_name:
		jmp	get_code_name
pref_ok:
		cmp	byte [cs:ignore_prefix],1
		je	loc_get_code_name
		cmp	word [cs:cur_prefix],0
		jne	many_prefs
		mov	[cs:cur_prefix],dx
		jmp	get_next_byte

analyze_rep_prefix:
		mov	bx,dx
		call	fill_csbx
		mov	di,OPER_X
		mov	[cs:cur_rep],dx
		jmp	get_next_byte

;=============================================================================
; analyze_code
;-----------------------------------------------------------------------------
analyze_code:
		cmp	al,0fh
		je	check_pm_inst
		mov	bx,[cs:cur_param]
		cmp	bl,a86
		jbe	not_286

check_286_inst:
		cmp	bl,80h
		jae	not_286
		cmp	bl,[cs:cpu_type]
		jbe	@@ok
		mov	dx,cdb
		jmp	..@go_ahead

@@ok:
		mov	byte [cs:inst_286],1
		jmp	..@test_ext

ch_second:
		lodsb
		cmp	al,0ah
		je	..@go_ahead
		mov	byte [cs:cur_param],aim8
		dec	si
		jmp	..@go_ahead

check_pm_inst:
		cmp	byte [cs:cpu_type],a86
		je	not_286
		jmp	analyze_pm_inst

not_286:
		cmp	al,0d4h
		je	ch_second
		cmp	al,0d5h
		je	ch_second
..@test_ext:
		cmp	byte [cs:addr_size_flag],0
		je	@@skip_addr
		cmp	al,0e3h
		je	check_jecxz
@@skip_addr:
		cmp	byte [cs:op_size_flag],0
		je	@@skip_op
		mov	bx,ext_table
@@next_ext:
		mov	ah,[cs:bx]
		or	ah,ah
		jz	..@go_ahead
		cmp	al,ah
		je	@@found_ext
		add	bx,3
		jmp	@@next_ext
@@found_ext:
		mov	dx,[cs:bx+1]
		jmp	..@go_ahead
@@skip_op:
;		cmp	al,0D8h
;		jb	@@Go_ahead
;		cmp	al,0DFh
;		jbe	Coprocessor
..@go_ahead:
		push	si
		cmp	dx,6
		jbe	groups
make_db:
		mov	si,dx
		cmp	dx,cdb
		jne	..@quit_00
		call	unasm_fill_str
		pop	si
		mov	si,[cs:unasm_cur_ip]
		lodsb
		mov	di,OPER_X
		call	fill_byte_str
		mov	word [cs:cur_param],0
		ret
check_jecxz:
		mov	dx,cjecxz
		jmp	..@go_ahead

groups:
		mov	byte [cs:print_flag],1
		mov	al,[si]
		xor	bx,bx
		mov	bl,al
		and	bl,00111000b
		cmp	dx,grp_1
		jne	@@1
		cmp	bl,00000000b
		jne	@@1
		mov	byte [cs:cur_param+1],aim8
		cmp	byte [cs:cur_param],arm8
		je	@@1
		mov	byte [cs:cur_param+1],aim16
@@1:
		shr	bl,1
		shr	bl,1
		shl	dx,1
		shl	dx,1
		shl	dx,1
		shl	dx,1
		add	bx,dx
		mov	si,[cs:grp_commands+bx]
		cmp	si,qqq
		jne	..@quit_00
		mov	dx,cdb
		mov	word [cs:cur_param],0
		jmp	make_db
..@quit_00:
		call	unasm_fill_str
		pop	si
		cmp	di,OPER_X
		ja	@@exit
		mov	di,OPER_X
		ret
@@exit:
		inc	di
		ret

analyze_pm_inst:
		push	si
		lodsb
		cmp	al,1
		jbe	pm_group
		cmp	al,6
		jbe	pm_cmd
		cmp	byte [cs:cpu_type],a386
		jae	analyze_386_inst
bad_pm_command:
		pop	si
		jmp	..@go_ahead
pm_cmd:
		add	al,14
		mov	bl,al
		mov	bh,0
		shl	bx,1
		jmp	get_pm_name
pm_group:
		mov	bl,al
		lodsb
		and	al,00111000b
		shr	al,1
		shr	al,1
		mov	cl,4
		shl	bl,cl
		or	bl,al
		mov	bh,0
get_pm_name:
		mov	dx,[cs:pm_commands+bx]
		cmp	dx,cdb
		je	bad_pm_command
		cmp	dx,cinvlpg
		je	check_invlpg
invlpg_ok:
		mov	ax,[cs:pm_param+bx]
		mov	[cs:cur_param],ax
		pop	si
		inc	si
		jmp	..@go_ahead
check_invlpg:
		cmp	byte [cpu_type],a486
		jae	invlpg_ok
		mov	dx,cdb
		jmp	bad_pm_command

analyze_386_inst:
		push	di
		push	es
		push	cs
		pop	es
		mov	di,table_386_loc
		mov	cx,T3_LENGTH
		cmp	byte [cs:cpu_type],a486
		jne	@@3
		mov	cx,T4_LENGTH
@@3:
	repne	scasb
		mov	bx,di
		pop	es
		pop	di
		jne	bad_pm_command
		sub	bx,table_386_loc+1
		add	bx,bx
		mov	dx,[cs:name_386+bx]
		mov	ax,[cs:param_386+bx]
		mov	[cs:cur_param],ax
		cmp	dx,bt_grp
		je	analyze_bt_grp
done_bt:
		pop	si
		inc	si
		mov	byte [cs:jcnear],1
		jmp	..@go_ahead
analyze_bt_grp:
		lodsb
		and	al,00111000b
		shr	al,1
		shr	al,1
		cbw
		mov	bx,ax
		mov	dx,[cs:bt_cmd+bx]
		jmp	done_bt
;=============================================================================
ext_table:
		db	60h
		dw	cpushad
		db	61h
		dw	cpopad
		db	6Dh
		dw	cinsd
		db	6Fh
		dw	coutsd
		db	98h
		dw	ccwde
		db	99h
		dw	ccdq
		db	9Ch
		dw	cpushfd
		db	9Dh
		dw	cpopfd
		db	0A5h
		dw	cmovsd
		db	0A7h
		dw	ccmpsd
		db	0ABh
		dw	cstosd
		db	0ADh
		dw	clodsd
		db	0AFh
		dw	cscasd
		db	0CFh
		dw	ciretd
		db	0
;=============================================================================
pm_commands:
		dw	csldt
		dw	cstr
		dw	clldt
		dw	cltr
		dw	cverr
		dw	cverw
		dw	cdb
		dw	cdb

		dw	csgdt
		dw	csidt
		dw	clgdt
		dw	clidt
		dw	csmsw
		dw	cdb
		dw	clmsw
		dw	cinvlpg

		; Skipped 2 words
		dw	clar
		dw	clsl
		dw	cdb
		dw	cloadall
		dw	cclts
		; Skipped 1 word
;=============================================================================
pm_param:
		db	arm16, aemp
		db	arm16, aemp
		db	arm16, aemp
		db	arm16, aemp
		db	arm16, aemp
		db	arm16, aemp
		db	ano, ano
		db	ano, ano

		db	arm16, aemp
		db	arm16, aemp
		db	arm16, aemp
		db	arm16, aemp
		db	arm16, aemp
		db	ano, ano
		db	arm16, aemp
		db	arm16, aemp

		; Skipped 2 words
		db	ar16rm, aemp
		db	ar16rm, aemp
		db	ano, ano
		db	ano, ano
		db	ano, ano
		; Skipped 1 word
;=============================================================================
bt_cmd:
		dw	cdb
		dw	cdb
		dw	cdb
		dw	cdb
		dw	cbt
		dw	cbts
		dw	cbtr
		dw	cbtc
;=============================================================================
table_386_loc:
		db	20h, 21h, 22h, 23h, 24h, 26h	; mov CR, DR, TR

		db	80h, 81h, 82h, 83h, 84h, 85h, 86h, 87h
		db	88h, 89h, 8Ah, 8Bh, 8Ch, 8Dh, 8Eh, 8Fh

		db	90h, 91h, 92h, 93h, 94h, 95h, 96h, 97h
		db	98h, 99h, 9Ah, 9Bh, 9Ch, 9Dh, 9Eh, 9Fh

		db	0A0h, 0A1h
		db	0A3h, 0A4h, 0A5h
		db	0A8h, 0A9h
		db	0ABh, 0ACh, 0ADh, 0AFh, 0B2h
		db	0B3h, 0B4h, 0B5h, 0B6h, 0B7h, 0BAh, 0BBh
		db	0BCh, 0BDh, 0BEh, 0BFh

T3_LENGTH	equ	$-table_386_loc
;=============================================================================
table_486_loc:
		db	08h, 09h, 0B0h, 0B1h, 0C0h, 0C1h
		db	0C8h, 0C9h, 0CAh, 0CBh, 0CCh, 0CDh, 0CEh, 0CFh

T4_LENGTH	equ	$-table_386_loc
;=============================================================================
name_386:
		dw	cmov
		dw	cmov
		dw	cmov
		dw	cmov
		dw	cmov
		dw	cmov

		dw	cjo
		dw	cjno
		dw	cjb
		dw	cjnb
		dw	cjz
		dw	cjnz
		dw	cjbe
		dw	cja
		dw	cjs
		dw	cjns
		dw	cjp
		dw	cjnp
		dw	cjl
		dw	cjge
		dw	cjle
		dw	cjg

		dw	cseto
		dw	csetno
		dw	csetb
		dw	csetae
		dw	csete
		dw	csetne
		dw	csetbe
		dw	cseta
		dw	csets
		dw	csetns
		dw	csetp
		dw	csetnp
		dw	csetl
		dw	csetge
		dw	csetle
		dw	csetg

		dw	cpush
		dw	cpop

		dw	cbt
		dw	cshld
		dw	cshld

		dw	cpush
		dw	cpop

		dw	cbts
		dw	cshrd
		dw	cshrd
		dw	cimul
		dw	clss
		dw	cbtr
		dw	clfs
		dw	clgs
		dw	cmovzx
		dw	cmovzx
		dw	bt_grp
		dw	cbtc
		dw	cbsf
		dw	cbsr
		dw	cmovsx
		dw	cmovsx
;=============================================================================
name_486:
		dw	cinvd
		dw	cwbinvd
		dw	ccmpxchg
		dw	ccmpxchg
		dw	cxadd
		dw	cxadd

		dw	cbswap
		dw	cbswap
		dw	cbswap
		dw	cbswap
		dw	cbswap
		dw	cbswap
		dw	cbswap
		dw	cbswap
;=============================================================================
param_386:
		db	r_cr, aemp
		db	r_dr, aemp
		db	cr_r, aemp
		db	dr_r, aemp
		db	r_tr, aemp
		db	tr_r, aemp

		db	anear, ano
		db	anear, ano
		db	anear, ano
		db	anear, ano
		db	anear, ano
		db	anear, ano
		db	anear, ano
		db	anear, ano
		db	anear, ano
		db	anear, ano
		db	anear, ano
		db	anear, ano
		db	anear, ano
		db	anear, ano
		db	anear, ano
		db	anear, ano

		db	arm8, ano
		db	arm8, ano
		db	arm8, ano
		db	arm8, ano
		db	arm8, ano
		db	arm8, ano
		db	arm8, ano
		db	arm8, ano
		db	arm8, ano
		db	arm8, ano
		db	arm8, ano
		db	arm8, ano
		db	arm8, ano
		db	arm8, ano

⌨️ 快捷键说明

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