📄 follow.inc
字号:
mov bp,bx
mov es,[unasm_seg]
mov di,@@follow_table - 2
cld
@@command:
call find_first_byte
jc @@jump_to_error_exit
cmp al,0ffh ;call/jmp mem/reg
je @@ref_jump
test byte [ref_flags],RF_PREFIX
jnz @@error_exit
cmp al,70h
jb @@next
cmp al,7fh
jbe @@short_condit_jump
@@next:
scasw ;add di,2
cmp byte [di],0
je @@error_exit
cmp byte [di],al
jne @@next
mov bl,[di+1]
mov bh,0
lea bx,[@@first_jump+bx]
jmp bx
@@first_jump:
@@ref_jump:
test byte [ref_flags],RF_32
jnz @@error_exit
es lodsb
mov bl,al
mov cl,3
shr al,cl
mov ah,al
and al,111b
cmp al,010b
@@jump_to_error_exit:
jb @@error_exit
cmp al,101b
ja @@error_exit
cmp al,011b
ja @@ref_call
mov di,@@last_jump
@@ref_call:
shr ah,cl
cmp ah,11b
je @@reg_ref
call calc_mem_address
mov es,dx
cmp byte [memory_flag],3
je @@far_jump
es lodsw
jmp @@set_cur_seg
@@reg_ref:
and bx,111b
shl bx,1
mov bx,[reg_offs_table+bx]
mov ax,[bx]
jmp @@set_cur_seg
@@condit_jump:
cmp byte [cpu_type],a386
jb @@error_exit
es lodsb
cmp al,80h
jb @@error_exit
cmp al,8Fh
jbe @@near_condit_jump
@@error_exit:
cmp bp,[cur_line_ip]
jne @@exit
and byte [ref_flags],~RF_FOLLOW
@@exit:
call popr
ret
@@short_condit_jump:
call @@set_condition
@@short_jump:
xor ax,ax
es lodsb
cbw
jmp @@near_jump_
@@near_return:
mov si,[cpu_regs+REG_SP]
mov es,[cpu_regs+REG_SS]
jmp @@near_jump
@@far_return:
mov si,[cpu_regs+REG_SP]
mov es,[cpu_regs+REG_SS]
jmp @@far_jump
@@int3:
mov ax,3*4
jmp @@get_vector
@@into:
mov ax,4*4
jmp @@get_vector
@@int:
xor ax,ax
es lodsb
shl ax,1
shl ax,1
@@get_vector:
xchg ax,si
xor ax,ax
mov es,ax
jmp @@far_jump
@@near_condit_jump:
call @@set_condition
@@near_jump:
es lodsw
@@near_jump_:
add ax,si
@@set_cur_seg:
mov dx,[unasm_seg]
jmp @@normal_exit
@@far_jump:
es lodsw
xchg ax,dx
es lodsw
xchg ax,dx
@@normal_exit:
cmp bp,[cur_line_ip]
jne @@skip
mov [follow_seg],dx
mov [follow_offs],ax
or byte [ref_flags],RF_FOLLOW
@@skip:
cmp di,@@last_jump
jae @@exit
or byte [ref_flags],RF_JUMP
call adjust_address
xchg ax,bx
xchg dx,cx
mov dx,[unasm_seg]
mov ax,bp
call adjust_address
cmp dx,cx
jb @@exit
ja @@set_dir
cmp ax,bx
jb @@jump_to_exit
@@set_dir:
or byte [ref_flags],RF_BACKWARD
@@jump_to_exit:
jmp @@exit
@@loop_jump:
sub al,0e0h-16
mov ah,0
call @@set_condition_
jmp @@short_jump
@@set_condition:
and ax,0fh
@@set_condition_:
or byte [ref_flags],RF_CONDITION
mov dx,ax
xchg ax,bx
mov bl,[@@condition_table+bx]
mov bh,0
add bx,@@jx
@@check_flag:
mov cx,[cpu_regs+REG_FL]
and cx,0000100011010101b
push cx
popf
call bx
mov ax,dx
ret
@@set_result:
or byte [ref_flags],RF_TRUE
@@return:
ret
@@jx:
@@loopne:
mov bx,@@jnz
jmp @@check_cx
@@loope:
mov bx,@@jz
jmp @@check_cx
@@loop:
mov bx,@@set_result
@@check_cx:
test byte [ref_flags],RF_OPERAND_32
jnz @@2
cmp word [cpu_regs+REG_CX],1
jmp @@1
@@2:
cpu 386
cmp dword [cpu_regs+REG_CX],1
cpu 8086
@@1:
je @@return
jmp @@check_flag
@@jcxz:
test byte [ref_flags],RF_OPERAND_32
jnz @@4
cmp word [cpu_regs+REG_CX],0
jmp @@3
@@4:
cpu 386
cmp dword [cpu_regs+REG_CX],0
cpu 8086
@@3:
je @@set_result
ret
@@jo:
jo @@set_result
ret
@@jno:
jno @@set_result
ret
@@jb:
jb @@set_result
ret
@@jnb:
jnb @@set_result
ret
@@jz:
jz @@set_result
ret
@@jnz:
jnz @@set_result
ret
@@jna:
jna @@set_result
ret
@@ja:
ja @@set_result
ret
@@js:
js @@set_result
ret
@@jns:
jns @@set_result
ret
@@jp:
jp @@set_result
ret
@@jnp:
jnp @@set_result
ret
@@jl:
jl @@set_result
ret
@@jnl:
jnl @@set_result
ret
@@jng:
jng @@set_result
ret
@@jg:
jg @@set_result
ret
@@follow_table:
db 0fh ;286+
db @@condit_jump - @@first_jump
db 0e0h ;loopne/loopnz
db @@loop_jump - @@first_jump
db 0e1h ;loope/loopz
db @@loop_jump - @@first_jump
db 0e2h ;loop
db @@loop_jump - @@first_jump
db 0e3h ;jcxz
db @@loop_jump - @@first_jump
db 0e9h ;jmp near
db @@near_jump - @@first_jump
db 0eah ;jmp far
db @@far_jump - @@first_jump
db 0ebh ;jmp short
db @@short_jump - @@first_jump
@@last_jump:
db 9ah ;call far
db @@far_jump - @@first_jump
db 0e8h ;call near
db @@near_jump - @@first_jump
db 0c2h ;ret near
db @@near_return - @@first_jump
db 0c3h ;ret near
db @@near_return - @@first_jump
db 0cah ;ret far
db @@far_return - @@first_jump
db 0cbh ;ret far
db @@far_return - @@first_jump
db 0cch ;int 3
db @@int3 - @@first_jump
db 0cdh ;int
db @@int - @@first_jump
db 0ceh ;into
db @@into - @@first_jump
db 0cfh ;iret
db @@far_return - @@first_jump
db 0
@@condition_table:
db @@jo - @@jx ;jo
db @@jno - @@jx ;jno
db @@jb - @@jx ;jb/jnae
db @@jnb - @@jx ;jae/jnb
db @@jz - @@jx ;je/jz
db @@jnz - @@jx ;jne/jnz
db @@jna - @@jx ;jbe/jna
db @@ja - @@jx ;ja/jnbe
db @@js - @@jx ;js
db @@jns - @@jx ;jns
db @@jp - @@jx ;jp/jpe
db @@jnp - @@jx ;jnp/jpo
db @@jl - @@jx ;jl/jnge
db @@jnl - @@jx ;jge/jnl
db @@jng - @@jx ;jle/jng
db @@jg - @@jx ;jg/jnle
db @@loopne- @@jx ;loopne
db @@loope - @@jx ;loope
db @@loop - @@jx ;loop
db @@jcxz - @@jx ;jcxz
reg_offs_table:
dw cpu_regs+REG_AX
dw cpu_regs+REG_CX
dw cpu_regs+REG_DX
dw cpu_regs+REG_BX
dw cpu_regs+REG_SP
dw cpu_regs+REG_BP
dw cpu_regs+REG_SI
dw cpu_regs+REG_DI
;=============================================================================
; adjust_address
;-----------------------------------------------------------------------------
adjust_address:
push ax
shr ax,1
shr ax,1
shr ax,1
shr ax,1
add dx,ax
pop ax
and ax,000fh
ret
;=============================================================================
; set_direction
;-----------------------------------------------------------------------------
set_direction:
call pushr
test byte [ref_flags],RF_JUMP
jz @@exit
cld
mov si,buffer + BUF_SIZE ;-offset
@@next_char:
dec si
cmp byte [si],' '
je @@next_char
mov di,si
push ds
pop es
scasw
mov al,18h
test byte [ref_flags],RF_BACKWARD
jnz @@check_condition
mov al,19h
@@check_condition:
test byte [ref_flags],RF_CONDITION
jz @@set_direction
test byte [ref_flags],RF_TRUE
jnz @@set_direction
add al,1Eh-18h
@@set_direction:
stosb
@@exit:
call popr
ret
;=============================================================================
; display_code_marks
;-----------------------------------------------------------------------------
display_code_marks:
call pushr
xchg ax,bp
mov ah,al
mov al,CPU_WIDTH-1
call get_addr
push ax
mov cx,10
mov bp,code_mark_buff
mov di,1
@@next_mark:
test [code_mark_exist],di
jz @@next
cmp word [bp],0ffffh
je @@next
mov ax,[bp+6]
mov dx,[bp+4]
call adjust_address
push bx
xchg ax,bx
mov si,[unasm_seg]
xchg dx,si
call adjust_address
cmp ax,bx
pop bx
jne @@next
mov ax,atCodeMark*256+'0'+10
sub al,cl
cmp dx,si
je @@write
@@next:
shl di,1
add bp,4*2
loop @@next_mark
mov ax,atCodeMark*256+' '
@@write:
pop di
stosw
call popr
ret
;=============================================================================
; E0F
;=============================================================================
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -