📄 operands.asm
字号:
push edi
mov al,[di+OPERAND.THEREG]
push ax
xchg si,di
mov si,offset stsreg
call strcpy
pop ax
add al,'0'
dec di
stosb
mov al,')'
stosb
sub al,al
stosb
dec di
xchg si,di
pop edi
ret
GetST ENDP
GetStdReg PROC
push edi
or al,al
jnz short gsrnoe
mov BYTE PTR [si],'e'
inc si
gsrnoe:
mov di,offset regs
movzx edi,di
movzx ecx,cx
mov ax,[edi+ecx *2]
mov [si],al
inc si
mov [si],ah
inc si
mov BYTE PTR [si],0
pop edi
ret
GetStdReg ENDP
GetReg PROC
movzx cx,al
sub al,al
inc al
bt [di+OPERAND.OEFLAGS],OMF_BYTE
jc short grno32
bt [di+OPERAND.OEFLAGS],OMF_OP32
jnc short grno32
dec al
grno32:
bt [di+OPERAND.OEFLAGS],OMF_BYTE
jc short isbyte
or cl,8
isbyte:
call GetStdReg
ret
GetReg ENDP
GetSpecial PROC
mov al,[bx]
mov [si],al
inc si
inc bx
mov al,[bx]
mov [si],al
inc si
inc bx
movzx eax,[di+OPERAND.THEREG]
movzx ebx,bx
mov al,[ebx +eax]
mov [si],al
inc si
mov BYTE PTR [si],0
ret
GetSpecial ENDP
GetSeg PROC
push edi
push ax
mov di,offset psegs
movzx edi,di
movzx ecx,cx
mov ax,[edi+ecx *2]
mov [si],al
inc si
mov [si],ah
inc si
pop ax
or al,al
mov al,':'
jz short nocolon
mov [si],al
inc si
nocolon:
mov BYTE PTR [si],0
pop edi
ret
GetSeg ENDP
SegOverride PROC
mov al,1
sub cx,cx
test [segs],SG_ES
jz short so_testcs
call GetSeg
so_testcs:
inc cx
test [segs],SG_CS
jz short so_testss
call GetSeg
so_testss:
inc cx
test [segs],SG_SS
jz short so_testds
call GetSeg
so_testds:
inc cx
test [segs],SG_DS
jz short so_testfs
call GetSeg
so_testfs:
inc cx
test [segs],SG_FS
jz short so_testgs
call GetSeg
so_testgs:
inc cx
test [segs],SG_GS
jz short so_done
call GetSeg
so_done:
mov [segs],0
ret
SegOverride ENDP
Scaled PROC
push DWORD PTR [di+OPERAND.OEFLAGS]
btr [di+OPERAND.OEFLAGS],OMF_BYTE
bts [di+OPERAND.OEFLAGS],OMF_OP32
or al,al
jz short notbased
sub al,al
mov al,[di+OPERAND.THEREG]
call GetReg
notbased:
bt [di+OPERAND.OEFLAGS],OMF_SCALED
jnc short notscaled2
mov byte ptr [si],'+'
inc si
mov al,[di+OPERAND.SCALEREG]
call GetReg
movzx cx,[di+OPERAND.SCALE]
or cx,cx
jz notscaled2
add cx,cx
add cx,offset scales
movzx ecx,cx
mov ax,[ecx]
call put2
notscaled2:
pop DWORD PTR [di+OPERAND.OEFLAGS]
ret
Scaled ENDP
FOM_FSTREG PROC
mov di,offset stalone
call strcat
ret
FOM_FSTREG ENDP
FOM_CRX PROC
mov bx,offset crreg
call GetSpecial
ret
FOM_CRX ENDP
FOM_DRX PROC
mov bx,offset drreg
call GetSpecial
ret
FOM_DRX ENDP
FOM_TRX PROC
mov bx,offset trreg
call GetSpecial
ret
FOM_TRX ENDP
FOM_SUD PROC
mov bx,offset sudreg
call GetSpecial
ret
FOM_SUD ENDP
FOM_PORT PROC
mov al,SY_PORT
jmp FormatValue
FOM_PORT ENDP
FOM_INT PROC
mov al,SY_INTR
jmp FormatValue
FOM_INT ENDP
FOM_SHIFT PROC
bt [di+OPERAND.OEFLAGS],OMF_CL
jnc fos_notcl
mov ax,"cl"
call put2
ret
fos_notcl:
cmp [di+OPERAND.ADDRESS],1
mov al,SY_SHIFT
jnz FormatValue
mov BYTE PTR [si],'1'
inc si
mov BYTE PTR [si],0
ret
FOM_SHIFT ENDP
FOM_RETURN PROC
mov al,SY_RETURN
jmp FormatValue
FOM_RETURN ENDP
FOM_SHORTBRANCH PROC
mov al,SY_SHORTBRANCH
jmp FormatValue
FOM_SHORTBRANCH ENDP
FOM_LONGBRANCH PROC
mov al,SY_LONGBRANCH
jmp FormatValue
FOM_LONGBRANCH ENDP
FOM_FARBRANCH PROC
mov al,SY_SEGMENT
call FormatValue
mov BYTE PTR [si],':'
inc si
mov al,SY_ABSBRANCH
jmp FormatValue
FOM_FARBRANCH ENDP
FOM_ABSOLUTE PROC
call DoreqsPtrSizeOvride
call SegOverride
mov BYTE PTR [si],'['
inc si
mov BYTE PTR [si],0
bt [di+OPERAND.OEFLAGS],OMF_SCALED
jnc foa_notscaled
mov al,SY_WORDOFS
call FormatValue
sub ax,ax
call Scaled
jmp short foa_finish
foa_notscaled:
mov al,SY_ABSOLUTE
call FormatValue
foa_finish:
mov BYTE PTR [si],']'
inc si
mov BYTE PTR [si],0
ret
FOM_ABSOLUTE ENDP
FOM_IMMEDIATE PROC
bt [di+OPERAND.OEFLAGS],OMF_BYTE
mov al,SY_WORDIMM
jnc short absformat
test [optsignedimm],1
jnz fi_signed
push ebx
movzx ebx,byte ptr [di + OPERAND.ADDRESS]
mov [di + OPERAND.ADDRESS],ebx
pop ebx
jmp FormatValue
fi_signed:
mov al,SY_BYTEOFS
bt [di+OPERAND.OEFLAGS],OMF_SIGNED
jnc short absformat
mov al,SY_SIGNEDIMM
test [optsignedimm],1
jnz absformat
movsx eax,byte ptr [di + OPERAND.ADDRESS]
mov [di + OPERAND.ADDRESS],eax
mov al,SY_WORDIMM
absformat:
jmp FormatValue
FOM_IMMEDIATE ENDP
FOM_REG PROC
bt [di+OPERAND.OEFLAGS],OMF_FST
jnc short foreg
call GetST
ret
foreg:
mov al,[di+OPERAND.THEREG]
call GetReg
ret
FOM_REG ENDP
FOM_BASED PROC
call DoreqsPtrSizeOvride
call SegOverride
mov BYTE PTR [si],'['
inc si
mov BYTE PTR [si],0
bt [di+OPERAND.OEFLAGS],OMF_ADR32
jnc fob_notscaled
mov al,1
call scaled
jmp short fob2
fob_notscaled:
push di
push si
movzx eax,BYTE PTR [di+OPERAND.THEREG]
xchg si,di
mov si,offset based
movzx esi,si
movzx ecx,cx
mov si,[esi+eax * 2]
call strcpy
pop si
pop di
call strlen
add si,ax
fob2:
test [di+OPERAND.OEFLAGS],OMF_OFFSET
jz short fob_noofs
bt [di+OPERAND.OEFLAGS],OMF_SIGNED_OFFSET
mov al,SY_SIGNEDOFS
jc fob_format
mov al,SY_WORDOFS
bt [di+OPERAND.OEFLAGS],OMF_WORD_OFFSET
jc fob_format
mov al,SY_BYTEOFS
fob_format:
call FormatValue
fob_noofs:
mov BYTE PTR [si],']'
inc si
mov BYTE PTR [si],0
ret
FOM_BASED ENDP
FOM_SEGMENT PROC
movzx cx,[di+OPERAND.THEREG]
sub ax,ax
call GetSeg
ret
FOM_SEGMENT ENDP
PutOperand PROC
call strlen
add si,ax
mov al,[di+OPERAND.CODE]
dec al
js short po_none
push 0
call TableDispatch
dw 17
dw fom_based
dw fom_segment
dw fom_reg
dw fom_immediate
dw fom_absolute
dw fom_farbranch
dw fom_longbranch
dw fom_shortbranch
dw fom_return
dw fom_shift
dw fom_int
dw fom_port
dw fom_sud
dw 0
dw fom_trx
dw fom_drx
dw fom_crx
dw fom_fstreg
po_none:
ret
PutOperand ENDP
FormatDisassembly PROC
ENTER 256,0
push si
lea di,[bp-256]
mov BYTE PTR [di],0
test [segs],SG_REPZ
push di
jz fd_notrepz
mov si,offset st_repz
call strcpy
fd_notrepz:
test [segs],SG_REPNZ
jz fd_notrepnz
mov si,offset st_repnz
call strcpy
fd_notrepnz:
pop di
xchg si,di
call strlen
add si,ax
xchg si,di
mov si,offset nmmnemonic
call strcat
lea si,[bp-256]
sub ax,ax
mov al,TAB_ARGPOS
call TabTo
mov di,offset dest
call PutOperand
mov di,offset source
test [di+OPERAND.CODE],-1
jz short nosource
mov BYTE PTR [si],','
inc si
mov BYTE PTR [si],0
call PutOperand
nosource:
mov di,offset extraoperand
test [di+OPERAND.CODE],-1
jz short noextra
mov BYTE PTR [si],','
inc si
mov BYTE PTR [si],0
call PutOperand
noextra:
pop si
mov BYTE PTR [si],0
call SegOverride
mov di,si
lea si,[bp-256]
call strcat
LEAVE
ret
FormatDisassembly ENDP
putdword:
push eax ; To print a dword
shr eax,16 ; Print the high 16 bits
call putword
pop eax ; And the low 16 bits
putword:
push ax ; To print a word
mov al,ah ; Print the high byte
call putbyte
pop ax ; And the low byte
putbyte:
push ax ; To print a byte
shr ax,4 ; Print the high nibble
call putnibble
pop ax ; And the low nibble
putnibble:
and al,0fh ; Get a nibble
add al,'0' ; Make it numeric
cmp al,'9' ; If supposed to be alphabetic
jle onib
add al,7 ; Add 7
onib:
mov [si],al
inc si
ret
putwordox:
bt [di+OPERAND.OEFLAGS],OMF_OP32
jnc putword
jmp putdword
putwordax:
bt [di+OPERAND.OEFLAGS],OMF_ADR32
jnc putword
jmp putdword
FSY_SIGNEDOFS PROC
push bx
mov eax,[di+OPERAND.ADDRESS]
bt eax,7
mov bl,'+'
jnc fso_pos
mov bl,'-'
neg al
fso_pos:
mov byte ptr [si],bl
inc si
call putbyte
pop bx
ret
FSY_SIGNEDOFS ENDP
FSY_WORDOFS PROC
push bx
mov eax,[di+OPERAND.ADDRESS]
cmp ax,-4000h
mov bl,'+'
jc fsy_wouseplus
neg ax
mov bl,'-'
fsy_wouseplus:
mov byte ptr [si],bl
inc si
call putwordax
pop bx
ret
FSY_WORDOFS ENDP
FSY_BYTEOFS PROC
mov eax,[di+OPERAND.ADDRESS]
call putbyte
ret
FSY_BYTEOFS ENDP
FSY_ABSOLUTE PROC
mov eax,[di+OPERAND.ADDRESS]
call putwordax
ret
FSY_ABSOLUTE ENDP
FSY_SIGNEDIMM PROC
jmp fsy_signedofs
FSY_SIGNEDIMM ENDP
FSY_WORDIMM PROC
mov eax,[di+OPERAND.ADDRESS]
call putwordox
ret
FSY_WORDIMM ENDP
FSY_BYTEIMM PROC
mov eax,[di+OPERAND.ADDRESS]
call putbyte
ret
FSY_BYTEIMM ENDP
FSY_PORT PROC
mov eax,[di+OPERAND.ADDRESS]
call putbyte
ret
FSY_PORT ENDP
FSY_INTR PROC
mov eax,[di+OPERAND.ADDRESS]
call putbyte
ret
FSY_INTR ENDP
FSY_RETURN PROC
mov eax,[di+OPERAND.ADDRESS]
call putword
ret
FSY_RETURN ENDP
FSY_ABSBRANCH PROC
mov eax,[di+OPERAND.ADDRESS]
call putword
ret
FSY_ABSBRANCH ENDP
FSY_LONGBRANCH PROC
mov eax,[di+OPERAND.ADDRESS]
call putword
ret
FSY_LONGBRANCH ENDP
FSY_SHORTBRANCH PROC
mov eax,[di+OPERAND.ADDRESS]
call putword
ret
FSY_SHORTBRANCH ENDP
FSY_SHIFT PROC
mov eax,[di+OPERAND.ADDRESS]
call putbyte
ret
FSY_SHIFT ENDP
FSY_SEGMENT PROC
mov ax,[di+OPERAND.OESEG]
call putword
ret
FSY_SEGMENT ENDP
FormatValue PROC
dec al
push 0
call TableDispatch
dw 14
dw FSY_SIGNEDOFS,FSY_WORDOFS,FSY_BYTEOFS,FSY_ABSOLUTE
dw FSY_SIGNEDIMM,FSY_WORDIMM,FSY_BYTEIMM,FSY_PORT
dw FSY_INTR,FSY_RETURN,FSY_ABSBRANCH,FSY_LONGBRANCH
dw FSY_SHORTBRANCH,FSY_SHIFT,FSY_SEGMENT
mov byte ptr [si],0
ret
FormatValue ENDP
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -