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

📄 sdisassm.asm

📁 开放源码的编译器open watcom 1.6.0版的源代码
💻 ASM
📖 第 1 页 / 共 4 页
字号:
@@l01e:	movzx	ebx,cl			; get base register
	lea	edx,_regtab32[ebx*4]
	call	put_string
	mov	edx,_registers[ebx*4]
	add	__temp_addr,edx
	cmp	ch,04h			; when index=100b, no index is present
	jz	@@l01a
@@l01d:	call	put_plus
@@l01v:	movzx	ebx,ch			; get index register
	lea	edx,_regtab32[ebx*4]
	call	put_string
	mov	edx,_registers[ebx*4]
	mov	cl,ah
	shl	edx,cl
	add	__temp_addr,edx
	test	ah,ah
	jz	@@l01a
	call	make_indexah
@@l01a:	mov	eax,__temp_addr
	call	put_commaddr
	call	put_close
	pop	ecx
	ret
@@l02:	movzx	ebx,cl
	lea	edx,_regtab32[ebx*4]
	call	put_string
	mov	eax,_registers[ebx*4]
	call	put_commaddr
	jmp	put_close
;---------------------------------------------------------------------------
@@l1:	cmp	cl,04h		; if s-i-b, do   [reg+reg*index+disp8]
	jnz	@@l10		; no sib, jump
	push	ecx
	call	put_textal
	call	decode_mode
	movzx	ebx,cl
	cmp	cl,4
	jz	@@__1
	cmp	cl,5
@@__1:	setz	_prefix_esp		; reference to SS:[ xxx ]
	lea	edx,_regtab32[ebx*4]	; get base register
	call	put_string
	mov	edx,_registers[ebx*4]
	add	__temp_addr,edx
	cmp	ch,04h			; when index=100b, no index is present
	jz	@@l11a
	call	put_plus
	movzx	ebx,ch
	lea	edx,_regtab32[ebx*4]	; get index register
	call	put_string
	mov	edx,_registers[ebx*4]
	mov	cl,ah
	shl	edx,cl
	add	__temp_addr,edx
	test	ah,ah
	jz	@@l11a
	call	make_indexah
@@l11a:	call	put_textal
	movsx	edx,al
	add	__temp_addr,edx
	test	al,al
	jz	@@l11d
	js	@@l11b
	call	put_plus
	jmp	@@l11c
@@l11b:	call	put_minus
	neg	al
@@l11c:	call	makehexal
@@l11d:	mov	eax,__temp_addr
	call	put_commaddr
	call	put_close
	pop	ecx
	ret
@@l10:	movzx	ebx,cl
	cmp	cl,5
	setz	_prefix_esp		; reference to SS:[ xxx ]
	lea	edx,_regtab32[ebx*4]
	call	put_string
	mov	edx,_registers[ebx*4]
	add	__temp_addr,edx
	call	put_textal
	movsx	edx,al
	add	__temp_addr,edx
	test	al,al
	jz	@@l10d
	js	@@l10b
	call	put_plus
	jmp	@@l10c
@@l10b:	call	put_minus
	neg	al
@@l10c:	call	makehexal
@@l10d:	mov	eax,__temp_addr
	call	put_commaddr
	jmp	put_close
;---------------------------------------------------------------------------
@@l2:	cmp	cl,04h			; s-i-b   [reg+reg*index+disp32]
	jnz	@@l20
	push	ecx
	call	put_textal
	call	decode_mode
	movzx	ebx,cl
	cmp	cl,4
	jz	@@__2
	cmp	cl,5
@@__2:	setz	_prefix_esp		; reference to SS:[ xxx ]
	lea	edx,_regtab32[ebx*4]	; get base
	call	put_string
	mov	edx,_registers[ebx*4]
	add	__temp_addr,edx
	cmp	ch,04h			; when index=100b, no index is present
	jz	@@l21a
	call	put_plus
	movzx	ebx,ch
	lea	edx,_regtab32[ebx*4]	; get index
	call	put_string
	mov	edx,_registers[ebx*4]
	mov	cl,ah
	shl	edx,cl
	add	__temp_addr,edx
	test	ah,ah
	jz	@@l21a
	call	make_indexah
@@l21a:	call	put_texteax
	add	__temp_addr,eax
	test	eax,eax
	jz	@@l21d
	js	@@l21b
	call	put_plus
	jmp	@@l21c
@@l21b:	call	put_minus
	neg	eax
@@l21c:	call	makehexdword
@@l21d:	mov	eax,__temp_addr
	call	put_commaddr
	call	put_close
	pop	ecx
	ret
