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

📄 asm.inc

📁 DOS下的调试工具
💻 INC
📖 第 1 页 / 共 3 页
字号:
@@r_i:
		mov	ch,ah
		call	add_word_flag
		jmp	@@make
..@_rm_im_ok:
		cmp	ax,ax
@@quit:
		ret
@@m_i:
		mov	ch,ah
;		or	al,1		;; WordFlag:=1
@@make:
		mov	dx,[parameter_2+AP_VALUE]
		mov	bl,[parameter_1+AP_WORD_FLAG]
		mov	cl,4
		call	check_byte
		jz	..@byte_imm
		or	dh,dh
		jz	..@byte_imm_2
		or	al,1
		cmp	bl,1
		jne	..@word_imm
jump_to_big_num_error:
		jmp	big_num_error
..@byte_imm_2:
		dec	cl
		cmp	bl,2
		jb	@@byte
		inc	cl
		or	al,1
		jmp	..@word_imm
..@byte_imm:
		dec	cl
		cmp	bl,2
		jb	@@byte
		or	al,3
		cmp	byte [mov_flag],0
		je	@@byte
		inc	cl
@@byte:
..@word_imm:
		mov	[di+1],al
		call	make_modrm	; al=md000r/m, ah=size of offset(0,1,2)
		shl	ch,1
		shl	ch,1
		shl	ch,1
		or	al,ch
		add	cl,ah
		mov	[di],cl
		mov	[di+2],al
		mov	bl,ah
		mov	bh,0
		mov	cx,[parameter_1+AP_VALUE]
		mov	[di+3],cx
		mov	[di+bx+3],dx
		jmp	..@_rm_im_ok
;=============================================================================
; _esc
;-----------------------------------------------------------------------------
_esc:
		cmp	byte [param_count],2
		jne	@@quit
		or	bl,bl
		jnz	@@quit
		cmp	cl,-1
		jne	@@quit
		mov	bl,ch
		cmp	bx,00ffh
		je	@@quit
		xchg	cl,ch
		call	swap_parameters
		call	make_modrm
		add	ah,2
		mov	[di],ah
		mov	dx,[parameter_2+AP_VALUE]
		cmp	dx,64
		jae	jump_to_big_num_error		;jump out of range
		mov	dh,dl
		and	dh,00111000b
		or	al,dh
		mov	[di+2],al
		mov	al,dl
		and	al,0111b
		or	al,0D8h
		mov	[di+1],al
		mov	dx,[parameter_1+AP_VALUE]
		mov	[di+3],dx
		cmp	ax,ax
		ret
@@quit:
		or	sp,sp
		ret
;=============================================================================
; _a_mem
;-----------------------------------------------------------------------------
_a_mem:
		cmp	byte [param_count],2
		jne	@@quit
		cmp	bx,0001h
		je	@@m_a
		cmp	bx,0100h
		jne	@@quit
		and	cl,0111b
		cmp	cl,regAL
		jne	@@quit
		cmp	word [parameter_2+AP_BX_FLAG],0
		jne	@@quit
		cmp	word [parameter_2+AP_SI_FLAG],0
		jne	@@quit
		mov	dx,[parameter_2+AP_VALUE]
@@make:
		call	add_word_flag
		mov	[di+1],al
		mov	byte [di],3
		mov	[di+2],dx
		cmp	ax,ax
		ret
@@m_a:
		and	ch,0111b
		cmp	ch,regAL
		jne	@@quit
		cmp	word [parameter_1+AP_BX_FLAG],0
		jne	@@quit
		cmp	word [parameter_1+AP_SI_FLAG],0
		jne	@@quit
		or	al,0010b
		mov	dx,[parameter_1+AP_VALUE]
		jmp	@@make
@@quit:
		ret
