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