@@l20:	movzx	ebx,cl
	cmp	cl,5
	setz	_prefix_esp		; reference to SS:[ xxx ]
	lea	edx,_regtab32[ebx*4]
	call	put_string
	mov	edx,_registers[ebx*4]
	add	__temp_addr,edx
	call	put_texteax
	add	__temp_addr,eax
	test	eax,eax
	jz	@@l20d
	js	@@l20b
	call	put_plus
	jmp	@@l20c
@@l20b:	call	put_minus
	neg	eax
@@l20c:	call	makehexdword
@@l20d:	mov	eax,__temp_addr
	call	put_commaddr
	jmp	put_close
;---------------------------------------------------------------------------
@@l3:	movzx	ebx,cl			; mod=11	register only
	lea	edx,[ebp+ebx*4]
	jmp	put_string


decode_by_mod86:
	cmp	ah,03h
	jz	@@l3			; mod=11
	call	put_prefix
	call	put_open
	cmp	ah,02h
	jz	@@l2			; mod=10
	cmp	ah,01h
	jz	@@l1			; mod=01
;---------------------------------------------------------------------------
	cmp	cl,06h			; [ addr ],reg
	jnz	@@l01
	call	put_textax
	call	makehexax
	call	put_commaddr
	jmp	put_close
@@l01:	movzx	ebx,cl
	lea	edx,_regtab86[ebx*8]
	call	put_string
	call	@@d86
	mov	eax,__temp_addr
	call	put_commaddr
	jmp	put_close
;---------------------------------------------------------------------------
@@l1:	movzx	ebx,cl
	lea	edx,_regtab86[ebx*8]
	call	put_string
	call	@@d86
	call	put_textal
	movsx	dx,al
	add	wptr __temp_addr,dx
	test	al,al
	js	@@l11
	call	put_plus
	jmp	@@l12
@@l11:	call	put_minus
	neg	al
@@l12:	call	makehexal
	mov	eax,__temp_addr
	call	put_commaddr
	jmp	put_close
;---------------------------------------------------------------------------
@@l2:	movzx	ebx,cl
	lea	edx,_regtab86[ebx*8]
	call	put_string
	call	@@d86
	call	put_textax
	add	wptr __temp_addr,ax
	test	ax,ax
	js	@@l21
	call	put_plus
	jmp	@@l22
@@l21:	call	put_minus
	neg	ax
@@l22:	call	makehexax
	mov	eax,__temp_addr
	call	put_commaddr
	jmp	put_close
;---------------------------------------------------------------------------
@@l3:	movzx	ebx,cl			; mod=11	// register
	lea	edx,[ebp+ebx*4]
	jmp	put_string
@@d86:	movzx	ebx,cl
	and	ebx,07h
	jmp	_r86tab[ebx*4]
_r86c0:	mov	dx,_bx
	add	dx,_si
	add	wptr __temp_addr,dx
	ret
_r86c1:	mov	dx,_bx
	add	dx,_di
	add	wptr __temp_addr,dx
	ret
_r86c2:	mov	dx,_bp
	add	dx,_si
	add	wptr __temp_addr,dx
	ret
_r86c3:	mov	dx,_bp
	add	dx,_di
	add	wptr __temp_addr,dx
	ret
_r86c4:	mov	dx,_si
	add	wptr __temp_addr,dx
	ret
_r86c5:	mov	dx,_di
	add	wptr __temp_addr,dx
	ret
_r86c6:	mov	dx,_bp
	add	wptr __temp_addr,dx
	ret
_r86c7:	mov	dx,_bx
	add	wptr __temp_addr,dx
	ret

;---------------------------------------------------------------------------
decode_by_reg:
	movzx	ebx,ch
	lea	edx,[ebp+ebx*4]
	jmp	put_string

;---------------------------------------------------------------------------
decode_by_grp:
	call	load_byte
	mov	ah,al
	shr	al,3
	and	al,7			; ch = mask reg field
	movzx	ebx,al
	mov	edx,[ebp+ebx*4]
	jmp	put_string

;---------------------------------------------------------------------------
check_jump:
	pushfd
	push	eax edx
	and	eax,0Fh
	mov	edx,cs:_jumptbl[eax*4]
	pushfd
	and	dptr [esp],0FFFFF700h
	mov	eax,_efl
	and	eax,000008FFh
	or	[esp],eax
	popfd
	jmp	edx
_jump_end:
	pop	edx eax
	popfd
	ret