;=============================================================================
; _r_im
;-----------------------------------------------------------------------------
_r_im:
		cmp	byte [param_count],2
		jne	@@quit
		or	bx,bx
		jnz	@@not
		cmp	cl,-1
		jz	@@not
		cmp	ch,-1
		jnz	@@not
		or	al,cl
		mov	ah,3
		mov	dx,[parameter_2+AP_VALUE]
		test	al,1000b
		jnz	@@word
		dec	ah
		call	check_byte
		jz	@@word
		or	dh,dh
		jz	@@word
		jmp	big_num_error
@@word:
		mov	[di],ah
		mov	[di+1],al
		mov	[di+2],dx
		cmp	ax,ax
		ret
@@not:
		or	sp,sp
@@quit:
		ret
;=============================================================================
; _sr_rm
;-----------------------------------------------------------------------------
_sr_rm:
		cmp	byte [param_count],2
		jne	@@quit
		cmp	bx,0001h
		je	@@m_r
		cmp	bx,0100h
		je	@@r_m
		or	bx,bx
		jnz	@@quit
@@r_r:
		cmp	cl,-1
		je	@@quit
		cmp	ch,-1
		je	@@quit
		cmp	cl,10h
		jae	@@5
		cmp	ch,10h
		jae	@@m_s
		jmp	@@quit
@@5:
		cmp	ch,10h
		jb	@@s_m
		jmp	wrong_param
@@m_r:
		cmp	ch,-1
		je	@@quit
		cmp	ch,10h
		jb	@@quit
@@m_s:
		mov	[di+1],al
		call	make_modrm
		add	ah,2
		mov	[di],ah
		and	ch,0111b
		shl	ch,1
		shl	ch,1
		shl	ch,1
		or	al,ch
		mov	[di+2],al
		mov	dx,[parameter_1+AP_VALUE]
		mov	[di+3],dx

		cmp	ax,ax
		ret

@@r_m:
		cmp	cl,-1
		je	@@quit
		cmp	cl,10h
		jb	@@quit
@@s_m:
		or	al,2
		xchg	cl,ch
		call	swap_parameters
		jmp	@@m_s
@@quit:
		or	sp,sp
		ret
;=============================================================================
; _rm
;-----------------------------------------------------------------------------
_rm:
		cmp	byte [param_count],1
		jne	@@quit
		cmp	bl,1
		je	@@m
		cmp	cl,-1
		je	@@quit
@@m:
		mov	ch,ah
		call	add_word_flag
		mov	[di+1],al
		call	make_modrm
		shl	ch,1
		shl	ch,1
		shl	ch,1
		or	al,ch
		mov	[di+2],al
		add	ah,2
		mov	[di],ah
		mov	ax,[parameter_1+AP_VALUE]
		mov	[di+3],ax
		cmp	ax,ax
		ret
@@quit:
		or	sp,sp
		ret
;=============================================================================
; _a_reg
;-----------------------------------------------------------------------------
_a_reg:
		cmp	byte [param_count],2
		jne	@@quit
		or	bx,bx
		jnz	@@quit
		cmp	cl,regAX
		je	@@a_r
		cmp	ch,regAX
		je	@@r_a
@@quit:
		call	swap_parameters	;; Only for XCHG
		or	sp,sp
		ret
@@a_r:
		cmp	ch,-1
		je	@@quit
		jmp	@@ax_r
@@r_a:
		cmp	cl,-1
		je	@@quit
		xchg	cl,ch
@@ax_r:
		and	ch,0111b
		or	al,ch
		mov	byte [di],1
		mov	[di+1],al
		cmp	ax,ax
		ret
;=============================================================================
; _reg16
;-----------------------------------------------------------------------------
_reg16:
		cmp	byte [param_count],1
		jne	@@quit
		cmp	cl,-1
		je	@@quit
		test	cl,1000b
		jz	@@quit
		and	cl,0111b
		or	al,cl
		mov	byte [di],1
		mov	[di+1],al
		cmp	sp,sp
		ret
@@quit:
		or	sp,sp
		ret
