📄 unasm.inc
字号:
;=============================================================================
; 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 + -