_jumptbl	dd _jump_jo, _jump_jno, _jump_jb, _jump_jnb
		dd _jump_jz, _jump_jnz, _jump_jbe, _jump_jnbe
		dd _jump_js, _jump_jns, _jump_jp, _jump_jnp
		dd _jump_jl, _jump_jnl, _jump_jle, _jump_jnle

_jump_jo:
	jo	@@0
	mov	_jump_taken,0
	jmp	_jump_end
@@0:	mov	_jump_taken,1
	jmp	_jump_end
_jump_jno:
	jno	@@0
	mov	_jump_taken,0
	jmp	_jump_end
@@0:	mov	_jump_taken,1
	jmp	_jump_end
_jump_jb:
	jb	@@0
	mov	_jump_taken,0
	jmp	_jump_end
@@0:	mov	_jump_taken,1
	jmp	_jump_end
_jump_jnb:
	jnb	@@0
	mov	_jump_taken,0
	jmp	_jump_end
@@0:	mov	_jump_taken,1
	jmp	_jump_end
_jump_jz:
	jz	@@0
	mov	_jump_taken,0
	jmp	_jump_end
@@0:	mov	_jump_taken,1
	jmp	_jump_end
_jump_jnz:
	jnz	@@0
	mov	_jump_taken,0
	jmp	_jump_end
@@0:	mov	_jump_taken,1
	jmp	_jump_end
_jump_jbe:
	jbe	@@0
	mov	_jump_taken,0
	jmp	_jump_end
@@0:	mov	_jump_taken,1
	jmp	_jump_end
_jump_jnbe:				; (ja)
	jnbe	@@0
	mov	_jump_taken,0
	jmp	_jump_end
@@0:	mov	_jump_taken,1
	jmp	_jump_end
_jump_js:
	js	@@0
	mov	_jump_taken,0
	jmp	_jump_end
@@0:	mov	_jump_taken,1
	jmp	_jump_end
_jump_jns:
	jns	@@0
	mov	_jump_taken,0
	jmp	_jump_end
@@0:	mov	_jump_taken,1
	jmp	_jump_end
_jump_jp:
	jp	@@0
	mov	_jump_taken,0
	jmp	_jump_end
@@0:	mov	_jump_taken,1
	jmp	_jump_end
_jump_jnp:
	jnp	@@0
	mov	_jump_taken,0
	jmp	_jump_end
@@0:	mov	_jump_taken,1
	jmp	_jump_end
_jump_jl:
	jl	@@0
	mov	_jump_taken,0
	jmp	_jump_end
@@0:	mov	_jump_taken,1
	jmp	_jump_end
_jump_jnl:				; (jge)
	jnl	@@0
	mov	_jump_taken,0
	jmp	_jump_end
@@0:	mov	_jump_taken,1
	jmp	_jump_end
_jump_jle:
	jle	@@0
	mov	_jump_taken,0
	jmp	_jump_end
@@0:	mov	_jump_taken,1
	jmp	_jump_end
_jump_jnle:				; (jg)
	jnle	@@0
	mov	_jump_taken,0
	jmp	_jump_end
@@0:	mov	_jump_taken,1
	jmp	_jump_end




;*****************************************************************************
;=============================================================================
_type_EbGb:					; addr8 , reg8
	call	put_tab
	call	put_textal
	call	decode_mode
	mov	ebp,offs _regtab8
	call	decode_by_mod
	call	put_memb
	call	put_comma
	jmp	decode_by_reg
_type_GbEb:					; reg8 , addr8
	call	put_tab
	call	put_textal
	call	decode_mode
	mov	ebp,offs _regtab8
	call	decode_by_reg
	call	put_comma
	call	decode_by_mod
	jmp	put_memb
_type_EvGv:					; addr16/32 , reg16/32
	call	put_tab
	call	put_textal
	call	decode_mode
	cmp	_opsiz,0
	jz	@@l1
	mov	ebp,offs _regtab16
	call	decode_by_mod
	call	put_memw
	call	put_comma
	jmp	decode_by_reg
@@l1:	mov	ebp,offs _regtab32
	call	decode_by_mod
	call	put_memd
	call	put_comma
	jmp	decode_by_reg
_type_GvEv:					; reg16/32 , addr16/32
	call	put_tab
	call	put_textal
	call	decode_mode
	cmp	_opsiz,0
	jz	@@l1
	mov	ebp,offs _regtab16
	call	decode_by_reg
	call	put_comma
	call	decode_by_mod
	jmp	put_memw
@@l1:	mov	ebp,offs _regtab32
	call	decode_by_reg
	call	put_comma
	call	decode_by_mod
	jmp	put_memd