;=============================================================================
; _sreg
;-----------------------------------------------------------------------------
_sreg:
		cmp	byte [param_count],1
		jne	@@quit
		cmp	cl,-1
		je	@@quit
		cmp	cl,10h
		jb	@@quit
		and	cl,0111b
		shl	cl,1
		shl	cl,1
		shl	cl,1
		or	al,cl
		mov	byte [di],1
		mov	[di+1],al
		cmp	ax,ax
		ret
@@quit:
		or	sp,sp
		ret
;=============================================================================
; _rm_cl_1
;-----------------------------------------------------------------------------
_rm_cl_1:
		cmp	bh,1
		je	@@quit
		cmp	ch,-1
		je	@@check_1
		cmp	ch,regCL
		jne	@@quit
		mov	cl,10b
		jmp	@@make
@@check_1:
		cmp	word [parameter_2+AP_VALUE],1
		jne	@@quit
		mov	cl,0
@@make:
		mov	ch,ah
		call	add_word_flag
		or	al,cl
		mov	[di+1],al
		call	make_modrm
		add	ah,2
		mov	[di],ah
		and	ch,0111b
		shl	ch,1
		shl	ch,1
		shl	ch,1
		or	al,ch
		mov	[di+2],al
		mov	dx,[parameter_1+AP_VALUE]
		mov	[di+3],dx
		cmp	ax,ax
		ret
@@quit:
		or	sp,sp
		ret
;=============================================================================
; _im8ch3
;-----------------------------------------------------------------------------
_im8ch3:
		call	_im8
		jnz	@@quit
		cmp	byte [di+2],3
		jne	@@quit_1
		mov	word [di],0cc01h
@@quit_1:
		cmp	ax,ax
@@quit:
		ret
;=============================================================================
; _im8
;-----------------------------------------------------------------------------
_im8:
		cmp	byte [param_count],1
		jne	@@quit
		cmp	bl,0
		jne	@@quit
		cmp	cl,-1
		jne	@@quit
		mov	dx,[parameter_1+AP_VALUE]
		cmp	dh,0
		jnz	@@quit
		mov	byte [di],2
		mov	[di+1],al
		mov	[di+2],dl
@@quit:
		ret
;=============================================================================
; _im16
;-----------------------------------------------------------------------------
_im16:
		cmp	byte [param_count],1
		jne	@@quit
		cmp	bl,0
		jne	@@quit
		cmp	cl,-1
		jne	@@quit
		mov	dx,[parameter_1+AP_VALUE]
		mov	byte [di],3
		mov	[di+1],al
		mov	[di+2],dx
@@quit:
		ret
;=============================================================================
; _imn
;-----------------------------------------------------------------------------
_imn:
		cmp	byte [param_count],0
		jne	@@quit
		mov	byte [di],2
		mov	[di+1],ax
@@quit:
		ret
;=============================================================================
; _a_dx
;-----------------------------------------------------------------------------
_a_dx:
		cmp	byte [param_count],2
		jne	@@quit
		test	cl,1000b
		jz	@@1
		or	al,1
@@1:
		and	cl,0111b
		cmp	cx,regAL + (regDX << 8)
		jne	@@quit
		mov	byte [di],1
		mov	[di+1],al
@@quit:
		ret
;=============================================================================
; _dx_a
;-----------------------------------------------------------------------------
_dx_a:
		cmp	byte [param_count],2
		jne	@@quit
		test	ch,1000b
		jz	@@1
		or	al,1
@@1:
		and	ch,0111b
		cmp	cx,regDX + (regAL << 8)
		jne	@@quit
		mov	byte [di],1
		mov	[di+1],al
@@quit:
		ret
;=============================================================================
; _a_im8
;-----------------------------------------------------------------------------
_a_im8:
		cmp	byte [param_count],2
		jne	@@quit
		or	bx,bx
		jnz	@@quit
		cmp	ch,-1
		jne	@@quit
		test	cl,1000b
		jz	@@1
		or	al,1
