📄 sdisassm.asm
字号:
@@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 + -