_type_GvEb:					; reg16/32 , addr8
	call	put_tab
	call	put_textal
	call	decode_mode
	cmp	_opsiz,0
	mov	ebp,offs _regtab16
	jnz	@@l1
	mov	ebp,offs _regtab32
@@l1:	call	decode_by_reg
	call	put_comma
	mov	ebp,offs _regtab8
	call	decode_by_mod
	jmp	put_memb
_type_GvEw:					; reg16/32 , addr16
	call	put_tab
	call	put_textal
	call	decode_mode
	cmp	_opsiz,0
	mov	ebp,offs _regtab16
	jnz	@@l1
	mov	ebp,offs _regtab32
@@l1:	call	decode_by_reg
	call	put_comma
	mov	ebp,offs _regtab16
	call	decode_by_mod
	jmp	put_memw
_type_EwSw:					; reg , segment
	call	put_tab
	call	put_textal
	call	decode_mode
	mov	ebp,offs _regtab16
	call	decode_by_mod
	call	put_memw
	call	put_comma
	mov	ebp,offs _segtab86
	jmp	decode_by_reg
_type_SwEw:					; segment , reg
	call	put_tab
	call	put_textal
	call	decode_mode
	mov	ebp,offs _segtab86
	call	decode_by_reg
	call	put_comma
	mov	ebp,offs _regtab16
	call	decode_by_mod
	jmp	put_memw


;----------------------------------
_type_ALIb:					; AL , imm8
	call	put_tab
	mov	edx,offs _regtab8
	call	put_string
	call	put_comma
	call	put_textal
	call	makehexal
	jmp	put_charh
_type_eAXIb:					; eAX , imm8	***IN
	call	put_tab
	cmp	_opsiz,0
	mov	edx,offs _regtab16
	jnz	@@l1
	mov	edx,offs _regtab32
@@l1:	call	put_string
	call	put_comma
	call	put_textal
	call	makehexal
	jmp	put_charh
_type_eAXIv:					; eAX , imm16/32
	call	put_tab
	cmp	_opsiz,0
	jz	@@l1
	mov	edx,offs _regtab16
	call	put_string
	call	put_comma
	call	put_textax
	call	makehexax
	jmp	put_charh
@@l1:	mov	edx,offs _regtab32
	call	put_string
	call	put_comma
	call	put_texteax
	call	makehexdword
	jmp	put_charh
_type_IbAL:					; imm8 , AL	***OUT
	call	put_tab
	call	put_textal
	call	makehexal
	call	put_charh
	call	put_comma
	mov	edx,offs _regtab8
	jmp	put_string
_type_IbeAX:					; imm8 , eAX	***OUT
	call	put_tab
	call	put_textal
	call	makehexal
	call	put_charh
	call	put_comma
	cmp	_opsiz,0
	mov	edx,offs _regtab16
	jnz	@@l1
	mov	edx,offs _regtab32
@@l1:	jmp	put_string



;----------------------------------
_type_EbIb:					; addr8 , imm8
	call	put_tab
	call	put_textal
	call	decode_mode
	mov	ebp,offs _regtab8
	call	decode_by_mod
	call	put_memb
	call	put_comma
	call	put_textal
	call	makehexal
	jmp	put_charh
_type_EvIb:					; addr16/32 , imm8
	call	put_tab
	call	put_textal
	call	decode_mode
	cmp	_opsiz,0
	jz	@@l1
	mov	ebp,offs _regtab16
	call	decode_by_mod
	call	put_memw
	call	put_comma
	call	put_textal
	movsx	eax,al
	call	makehexax
	jmp	put_charh
@@l1:	mov	ebp,offs _regtab32
	call	decode_by_mod
	call	put_memd
	call	put_comma
	call	put_textal
	movsx	eax,al
	call	makehexdword
	jmp	put_charh
_type_EvIv:					; addr16/32 , imm16/32
	call	put_tab
	call	put_textal
	call	decode_mode
	cmp	_opsiz,0
	jz	@@l1
	mov	ebp,offs _regtab16
	call	decode_by_mod
	call	put_memw
	call	put_comma
	call	put_textax
	call	makehexax
	jmp	put_charh
@@l1:	mov	ebp,offs _regtab32
	call	decode_by_mod
	call	put_memd
	call	put_comma
	call	put_texteax
	call	makehexdword
	jmp	put_charh



;----------------------------------
_type_ALOb:					; AL , offs16/32
	call	put_tab
	mov	edx,offs _regtab8
	call	put_string
	call	put_comma

⌨️ 快捷键说明

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