@@1:
		and	cl,0111b
		cmp	cl,regAL
		jne	@@quit
		mov	dx,[parameter_2+AP_VALUE]
		or	dh,dh
		jnz	@@quit
		mov	byte [di],2
		mov	[di+1],al
		mov	[di+2],dl
@@quit:
		ret
;=============================================================================
; _im8_a
;-----------------------------------------------------------------------------
_im8_a:
		cmp	byte [param_count],2
		jne	@@quit
		or	bx,bx
		jnz	@@quit
		cmp	cl,-1
		jne	@@quit
		test	ch,1000b
		jz	@@1
		or	al,1
@@1:
		and	ch,0111b
		cmp	ch,regAL
		jne	@@quit
		mov	dx,[parameter_1+AP_VALUE]
		or	dh,dh
		jnz	@@quit
		mov	byte [di],2
		mov	[di+1],al
		mov	[di+2],dl
@@quit:
		ret
;=============================================================================
; _short
;-----------------------------------------------------------------------------
_short:
		cmp	byte [jump_flag],1
		jne	@@quit
		cmp	byte [param_count],1
		jne	@@quit
		or	bl,bl
		jnz	@@quit
		cmp	cl,-1
		jnz	@@quit
		mov	dx,[parameter_1+AP_VALUE]

;		sub	dx,asm_offs
		sub	dx,[jump_origin_offs]

		sub	dx,2
		call	check_byte
		jnz	@@quit
		mov	byte [di],2
		mov	[di+1],al
		mov	[di+2],dl
@@quit:
		ret
;=============================================================================
; _near
;-----------------------------------------------------------------------------
_near:
		cmp	byte [jump_flag],1
		jne	@@quit
		cmp	byte [param_count],1
		jne	@@quit
		or	bl,bl
		jnz	@@quit
		cmp	cl,-1
		jnz	@@quit
		mov	dx,[parameter_1+AP_VALUE]

;		sub	dx,asm_offs
		sub	dx,[jump_origin_offs]

		sub	dx,3
		mov	byte [di],3
		mov	[di+1],al
		mov	[di+2],dx
		cmp	ax,ax
@@quit:
		ret
;=============================================================================
; _far
;-----------------------------------------------------------------------------
_far:
		cmp	byte [param_count],1
		jne	@@quit
		cmp	byte [jump_flag],2
		jne	@@quit
		mov	dx,[parameter_1+AP_VALUE]
		mov	cx,[far_value]
		mov	byte [di],5
		mov	[di+1],al
		mov	[di+2],cx
		mov	[di+4],dx
@@quit:
		ret
;=============================================================================
; _rmj
;-----------------------------------------------------------------------------
_rmj:
		cmp	byte [parameter_1+AP_WORD_FLAG],3
		jne	loc_rm
		inc	ah
loc_rm:
		jmp	_rm
;=============================================================================
; _dw
;-----------------------------------------------------------------------------
_dw:
		cmp	byte [param_count],1
		jne	@@quit
		or	bl,bl
		jnz	@@quit
		cmp	cl,-1
		jne	@@quit
		mov	ax,[parameter_1+AP_VALUE]
		mov	byte [di],2
		mov	[di+1],ax
@@quit:
		ret
;=============================================================================
; _noparam
;-----------------------------------------------------------------------------
_noparam:
		cmp	byte [param_count],0
		jne	@@quit
		mov	byte [di],1
		mov	[di+1],al
@@quit:
		ret
;=============================================================================
; add_word_flag
;-----------------------------------------------------------------------------
add_word_flag:
		mov	ah,[parameter_1+AP_WORD_FLAG]
		or	ah,ah
		jz	@@2
@@1:
		dec	ah
		or	al,ah
		ret
@@2:
		cmp	byte [param_count],1
		jbe	@@3
		mov	ah,[parameter_2+AP_WORD_FLAG]
		or	ah,ah
		jnz	@@1
@@3:
		ret
;=============================================================================
; swap_parameters
;-----------------------------------------------------------------------------
swap_parameters:
		push	ax
		push	cx
		push	si
		push	di
		mov	si,parameter_1
		mov	di,parameter_2
		mov	cx,SIZEOF_ASM_PARAM
@@next:
		lodsb
		xchg	al,[es:di]
		mov	[si-1],al
		inc	di
		loop	@@next
		pop	di
		pop	si
		pop	cx
		pop	ax
		ret
;=============================================================================
; check_byte
;-----------------------------------------------------------------------------
check_byte:
		push	ax
		mov	al,dl
		cbw
		cmp	ax,dx
		pop	ax
		ret
;=============================================================================
; 
;-----------------------------------------------------------------------------
; Makes MODRM byte for 1st parameter
; Returns: al=md000r/m, ah=offset size (0, 1 or 2)
make_modrm:
		push	bx
		push	cx
		push	dx
		mov	al,[parameter_1+AP_REG_NUMBER]
		cmp	al,-1
		je	@@mem
		and	al,0111b
		or	al,11000000b
;;		and	ch,0111b
;		shl	ch,1
;		shl	ch,1
;		shl	ch,1
;		or	al,ch
		mov	ah,0
		jmp	@@ok
@@mem:
		cmp	byte [parameter_1+AP_MEM_FLAG],0
		je	@@error
@@make_modrm:
		mov	bx,[parameter_1+AP_BX_FLAG]
		mov	cx,[parameter_1+AP_SI_FLAG]
		mov	dx,[parameter_1+AP_VALUE]
		push	bx
		or	bx,cx
		pop	bx
		jz	@@no_base_index
		or	bx,bx
		jz	@@no_base
		or	cx,cx
		jz	@@no_index
		mov	al,bh
		add	al,bh
		add	al,ch
		jmp	@@make_mod
@@no_base:
		mov	al,4
		add	al,ch
		jmp	@@make_mod
@@no_index:
		mov	al,6
		add	al,bl
		cmp	bh,1
		jne	@@make_mod
		mov	bl,2
		jmp	@@ch_byte
@@no_base_index:
		mov	al,0110b
		mov	ah,2
		jmp	@@ok
@@make_mod:
		mov	bl,2
		or	dx,dx
		jz	@@no_offs
@@ch_byte:
		call	check_byte
		jz	@@byte_offs
@@word_offs:
		inc	bl
@@byte_offs:
		inc	bl
@@no_offs:
		mov	[di],bl
		sub	bl,2
		mov	ah,bl
		ror	bl,1
		ror	bl,1
		or	al,bl
@@ok:
		clc
@@quit:
		pop	dx
		pop	cx
		pop	bx
		ret
@@error:
		stc
		jmp	@@quit
;=============================================================================

pref_codes	db	26h, 2Eh, 36h, 3Eh

cretn		db	'retn',0
csal		db	'sal',0
cjnae		db	'jnae',0
cjc		db	'jc',0
cjnc		db	'jnc',0
cjae		db	'jae',0
cje		db	'je',0
cjne		db	'jne',0
cjna		db	'jna',0
cjnbe		db	'jnbe',0
cjpe		db	'jpe',0
cjpo		db	'jpo',0
cjnge		db	'jnge',0
cjnl		db	'jnl',0
cjng		db	'jng',0
cjnle		db	'jnle',0
cloopz		db	'loopz',0
cloopnz		db	'loopnz',0
crepz		db	'repz',0
crepnz		db	'repnz',0
crepe		db	'repe',0
crepne		db	'repne',0
crep		db	'rep',0
cdw		db	'dw',0

curr_prefix	db	-1

;~Parameter1	AsmParam	<>
;~Parameter2	AsmParam	<>
parameter_1	db	-1, 0, 0, 0, 0, 0, 0, 0, 0
parameter_2	db	-1, 0, 0, 0, 0, 0, 0, 0, 0

;=============================================================================
; E0F
;=============================================================================


⌨️ 快捷键说明

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