forked from KolibriOS/kolibrios
b34f9856cb
git-svn-id: svn://kolibrios.org@9353 a494cfbc-eb01-0410-851d-a64ba20cac60
8191 lines
197 KiB
NASM
8191 lines
197 KiB
NASM
|
||
;-----------------------------------------------------------------------------
|
||
match =32,Bitness {
|
||
rax equ eax
|
||
rbx equ ebx
|
||
rcx equ ecx
|
||
rdx equ edx
|
||
rsi equ esi
|
||
rdi equ edi
|
||
rbp equ ebp
|
||
rsp equ esp
|
||
r9 equ [r9v]
|
||
r15d equ [r5v]
|
||
r15 equ [r5v]
|
||
r10 equ [r1v]
|
||
dq equ dd
|
||
_8_ equ 4
|
||
}
|
||
;-----------------------------------------------------------------------------
|
||
match =64,Bitness {
|
||
_8_ equ 8
|
||
}
|
||
;-----------------------------------------------------------------------------
|
||
macro jrcxz Dst
|
||
{
|
||
if %B=32
|
||
jecxz Dst
|
||
else
|
||
jrcxz Dst
|
||
end if
|
||
}
|
||
;-----------------------------------------------------------------------------
|
||
; REX.W = 0 - CS.D, 1 - 64bit
|
||
; REX.R = ModR/M reg field (GPR, SSE, CRx, DRx)
|
||
; REX.X = SIB index field
|
||
; REX.B = ModR/M r/m field, SIB base field, opcode reg field
|
||
;-----------------------------------------------------------------------------
|
||
; In 64Bits
|
||
; REX.W = 1 & 66h -> 66h is ignored if not mandatory
|
||
;-----------------------------------------------------------------------------
|
||
; Prefixes VEX Opc3 ModRM SIB DISP IMM
|
||
;
|
||
; REX & VEX -> #UD
|
||
; LOCK & VEX -> #UD
|
||
; 66/F2/F3 & VEX -> #UD
|
||
;
|
||
; VEX3 - 0F / 0F 38 / 0F 3A
|
||
; 11000100 RXBmmmmm WvvvvLpp
|
||
;
|
||
; VEX2 - 0F
|
||
; 11000101 RvvvvLpp
|
||
;
|
||
; REX.R = !VEX.R
|
||
;VEX.R=0: Same as REX.R=1 (64-bit mode only)
|
||
;VEX.R=1: Same as REX.R=0 (must be 1 in 32-bit mode)
|
||
; REX.X = !VEX.X
|
||
;VEX.X=0: Same as REX.X=1 (64-bit mode only)
|
||
;VEX.X=1: Same as REX.X=0 (must be 1 in 32-bit mode
|
||
; REX.B = !VEX.B
|
||
;VEX.B=0: Same as REX.B=1 (64-bit mode only)
|
||
;VEX.B=1: Same as REX.B=0 (Ignored in 32-bit mode)
|
||
;
|
||
; REX.W = VEX.W, 4 operands
|
||
; In 32-bit VEX.W is silently ignored.
|
||
;
|
||
; mmmmm = 01b - 0F
|
||
; 10b - 0F 38
|
||
; 11b - 0F 3A
|
||
; vvvv = register specifier / 1111 - unused
|
||
; L = 0 - vector 128bit or scalar / 1 - 256bit vector
|
||
; pp = opcode extension - 00b - None
|
||
; 01b - 66
|
||
; 10b - F3
|
||
; 11b - F2
|
||
;
|
||
;NDS, NDD, DDS: specifies that VEX.vvvv field is valid for the encoding of a
|
||
;register operand:
|
||
; VEX.NDS: VEX.vvvv encodes the first source register in an instruction
|
||
;syntax where the content of source registers will be preserved.
|
||
; VEX.NDD: VEX.vvvv encodes the destination register that cannot be
|
||
;encoded by ModR/M:reg field.
|
||
; VEX.DDS: VEX.vvvv encodes the second source register in a three-
|
||
;operand instruction syntax where the content of first source register will
|
||
;be overwritten by the result.
|
||
; If none of NDS, NDD, and DDS is present, VEX.vvvv must be 1111b (i.e.
|
||
;VEX.vvvv does not encode an operand). The VEX.vvvv field can be
|
||
;encoded using either the 2-byte or 3-byte form of the VEX prefix.
|
||
; /is4: An 8-bit immediate byte is present containing a source register
|
||
;specifier in imm[7:4] and instruction-specific payload in imm[3:0].
|
||
; imz2: Part of the is4 immediate byte providing control functions that
|
||
;apply to two-source permute instructions
|
||
;-----------------------------------------------------------------------------
|
||
; EVEX 62h P0 P1 P2
|
||
;
|
||
;P0: 7 6 5 4 3 2 0 1
|
||
; R X B R' 0 0 m m P[7:0]
|
||
;P1 7 6 5 4 3 2 0 1
|
||
; W v v v v 1 p p P[15:8]
|
||
;P2 7 6 5 4 3 2 0 1
|
||
; z L' L b V' a a a P[23:16]
|
||
;EVEX.mm Compressed legacy escape P[1:0] Identical to low two bits of VEX.mmmmm
|
||
;EVEX.pp Compressed legacy prefix P[9:8] Identical to VEX.pp
|
||
;EVEX.RXB Next-8 register specifier modifier P[7:5] Combine with ModR/M.reg, ModR/M.rm (base, index/vidx)
|
||
;EVEX.R' High-16 register specifier modifier P[4] Combine with EVEX.R and ModR/M.reg
|
||
;EVEX.X High-16 register specifier modifier P[6] Combine with EVEX.B and ModR/M.rm, when SIB/VSIB absent
|
||
;EVEX.vvvv NDS register specifier P[14:11] Same as VEX.vvvv
|
||
;EVEX.V' High-16 NDS/VIDX register specifier P[19] Combine with EVEX.vvvv or when VSIB present
|
||
;EVEX.aaa Embedded opmask register specifier P[18:16]
|
||
;EVEX.W Osize promotion/Opcode extension P[15]
|
||
;EVEX.z Zeroing/Merging P[23]
|
||
;EVEX.b Broadcast/RC/SAE Context P[20]
|
||
;EVEX.L'L Vector length/RC P[22:21]
|
||
;-------------------------------------------------------------------------------------------------------
|
||
;Addressing mode Bit 4 Bit 3 Bits [2:0] Register type Common usage
|
||
;-------------------------------------------------------------------------------------------------------
|
||
;REG EVEX.R' EVEX.R ModRM.reg General purpose, Vector Destination or Source
|
||
;NDS/NDD EVEX.V' EVEX.v3v2v1v0 GPR, Vector 2nd Source or Destination
|
||
;RM EVEX.X EVEX.B ModRM.r/m GPR, Vector 1st Source or Destination
|
||
;BASE 0 EVEX.B ModRM.r/m GPR Memory addressing
|
||
;INDEX 0 EVEX.X SIB.index GPR Memory addressing
|
||
;VIDX EVEX.V' EVEX.X SIB.index Vector VSIB memory addressing
|
||
;IS4 Imm8[3] Imm8[7:4] Vector 3rd Source
|
||
;-------------------------------------------------------------------------------------------------------
|
||
;XOP Bit Mnemonic Description
|
||
;Byte 0:
|
||
;7-0 8Fh XOP Prefix Byte for 3-byte XOP Prefix
|
||
;Byte 1:
|
||
;7 R Inverted one bit extension to ModRM.reg field
|
||
;6 X Inverted one bit extension of the SIB index field
|
||
;5 B Inverted one bit extension of the ModRM r/m field or the SIB base field
|
||
;4-0 mmmmm
|
||
;XOP opcode map select:
|
||
;08h-instructions with immediate byte;
|
||
;09h-instructions with no immediate;
|
||
;Byte 2:
|
||
;7 W Default operand size override for a general pur-
|
||
;pose register to 64-bit size in 64-bit mode; oper-
|
||
;and configuration specifier for certain XMM/YMM-based operations.
|
||
;6-3 vvvv Source or destination register specifier
|
||
;2 L Vector length for XMM/YMM-based operations.
|
||
;1-0 pp
|
||
;Specifies whether there's an implied 66, F2, or F3 opcode extension
|
||
;-----------------------------------------------------------------------------
|
||
RXB = 1 ;REX.B (extension to the Base)
|
||
RXX = 2 ;REX.X (extension to the SIB indeX)
|
||
RXR = 4 ;REX.R (extension to the ModRM/REG)
|
||
RXW = 8 ;REX.W (operand Width; 0 = default, 1 = 64bit)
|
||
RXP = 40h ;REX prefix
|
||
;-----------------------------------------------------------------------------
|
||
|
||
MaxInstructionLength = 15
|
||
|
||
MnemonicLength = 17 ;maximum length of instruction name
|
||
|
||
;Unsigned Minimum eax,edx to eax
|
||
macro MinU
|
||
{
|
||
cmp rax,rdx
|
||
sbb rcx,rcx
|
||
and rax,rcx
|
||
not rcx
|
||
and rdx,rcx
|
||
or rax,rdx
|
||
}
|
||
;Unsigned Maximum eax,edx to eax
|
||
macro MaxU
|
||
{
|
||
cmp rdx,rax
|
||
sbb rcx,rcx
|
||
and rax,rcx
|
||
not rcx
|
||
and rdx,rcx
|
||
or rax,rdx
|
||
}
|
||
;-----------------------------------------------------------------------------
|
||
; I/O: eax - size
|
||
macro Compress
|
||
{
|
||
push rbx rcx rdx rsi rdi
|
||
mov rbx,[TheBufferO]
|
||
mov ecx,eax
|
||
xor edi,edi
|
||
xor esi,esi
|
||
mov [TheK],rdi
|
||
.1: mov ah,[TabSize]
|
||
xor edx,edx
|
||
.2: mov al,[rbx+rsi]
|
||
mov [rbx+rdi],al
|
||
inc rsi
|
||
cmp rsi,rcx
|
||
ja .6
|
||
inc rdi
|
||
inc [TheK]
|
||
cmp al,32
|
||
jne .3
|
||
inc dl
|
||
jmp .4
|
||
.3: xor dl,dl
|
||
.4: dec ah
|
||
jnz .2
|
||
or dl,dl
|
||
jz .5
|
||
dec dl
|
||
jz .5
|
||
sub rdi,rdx
|
||
sub [TheK],rdx
|
||
mov al,9
|
||
mov [rbx+rdi-1],al
|
||
.5: jmp .1
|
||
.6: mov rax,[TheK]
|
||
pop rdi rsi rdx rcx rbx
|
||
}
|
||
|
||
Names: file "qopcodes.bin"
|
||
include "qopcodes.inc"
|
||
|
||
TNULL = ($-1-Names)
|
||
|
||
False = 0
|
||
True = 1
|
||
|
||
NIA = 1 ;Not Intel/AMD
|
||
UND = 2 ;Undocumented or abandon
|
||
|
||
RACC = RRAX
|
||
|
||
RRAX = 0
|
||
RRCX = 1
|
||
RRDX = 2
|
||
RRBX = 3
|
||
RRSP = 4
|
||
RRBP = 5
|
||
RRSI = 6
|
||
RRDI = 7
|
||
RR8 = 8
|
||
RR9 = 9
|
||
RR10 = 10
|
||
RR11 = 11
|
||
RR12 = 12
|
||
RR13 = 13
|
||
RR14 = 14
|
||
RR15 = 15
|
||
|
||
RES = 0
|
||
RCS = 1
|
||
RSS = 2
|
||
RDS = 3
|
||
RFS = 4
|
||
RGS = 5
|
||
|
||
VES = 26h
|
||
VCS = 2Eh
|
||
VSS = 36h
|
||
VDS = 3Eh
|
||
VFS = 64h
|
||
VGS = 65h
|
||
|
||
VNONE = 0
|
||
VBYTE = 1
|
||
VWORD = 2
|
||
VDWORD = 3
|
||
VQWORD = 4
|
||
VOWORD = 5
|
||
VXWORD = 5
|
||
VYWORD = 6
|
||
VZWORD = 7
|
||
VFWORD = 8
|
||
VTWORD = 9
|
||
;-----------------------------------------------------------------------------
|
||
xN = VNONE
|
||
xB = VBYTE
|
||
xW = VWORD
|
||
xD = VDWORD
|
||
xQ = VQWORD
|
||
xO = VOWORD
|
||
xX = VXWORD
|
||
xY = VYWORD
|
||
xZ = VZWORD
|
||
xF = VFWORD
|
||
xT = VTWORD
|
||
;-----------------------------------------------------------------------------
|
||
CPUX16 = 0
|
||
CPUX32 = 1
|
||
CPUX64 = 2
|
||
|
||
AD16 = 0
|
||
AD32 = 1
|
||
AD64 = 2
|
||
ADXX = 3
|
||
ADYY = 4
|
||
ADZZ = 5
|
||
|
||
;kolejno<6E><6F> ma znaczenie/the order is significant
|
||
PF3 = 0
|
||
PF2 = 1
|
||
P66 = 2
|
||
|
||
P67 = 3
|
||
P4X = 4
|
||
P9B = 5
|
||
PF0 = 6
|
||
PSEG = 7
|
||
|
||
GPR08 = 1
|
||
GPR16 = 2
|
||
GPR32 = 3
|
||
GPR64 = 4
|
||
SEGRG = 5
|
||
STXRG = 6
|
||
CTRRG = 7
|
||
DBGRG = 8
|
||
MMXRG = 9
|
||
XMMRG = 10
|
||
YMMRG = 11
|
||
ZMMRG = 12
|
||
BNDRG = 13
|
||
TRXRG = 14
|
||
KXXRG = 15
|
||
;-----------------------------------------------------------------------------
|
||
_R = 1 ;Clear 66h prefix
|
||
_R64 = 2 ;Clear 66h prefix if CPUX64
|
||
_O = 4 ;Do not show memory operand size
|
||
_R48 = 8 ;Clear 48h prefix
|
||
_J = 10h ;Show Branch Hint
|
||
_A = 20h ;Always call 3rd procedure
|
||
_T = 40h ;Extended = Table
|
||
_E = 80h ;Extended Table
|
||
_3 = 100h ;MOD3 (I.Mod=3, CL=3 next 4 names in TABle)
|
||
_S = 8000h ;add "S"uffix in ATT
|
||
_XA = 4000h ;XACQUIRE
|
||
_XR = 2000h ;XRELEASE
|
||
_L = 1000h ;LOCK unnecessary
|
||
_B = 800h ;BND prefix instruction
|
||
;-----------------------------------------------------------------------------
|
||
VEXF = 8000h ;without third opcode
|
||
VEX2 = 4000h ;2nd operand always = xmm
|
||
VEX1 = 2000h ;1st operand always = xmm
|
||
VEXH = 1000h ;MoveName instead MoveNameV
|
||
VEXG = 800h ;operands - GPR32, VEXW - GPR64
|
||
VEXC = 400h ;VEXW=1 = no error
|
||
VEXS = 200h ;encoded NDS
|
||
VEXR = 100h ;only register operands
|
||
VEXW = 80h ;if W=1 then error
|
||
VEXI = 40h ;imm8
|
||
VEX4 = 20h ;is4
|
||
VEXV = 10h ;must be vvvv=1111b
|
||
VEX8 = 08h ;imm8=opcode's new name
|
||
VEXL = 04h ;if L=1 then error
|
||
VEXN = 02h ;if L=0 then error
|
||
VEXM = 01h ;only memory operands
|
||
VEX0 = 00h ;undefined
|
||
;-----------------------------------------------------------------------------
|
||
XOPO = 80h ;00h=RM?R?,80h=R?RM?
|
||
XOP2 = 40h ;2nd operand always = xmm
|
||
XOP1 = 20h ;1st operand always = xmm
|
||
XOPV = 10h ;must be vvvv=1111b
|
||
XOPI = 08h ;imm8
|
||
;-----------------------------------------------------------------------------
|
||
XOPL = 04h ;if L=1 then error & flag like VEX.L
|
||
XOPW = 80h ;if W=1 then error & flag like REX.W
|
||
;-----------------------------------------------------------------------------
|
||
EVEXAA = 10000h ;for decorator
|
||
EVEXQ1 = 08000h ;add suffix Q1 when W=1
|
||
EVEXD1 = 04000h ;add suffix D1 when W=1
|
||
EVEXE = (EVEXQ1+EVEXD1) ;name points to two names
|
||
EVEXI = 02000h ;imm8
|
||
EVEXM = 01000h ;call GetVectorAndMUL
|
||
EVEXB = 00800h ;inc MemorySize & MULT when (W=1 & BB!=0)
|
||
EVEXU = 00400h ;inc MemorySize & MULT when W=1
|
||
EVEXL0 = 00200h ;if L'L=00b then error
|
||
EVEXLL = 00100h ;if L'L<10b then error
|
||
EVEXLX = (EVEXL0+EVEXLL) ;if L'L>00b then error
|
||
;-----------------------------------------------------------------------------
|
||
EVEXW0 = (EVEXYW+EVEXNW) ;ignore W1 in non 64-bits
|
||
EVEXYW = 00080h ;if W=1 then error
|
||
EVEXNW = 00040h ;if W=0 then error
|
||
EVEXV = 00020h ;if VVVV!=1111b then error
|
||
EVEX2 = 00010h ;proc points to two procs
|
||
;-----------------------------------------------------------------------------
|
||
EVEXS = 00008h ;skip {K1}
|
||
EVEXR = 00004h ;indicates support for embedded rounding control, which is only applicable to the register-register form of the instruction
|
||
EVEXO = 00002h ;EVEXR Only if W=1
|
||
EVEXX = 00001h ;always XMM, L'L ignore
|
||
;-----------------------------------------------------------------------------
|
||
EVEX0 = 00000h ;undefined
|
||
;-----------------------------------------------------------------------------
|
||
include "scanitem.inc"
|
||
;-----------------------------------------------------------------------------
|
||
macro xx Name,Rtn,Rand=0,DefReg=0,Flags=0
|
||
{
|
||
local Temp
|
||
if Rtn-RtnXX<0
|
||
err invalid procedure address
|
||
end if
|
||
dw Name
|
||
virtual at 0
|
||
Temp::
|
||
dw Rtn-RtnXX
|
||
if (Flags) and _E = _E
|
||
if DefReg-EXT80<0
|
||
err invalid table address
|
||
end if
|
||
dw DefReg-EXT80
|
||
else if (Flags) and _T = _T
|
||
if DefReg-TTXXXX<0
|
||
err invalid table address
|
||
end if
|
||
dw DefReg-TTXXXX
|
||
else
|
||
db Rand shl 4+DefReg,?
|
||
end if
|
||
dw Flags
|
||
end virtual
|
||
AddElement Temp:
|
||
}
|
||
|
||
virtual at 0
|
||
xxh:
|
||
.Rtn dw ?
|
||
.NxtTab rw 0
|
||
.DefReg db ?,?
|
||
.Flags dw ?
|
||
.Size:
|
||
end virtual
|
||
|
||
virtual at 0
|
||
yyh:
|
||
.Name: dw ?
|
||
.Addr: dw ?
|
||
.Size:
|
||
end virtual
|
||
;-----------------------------------------------------------------------------
|
||
virtual at 0 ;XOP
|
||
XOP:
|
||
.Imm db ?
|
||
.Flags db ?
|
||
.MOS db ?,?
|
||
.Rtn dw ?
|
||
.Name dw ?
|
||
.Size:
|
||
end virtual
|
||
;-----------------------------------------------------------------------------
|
||
macro XOPc Imm,MOS0,MOS1,Flags,Rtn,NameV
|
||
{
|
||
db Imm
|
||
db Flags
|
||
db MOS0,MOS1
|
||
dw Rtn-RtnXX
|
||
dw NameV
|
||
}
|
||
;-----------------------------------------------------------------------------
|
||
virtual at 0 ;xC
|
||
CXX:
|
||
.Rtn dw ?
|
||
.Flags dw ?
|
||
.Imm db ?
|
||
.MOS db ?
|
||
.Name dw ?
|
||
.Size:
|
||
end virtual
|
||
;-----------------------------------------------------------------------------
|
||
macro xC Routine,Flags,Imm,MOS0,MOS1,NameV
|
||
{
|
||
dw Routine-RtnXX
|
||
dw Flags
|
||
db Imm
|
||
db (MOS1)*16+MOS0
|
||
dw NameV
|
||
}
|
||
;-----------------------------------------------------------------------------
|
||
virtual at 0
|
||
X62:
|
||
.Rtn dw ?
|
||
.Name dw ?
|
||
.Flags dw ?
|
||
.Imm db ?
|
||
.MOS db ?
|
||
.Size:
|
||
end virtual
|
||
;-----------------------------------------------------------------------------
|
||
macro T62 Routine,Imm,Name,Flags,MemSizeH,MemSizeL
|
||
{
|
||
dw Routine-RtnXX
|
||
if ((Flags) and EVEXE = EVEXE)
|
||
dw Name-T62Names
|
||
else
|
||
dw Name
|
||
end if
|
||
dw Flags
|
||
db Imm
|
||
db (MemSizeH*16)+MemSizeL
|
||
}
|
||
;-----------------------------------------------------------------------------
|
||
macro FetchB
|
||
{
|
||
lodsb
|
||
}
|
||
|
||
macro FetchW
|
||
{
|
||
lodsw
|
||
}
|
||
|
||
macro FetchD
|
||
{
|
||
lodsd
|
||
}
|
||
|
||
macro FetchUD
|
||
{
|
||
lodsd
|
||
or [I.MainFlags],80h
|
||
}
|
||
|
||
macro FetchSB
|
||
{
|
||
FetchB
|
||
movsx rax,al
|
||
}
|
||
|
||
macro FetchSW
|
||
{
|
||
FetchW
|
||
movsx rax,ax
|
||
}
|
||
|
||
macro FetchSD
|
||
{
|
||
FetchD
|
||
if %B=64
|
||
movsxd rax,eax
|
||
end if
|
||
}
|
||
|
||
macro FetchQ
|
||
{
|
||
if %B=64
|
||
lodsq
|
||
else
|
||
lodsd
|
||
mov edx,eax
|
||
lodsd
|
||
xchg edx,eax
|
||
end if
|
||
}
|
||
|
||
macro BitT Mem,Val
|
||
{
|
||
bt dword [Mem+Val/8],Val and 7
|
||
}
|
||
|
||
macro BitTS Mem,Val
|
||
{
|
||
bts dword [Mem+Val/8],Val and 7
|
||
}
|
||
|
||
macro BitTR Mem,Val
|
||
{
|
||
btr dword [Mem+Val/8],Val and 7
|
||
}
|
||
|
||
;Type2nd=
|
||
InNONE = 0
|
||
InRM = 1
|
||
InReg = 2
|
||
InVVVV = 3
|
||
Is1 = 4
|
||
|
||
struct TArg
|
||
Type db ?
|
||
Type2nd db ?
|
||
Reg db ?
|
||
Mem db ?
|
||
ImmB rb 0
|
||
Imm dq ?
|
||
if %B=32
|
||
dd ?
|
||
end if
|
||
ends
|
||
|
||
struct TInstruction
|
||
;
|
||
Addr dq ?
|
||
SaveRSP dq ?
|
||
SaveRSI dq ?
|
||
Size dq ?
|
||
Item dd ?
|
||
Table dd ?
|
||
;
|
||
Arch db ?
|
||
Only db ?
|
||
NextByte db ?
|
||
NewTable db ?
|
||
;
|
||
NotR db ?
|
||
NotX db ?
|
||
NotB db ?
|
||
NotW db ?
|
||
NotP db ?
|
||
;
|
||
Is62 db ?
|
||
;
|
||
R db ?
|
||
X db ?
|
||
B db ?
|
||
W db ?
|
||
P db ?
|
||
V db ?
|
||
Z db ?
|
||
BB db ?
|
||
PP db ?
|
||
LL db ?
|
||
XX db ?
|
||
AAAA db ?
|
||
MULT db ?
|
||
;
|
||
XOP db ?
|
||
VEX db ?
|
||
VVVV db ?
|
||
MMMMM db ?
|
||
;
|
||
FlagsVEX rb 0
|
||
FlagsXOP db ?,?
|
||
FlagsEVEX db ?,?,?
|
||
;
|
||
VT db ?
|
||
AfterVEX db ?
|
||
;
|
||
Fasm db ?
|
||
Medium db ?
|
||
UseDB db ?
|
||
NoREX db ?
|
||
FullHex db ?
|
||
Dollar db ?
|
||
HexPrefix db ?
|
||
Negate db ?
|
||
ShowRand db ? ;Always show operand size
|
||
ShowSize db ?
|
||
RandSize db ?
|
||
ShowScale db ?
|
||
NoAddress db ?
|
||
HideRIP db ?
|
||
IsShort db ?
|
||
Emulated db ?
|
||
IsAddress db ?
|
||
Sensitive db ?
|
||
NoShowRand db ?
|
||
DisplayHint db ?
|
||
PossibleLOCK db ?
|
||
PossibleF2F3 db ?
|
||
Compression db ?
|
||
Intelligent db ?
|
||
IsCALLJMP db ?
|
||
Prefix db ?
|
||
LastByte db ?
|
||
;
|
||
Operand db ?
|
||
Address db ?
|
||
CurSeg db ?
|
||
DefSeg db ?
|
||
PreREX db ?
|
||
IsFloat db ?
|
||
IsRET db ?
|
||
Syntax db ?
|
||
;
|
||
ModRM db ?
|
||
SIB db ?
|
||
Flags dw ?
|
||
Point dw ?
|
||
;
|
||
RM db ?
|
||
Reg db ?
|
||
Mod db ?
|
||
Relative db ?
|
||
;
|
||
Base db ?
|
||
Indx db ?
|
||
Scale db ?
|
||
DispSize db ?
|
||
;
|
||
Pos66 db ?
|
||
Pos67 db ?
|
||
Pos4X db ?
|
||
Pos9B db ?
|
||
PosF0 db ?
|
||
PosF2 db ?
|
||
PosF3 db ?
|
||
PosSEG db ?
|
||
;
|
||
Disp dq ?
|
||
if %B=32
|
||
dd ?
|
||
end if
|
||
;
|
||
IsLEA db ?
|
||
PrefixByte db ?
|
||
Mandatory66 db ?
|
||
MemSeparator db ?
|
||
MainFlags db ?
|
||
;
|
||
Name dw ?
|
||
AltName dw ?
|
||
SegmName dw ?
|
||
;
|
||
Arg1 TArg
|
||
Arg2 TArg
|
||
Arg3 TArg
|
||
Arg4 TArg
|
||
Arg5 TArg
|
||
;
|
||
Suffix rb 4
|
||
Suffix2nd rb 4
|
||
Suffix3rd rb 4
|
||
LastArg dq ?
|
||
;
|
||
Prefixes dd ?
|
||
PrefixesCpy dd ?
|
||
PrefixNames rw 16
|
||
PrefixBites rb 16
|
||
PrefixCount db ?
|
||
;
|
||
ends
|
||
|
||
virtual at rbp-128 ;maximum lower address
|
||
I TInstruction
|
||
end virtual
|
||
|
||
macro HexString
|
||
{
|
||
local A
|
||
virtual at 0
|
||
HexVal::db '0123456789ABCDEF'
|
||
end virtual
|
||
even 4
|
||
HexString:
|
||
rept 256 n:0 {\
|
||
load A byte from HexVal:(n shr 4)
|
||
db A
|
||
load A byte from HexVal:(n and 15)
|
||
db A
|
||
\}
|
||
}
|
||
|
||
HexString
|
||
Scales db '1248'
|
||
Suffixes db 0,'bwlq'
|
||
;-----------------------------------------------------------------------------
|
||
TSAE dw T?RN?SAE?
|
||
dw T?RD?SAE?
|
||
dw T?RU?SAE?
|
||
dw T?RZ?SAE?
|
||
;-----------------------------------------------------------------------------
|
||
T1TO dw T?1TO2?
|
||
dw T?1TO4?
|
||
dw T?1TO8?
|
||
dw T?1TO16?
|
||
;-----------------------------------------------------------------------------
|
||
NGPR08 dw TAL,\
|
||
TCL,\
|
||
TDL,\
|
||
TBL,\
|
||
TAH,\
|
||
TCH,\
|
||
TDH,\
|
||
TBH,\
|
||
TAL,\
|
||
TCL,\
|
||
TDL,\
|
||
TBL,\
|
||
TAH,\
|
||
TCH,\
|
||
TDH,\
|
||
TBH
|
||
|
||
NGPRX8 dw TAL,\
|
||
TCL,\
|
||
TDL,\
|
||
TBL,\
|
||
TSPL,\
|
||
TBPL,\
|
||
TSIL,\
|
||
TDIL,\
|
||
TR8B,\
|
||
TR9B,\
|
||
TR10B,\
|
||
TR11B,\
|
||
TR12B,\
|
||
TR13B,\
|
||
TR14B,\
|
||
TR15B
|
||
|
||
NGPRL8 dw TAL,\
|
||
TCL,\
|
||
TDL,\
|
||
TBL,\
|
||
TSPL,\
|
||
TBPL,\
|
||
TSIL,\
|
||
TDIL,\
|
||
TR8L,\
|
||
TR9L,\
|
||
TR10L,\
|
||
TR11L,\
|
||
TR12L,\
|
||
TR13L,\
|
||
TR14L,\
|
||
TR15L
|
||
|
||
NGPR16 dw TAX,\
|
||
TCX,\
|
||
TDX,\
|
||
TBX,\
|
||
TSP,\
|
||
TBP,\
|
||
TSI,\
|
||
TDI,\
|
||
TR8W,\
|
||
TR9W,\
|
||
TR10W,\
|
||
TR11W,\
|
||
TR12W,\
|
||
TR13W,\
|
||
TR14W,\
|
||
TR15W
|
||
|
||
NGPR32 dw TEAX,\
|
||
TECX,\
|
||
TEDX,\
|
||
TEBX,\
|
||
TESP,\
|
||
TEBP,\
|
||
TESI,\
|
||
TEDI,\
|
||
TR8D,\
|
||
TR9D,\
|
||
TR10D,\
|
||
TR11D,\
|
||
TR12D,\
|
||
TR13D,\
|
||
TR14D,\
|
||
TR15D,\
|
||
TEIP?
|
||
|
||
NGPR64 dw TRAX,\
|
||
TRCX,\
|
||
TRDX,\
|
||
TRBX,\
|
||
TRSP,\
|
||
TRBP,\
|
||
TRSI,\
|
||
TRDI,\
|
||
TR8,\
|
||
TR9,\
|
||
TR10,\
|
||
TR11,\
|
||
TR12,\
|
||
TR13,\
|
||
TR14,\
|
||
TR15,\
|
||
TRIP?
|
||
|
||
NSTRXX dw TST0,\
|
||
TST1,\
|
||
TST2,\
|
||
TST3,\
|
||
TST4,\
|
||
TST5,\
|
||
TST6,\
|
||
TST7
|
||
|
||
NSTRYY dw TST?0?,\
|
||
TST?1?,\
|
||
TST?2?,\
|
||
TST?3?,\
|
||
TST?4?,\
|
||
TST?5?,\
|
||
TST?6?,\
|
||
TST?7?
|
||
|
||
NCTRXX dw TCR0,\
|
||
TCR1,\
|
||
TCR2,\
|
||
TCR3,\
|
||
TCR4,\
|
||
TCR5,\
|
||
TCR6,\
|
||
TCR7,\
|
||
TCR8,\
|
||
TCR9,\
|
||
TCR10,\
|
||
TCR11,\
|
||
TCR12,\
|
||
TCR13,\
|
||
TCR14,\
|
||
TCR15
|
||
|
||
NDBGXX dw TDR0,\
|
||
TDR1,\
|
||
TDR2,\
|
||
TDR3,\
|
||
TDR4,\
|
||
TDR5,\
|
||
TDR6,\
|
||
TDR7,\
|
||
TDR8,\
|
||
TDR9,\
|
||
TDR10,\
|
||
TDR11,\
|
||
TDR12,\
|
||
TDR13,\
|
||
TDR14,\
|
||
TDR15
|
||
|
||
NDBGYY dw TDB0,\
|
||
TDB1,\
|
||
TDB2,\
|
||
TDB3,\
|
||
TDB4,\
|
||
TDB5,\
|
||
TDB6,\
|
||
TDB7,\
|
||
TDB8,\
|
||
TDB9,\
|
||
TDB10,\
|
||
TDB11,\
|
||
TDB12,\
|
||
TDB13,\
|
||
TDB14,\
|
||
TDB15
|
||
|
||
NXMMXX dw TXMM0,\
|
||
TXMM1,\
|
||
TXMM2,\
|
||
TXMM3,\
|
||
TXMM4,\
|
||
TXMM5,\
|
||
TXMM6,\
|
||
TXMM7,\
|
||
TXMM8,\
|
||
TXMM9,\
|
||
TXMM10,\
|
||
TXMM11,\
|
||
TXMM12,\
|
||
TXMM13,\
|
||
TXMM14,\
|
||
TXMM15,\
|
||
TXMM16,\
|
||
TXMM17,\
|
||
TXMM18,\
|
||
TXMM19,\
|
||
TXMM20,\
|
||
TXMM21,\
|
||
TXMM22,\
|
||
TXMM23,\
|
||
TXMM24,\
|
||
TXMM25,\
|
||
TXMM26,\
|
||
TXMM27,\
|
||
TXMM28,\
|
||
TXMM29,\
|
||
TXMM30,\
|
||
TXMM31
|
||
|
||
NYMMXX dw TYMM0,\
|
||
TYMM1,\
|
||
TYMM2,\
|
||
TYMM3,\
|
||
TYMM4,\
|
||
TYMM5,\
|
||
TYMM6,\
|
||
TYMM7,\
|
||
TYMM8,\
|
||
TYMM9,\
|
||
TYMM10,\
|
||
TYMM11,\
|
||
TYMM12,\
|
||
TYMM13,\
|
||
TYMM14,\
|
||
TYMM15,\
|
||
TYMM16,\
|
||
TYMM17,\
|
||
TYMM18,\
|
||
TYMM19,\
|
||
TYMM20,\
|
||
TYMM21,\
|
||
TYMM22,\
|
||
TYMM23,\
|
||
TYMM24,\
|
||
TYMM25,\
|
||
TYMM26,\
|
||
TYMM27,\
|
||
TYMM28,\
|
||
TYMM29,\
|
||
TYMM30,\
|
||
TYMM31
|
||
|
||
NZMMXX dw TZMM0,\
|
||
TZMM1,\
|
||
TZMM2,\
|
||
TZMM3,\
|
||
TZMM4,\
|
||
TZMM5,\
|
||
TZMM6,\
|
||
TZMM7,\
|
||
TZMM8,\
|
||
TZMM9,\
|
||
TZMM10,\
|
||
TZMM11,\
|
||
TZMM12,\
|
||
TZMM13,\
|
||
TZMM14,\
|
||
TZMM15,\
|
||
TZMM16,\
|
||
TZMM17,\
|
||
TZMM18,\
|
||
TZMM19,\
|
||
TZMM20,\
|
||
TZMM21,\
|
||
TZMM22,\
|
||
TZMM23,\
|
||
TZMM24,\
|
||
TZMM25,\
|
||
TZMM26,\
|
||
TZMM27,\
|
||
TZMM28,\
|
||
TZMM29,\
|
||
TZMM30,\
|
||
TZMM31
|
||
;-----------------------------------------------------------------------------
|
||
NBNDX dw TBND0,TBND1,TBND2,TBND3,TBND4?,TBND5?,TBND6?,TBND7?
|
||
;-----------------------------------------------------------------------------
|
||
NSEGR dw TES,TCS,TSS,TDS,TFS,TGS,TS6,TS7
|
||
NKXXX dw TK0,TK1,TK2,TK3,TK4,TK5,TK6,TK7
|
||
;-----------------------------------------------------------------------------
|
||
NMMXXX dw TMM0,TMM1,TMM2,TMM3,TMM4,TMM5,TMM6,TMM7
|
||
NTRXXX dw TTR0,TTR1,TTR2,TTR3,TTR4,TTR5,TTR6,TTR7
|
||
;-----------------------------------------------------------------------------
|
||
NSEGX dw TSEGES,TSEGCS,TSEGSS,TSEGDS,TSEGFS,TSEGGS
|
||
;-----------------------------------------------------------------------------
|
||
DefCPU2AD db AD16,AD32,AD64
|
||
XorCPU2AD db AD32,AD16,AD32
|
||
DefCPU2OS db 0,1,1
|
||
XorCPU2OS db 1,0,0
|
||
;-----------------------------------------------------------------------------
|
||
if used DefArgSize
|
||
DefArgSize db VWORD,GPR16,VDWORD,GPR32,VQWORD,GPR64
|
||
end if
|
||
;-----------------------------------------------------------------------------
|
||
NotP4X dd not (bit P4X)
|
||
;-----------------------------------------------------------------------------
|
||
SZ2Mems dw TBYTE,TWORD,TDWORD,TQWORD
|
||
SZ2Name dw TNULL,TBYTE,TWORD,TDWORD,TQWORD,TXWORD,TYWORD,TZWORD,\
|
||
TFWORD,TTWORD
|
||
;-----------------------------------------------------------------------------
|
||
AD2Regs dd NGPR16,NGPR32,NGPR64,NXMMXX,NYMMXX,NZMMXX
|
||
;-----------------------------------------------------------------------------
|
||
IntelName dd NGPRX8
|
||
SZ2Regs dd NGPR08,NGPR16,NGPR32,NGPR64,NSEGR,NSTRXX,NCTRXX,NDBGXX,\
|
||
NMMXXX,NXMMXX,NYMMXX,NZMMXX,NBNDX,NTRXXX,NKXXX
|
||
;-----------------------------------------------------------------------------
|
||
TBIT dd 1 shl GPR08+\
|
||
1 shl GPR16+\
|
||
1 shl GPR32+\
|
||
1 shl GPR64+\
|
||
0 shl SEGRG+\
|
||
0 shl STXRG+\
|
||
1 shl CTRRG+\
|
||
1 shl DBGRG+\
|
||
0 shl MMXRG+\
|
||
1 shl XMMRG+\
|
||
1 shl YMMRG+\
|
||
1 shl ZMMRG+\
|
||
0 shl BNDRG+\
|
||
0 shl TRXRG+\
|
||
0 shl KXXRG
|
||
;-----------------------------------------------------------------------------
|
||
SZ2Mask dq 0x00,0xFF,0xFFFF,0xFFFFFFFF
|
||
;-----------------------------------------------------------------------------
|
||
;One Table 0F (X0-XF)
|
||
EXTBITS dd 0 shl 0+\ ;- 0
|
||
0 shl 1+\ ;- 1
|
||
1 shl 2+\ ;+ 2
|
||
1 shl 3+\ ;+ 3
|
||
0 shl 4+\ ;- 4
|
||
1 shl 5+\ ;+ 5
|
||
1 shl 6+\ ;+ 6
|
||
1 shl 7+\ ;+ 7
|
||
1 shl 8+\ ;+ 8
|
||
1 shl 9+\ ;+ 9
|
||
0 shl 10+\ ;- A
|
||
0 shl 11+\ ;- B
|
||
0 shl 12+\ ;- C
|
||
1 shl 13+\ ;+ D
|
||
1 shl 14+\ ;+ E
|
||
1 shl 15 ;+ F
|
||
;-----------------------------------------------------------------------------
|
||
EXT0F dd EXT0F00,EXT0F10,EXT0F20,EXT0F30,EXT0F40,EXT0F50,EXT0F60,EXT0F70
|
||
dd EXT0F80,EXT0F90,EXT0FA0,EXT0FB0,EXT0FC0,EXT0FD0,EXT0FE0,EXT0FF0
|
||
;-----------------------------------------------------------------------------
|
||
TFLDXTable: dw TFLD1
|
||
dw TFLDL2T
|
||
dw TFLDL2E
|
||
dw TFLDPI
|
||
dw TFLDLG2
|
||
dw TFLDLN2
|
||
dw TFLDZ
|
||
dw 0
|
||
|
||
TE110Table: dw TF2XM1
|
||
dw TFYL2X
|
||
dw TFPTAN
|
||
dw TFPATAN
|
||
dw TFXTRACT
|
||
dw TFPREM1
|
||
dw TFDECSTP
|
||
dw TFINCSTP
|
||
|
||
TE111Table: dw TFPREM
|
||
dw TFYL2XP1
|
||
dw TFSQRT
|
||
dw TFSINCOS
|
||
dw TFRNDINT
|
||
dw TFSCALE
|
||
dw TFSIN
|
||
dw TFCOS
|
||
|
||
TVMXXTable: dw TVMRUN
|
||
dw TVMMCALL
|
||
dw TVMLOAD
|
||
dw TVMSAVE
|
||
dw TSTGI
|
||
dw TCLGI
|
||
dw TSKINIT
|
||
dw TINVLPGA
|
||
;-----------------------------------------------------------------------------
|
||
Now3D: dv 0Ch,TPI2FW
|
||
dv 0Dh,TPI2FD
|
||
dv 1Ch,TPF2IW
|
||
dv 1Dh,TPF2ID
|
||
dv 8Ah,TPFNACC
|
||
dv 8Eh,TPFPNACC
|
||
dv 90h,TPFCMPGE
|
||
dv 94h,TPFMIN
|
||
dv 96h,TPFRCP
|
||
dv 97h,TPFRSQRT
|
||
dv 9Ah,TPFSUB
|
||
dv 9Eh,TPFADD
|
||
dv $A0,TPFCMPGT
|
||
dv $A4,TPFMAX
|
||
dv $A6,TPFRCPIT1
|
||
dv $A7,TPFRSQIT1
|
||
dv $AA,TPFSUBR
|
||
dv $AE,TPFACC
|
||
dv $B0,TPFCMPEQ
|
||
dv $B4,TPFMUL
|
||
dv $B6,TPFRCPIT2
|
||
dv $B7,TPMULHRW
|
||
dv $BB,TPSWAPD
|
||
dv $BF,TPAVGUSB
|
||
;
|
||
dv $86,TPFRCPV ;Cyrix
|
||
dv $87,TPFRSQRTV;Cyrix
|
||
;
|
||
End3D:
|
||
;-----------------------------------------------------------------------------
|
||
TabSSE4 rb 0
|
||
dv $00,TPSHUFB
|
||
dv $01,TPHADDW
|
||
dv $02,TPHADDD
|
||
dv $03,TPHADDSW
|
||
dv $04,TPMADDUBSW
|
||
dv $05,TPHSUBW
|
||
dv $06,TPHSUBD
|
||
dv $07,TPHSUBSW
|
||
dv $08,TPSIGNB
|
||
dv $09,TPSIGNW
|
||
dv $0A,TPSIGND
|
||
dv $0B,TPMULHRSW
|
||
dv $1C,TPABSB
|
||
dv $1D,TPABSW
|
||
dv $1E,TPABSD
|
||
EndSSE4 rb 0
|
||
;-----------------------------------------------------------------------------
|
||
NxtSSE4 rb 0
|
||
dy $10,VXWORD+80h,TPBLENDVB
|
||
dy $14,VXWORD+80h,TBLENDVPS
|
||
dy $15,VXWORD+80h,TBLENDVPD
|
||
dy $17,VXWORD+80h,TPTEST
|
||
dy $20,VQWORD+80h,TPMOVSXBW
|
||
dy $21,VDWORD+80h,TPMOVSXBD
|
||
dy $22, VWORD+80h,TPMOVSXBQ
|
||
dy $23,VQWORD+80h,TPMOVSXWD
|
||
dy $24,VDWORD+80h,TPMOVSXWQ
|
||
dy $25,VQWORD+80h,TPMOVSXDQ
|
||
dy $28,VXWORD+80h,TPMULDQ
|
||
dy $29,VXWORD+80h,TPCMPEQQ
|
||
dy $2A,VXWORD+80h,TMOVNTDQA
|
||
dy $2B,VXWORD+80h,TPACKUSDW
|
||
dy $30,VQWORD+80h,TPMOVZXBW
|
||
dy $31,VDWORD+80h,TPMOVZXBD
|
||
dy $32, VWORD+80h,TPMOVZXBQ
|
||
dy $33,VQWORD+80h,TPMOVZXWD
|
||
dy $34,VDWORD+80h,TPMOVZXWQ
|
||
dy $35,VQWORD+80h,TPMOVZXDQ
|
||
dy $37,VXWORD+80h,TPCMPGTQ
|
||
dy $38,VXWORD+80h,TPMINSB
|
||
dy $39,VXWORD+80h,TPMINSD
|
||
dy $3A,VXWORD+80h,TPMINUW
|
||
dy $3B,VXWORD+80h,TPMINUD
|
||
dy $3C,VXWORD+80h,TPMAXSB
|
||
dy $3D,VXWORD+80h,TPMAXSD
|
||
dy $3E,VXWORD+80h,TPMAXUW
|
||
dy $3F,VXWORD+80h,TPMAXUD
|
||
dy $40,VXWORD+80h,TPMULLD
|
||
dy $41,VXWORD+80h,TPHMINPOSUW
|
||
dy $CF,VXWORD+80h,TGF2P8MULB
|
||
dy $DB,VXWORD+80h,TAESIMC
|
||
dy $DC,VXWORD+80h,TAESENC
|
||
dy $DD,VXWORD+80h,TAESENCLAST
|
||
dy $DE,VXWORD+80h,TAESDEC
|
||
dy $DF,VXWORD+80h,TAESDECLAST
|
||
EndNxtSSE4:
|
||
;-----------------------------------------------------------------------------
|
||
TableSXSSE:
|
||
dy $08,VOWORD+80h,TROUNDPS
|
||
dy $09,VOWORD+80h,TROUNDPD
|
||
dy $0A,VDWORD+80h,TROUNDSS
|
||
dy $0B,VQWORD+80h,TROUNDSD
|
||
dy $0C,VOWORD+80h,TBLENDPS
|
||
dy $0D,VOWORD+80h,TBLENDPD
|
||
dy $0E,VOWORD+80h,TPBLENDW
|
||
dy $0F,VOWORD+80h,TPALIGNR
|
||
dy $40,VOWORD+80h,TDPPS
|
||
dy $41,VOWORD+80h,TDPPD
|
||
dy $42,VOWORD+80h,TMPSADBW
|
||
dy $60,VOWORD+80h,TPCMPESTRM
|
||
dy $61,VOWORD+80h,TPCMPESTRI
|
||
dy $62,VOWORD+80h,TPCMPISTRM
|
||
dy $63,VOWORD+80h,TPCMPISTRI
|
||
dy $CE,VOWORD+80h,TGF2P8AFFINEQB
|
||
dy $CF,VOWORD+80h,TGF2P8AFFINEINVQB
|
||
dy $DF,VOWORD+80h,TAESKEYGENASSIST
|
||
TableEXSSE:
|
||
;-----------------------------------------------------------------------------
|
||
TabCLMUL:
|
||
dw TPCLMULLQLQDQ ;0000_0000b
|
||
dw TPCLMULHQLQDQ ;0000_0001b
|
||
rw 14
|
||
dw TPCLMULLQHQDQ ;0001_0000b
|
||
dw TPCLMULHQHQDQ ;0001_0001b
|
||
;-----------------------------------------------------------------------------
|
||
T0F71Names:
|
||
dw 0 ;/0
|
||
dw 0 ;/1
|
||
dw TPSRLW ;/2
|
||
dw 0 ;/3
|
||
dw TPSRAW ;/4
|
||
dw 0 ;/5
|
||
dw TPSLLW ;/6
|
||
dw 0 ;/7
|
||
;-----------------------------------------------------------------------------
|
||
T0F72Names:
|
||
dw 0 ;/0
|
||
dw 0 ;/1
|
||
dw TPSRLD ;/2
|
||
dw 0 ;/3
|
||
dw TPSRAD ;/4
|
||
dw 0 ;/5
|
||
dw TPSLLD ;/6
|
||
dw 0 ;/7
|
||
;-----------------------------------------------------------------------------
|
||
T0F73Names:
|
||
dw 0 ;/0
|
||
dw 0 ;/1
|
||
dw TPSRLQ ;/2
|
||
dw TPSRLDQ ;/3
|
||
dw 0 ;/4
|
||
dw 0 ;/5
|
||
dw TPSLLQ ;/6
|
||
dw TPSLLDQ ;/7
|
||
;-----------------------------------------------------------------------------
|
||
TCentTable:
|
||
dw TMONTMUL ;C0
|
||
dw TXSHA1 ;C8
|
||
dw TXSHA256 ;D0
|
||
;-----------------------------------------------------------------------------
|
||
TCRYPTable:
|
||
dw 0 ;C0
|
||
dw TXCRYPTECB ;C8
|
||
dw TXCRYPTCBC ;D0
|
||
dw TXCRYPTCTR ;D8
|
||
dw TXCRYPTCFB ;E0
|
||
dw TXCRYPTOFB ;E8
|
||
dw 0 ;F0
|
||
dw 0 ;F8
|
||
;-----------------------------------------------------------------------------
|
||
T0FAETable:
|
||
dw TFXSAVE
|
||
dw TFXRSTOR
|
||
dw TLDMXCSR
|
||
dw TSTMXCSR
|
||
dw TXSAVE
|
||
dw TXRSTOR
|
||
dw TXSAVEOPT
|
||
dw TCLFLUSH
|
||
;-----------------------------------------------------------------------------
|
||
T0FAETab64:
|
||
dw TFXSAVE64
|
||
dw TFXRSTOR64
|
||
dw 0
|
||
dw 0
|
||
dw TXSAVE64
|
||
dw TXRSTOR64
|
||
dw TXSAVEOPT64
|
||
dw 0
|
||
;-----------------------------------------------------------------------------
|
||
TF30FAETable:
|
||
dw TRDFSBASE
|
||
dw TRDGSBASE
|
||
dw TWRFSBASE
|
||
dw TWRGSBASE
|
||
dw TPTWRITE
|
||
dw TINCSSPD
|
||
dw TUMONITOR
|
||
dw 0
|
||
;-----------------------------------------------------------------------------
|
||
T660FAETable0:
|
||
dw 0
|
||
dw 0
|
||
dw 0
|
||
dw 0
|
||
dw 0
|
||
dw 0
|
||
dw TCLWB
|
||
dw TCLFLUSHOPT
|
||
;-----------------------------------------------------------------------------
|
||
T660FAETable3:
|
||
dw 0
|
||
dw 0
|
||
dw 0
|
||
dw 0
|
||
dw 0
|
||
dw 0
|
||
dw TTPAUSE
|
||
dw TPCOMMIT
|
||
;-----------------------------------------------------------------------------
|
||
T0FC7Table:
|
||
dw 0
|
||
dw 0
|
||
dw 0
|
||
dw TXRSTORS
|
||
dw TXSAVEC
|
||
dw TXSAVES
|
||
dw 0
|
||
dw 0
|
||
;-----------------------------------------------------------------------------
|
||
T0FC7Tab64:
|
||
dw 0
|
||
dw 0
|
||
dw 0
|
||
dw TXRSTORS64
|
||
dw TXSAVEC64
|
||
dw TXSAVES64
|
||
dw 0
|
||
dw 0
|
||
;-----------------------------------------------------------------------------
|
||
TablePCOM:
|
||
dw TPCOMLT ;0
|
||
dw TPCOMLE ;1
|
||
dw TPCOMGT ;2
|
||
dw TPCOMGE ;3
|
||
dw TPCOMEQ ;4
|
||
dw TPCOMNEQ ;5
|
||
dw TPCOMFALSE ;6
|
||
dw TPCOMTRUE ;7
|
||
;-----------------------------------------------------------------------------
|
||
CMPSuffixesY:
|
||
db 'ps',VXWORD+80h;00
|
||
db 'pd',VXWORD+80h;66
|
||
db 'sd',VQWORD+80h;F2
|
||
db 'ss',VDWORD+80h;F3
|
||
;-----------------------------------------------------------------------------
|
||
CMPSuffixesX:
|
||
db 'ps',VXWORD+80h;00
|
||
db 'pd',VXWORD+80h;66
|
||
db 'ss',VDWORD+80h;F3
|
||
db 'sd',VQWORD+80h;F2
|
||
;-----------------------------------------------------------------------------
|
||
CMPxxNames:
|
||
dw TCMPEQ ;0
|
||
dw TCMPLT ;1
|
||
dw TCMPLE ;2
|
||
dw TCMPUNORD ;3
|
||
dw TCMPNEQ ;4
|
||
dw TCMPNLT ;5
|
||
dw TCMPNLE ;6
|
||
dw TCMPORD ;7
|
||
dw TCMPEQ?UQ ;8
|
||
dw TCMPNGE ;9
|
||
dw TCMPNGT ;A
|
||
dw TCMPFALSE ;B
|
||
dw TCMPNEQ?OQ ;C
|
||
dw TCMPGE ;D
|
||
dw TCMPGT ;E
|
||
dw TCMPTRUE ;F
|
||
dw TCMPEQ?OS ;10
|
||
dw TCMPLT?OQ ;11
|
||
dw TCMPLE?OQ ;12
|
||
dw TCMPUNORD?S ;13
|
||
dw TCMPNEQ?US ;14
|
||
dw TCMPNLT?UQ ;15
|
||
dw TCMPNLE?UQ ;16
|
||
dw TCMPORD?S ;17
|
||
dw TCMPEQ?US ;18
|
||
dw TCMPNGE?UQ ;19
|
||
dw TCMPNGT?UQ ;1A
|
||
dw TCMPFALSE?OS ;1B
|
||
dw TCMPNEQ?OS ;1C
|
||
dw TCMPGE?OQ ;1D
|
||
dw TCMPGT?OQ ;1E
|
||
dw TCMPTRUE?US ;1F
|
||
;-----------------------------------------------------------------------------
|
||
TBM1Table:
|
||
dw 0 ;/0
|
||
dw 0 ;/1
|
||
dw TBLSFILL ;/2
|
||
dw TBLCS ;/3
|
||
dw TTZMSK ;/4
|
||
dw TBLCIC ;/5
|
||
dw TBLSIC ;/6
|
||
dw TT1MSKC ;/7
|
||
;-----------------------------------------------------------------------------
|
||
TBM2Table:
|
||
dw 0 ;/0
|
||
dw TBLCMSK ;/1
|
||
dw 0 ;/2
|
||
dw 0 ;/3
|
||
dw 0 ;/4
|
||
dw 0 ;/5
|
||
dw TBLCI ;/6
|
||
dw 0 ;/7
|
||
;-----------------------------------------------------------------------------
|
||
TPERMIL2PDX:
|
||
dw TPERMILTD2PD
|
||
dw TPERMILTD2PD
|
||
dw TPERMILMO2PD
|
||
dw TPERMILMZ2PD
|
||
;-----------------------------------------------------------------------------
|
||
TPERMIL2PSX:
|
||
dw TPERMILTD2PS
|
||
dw TPERMILTD2PS
|
||
dw TPERMILMO2PS
|
||
dw TPERMILMZ2PS
|
||
;-----------------------------------------------------------------------------
|
||
BMI1: dw 0
|
||
dw TBLSR
|
||
dw TBLSMSK
|
||
dw TBLSI
|
||
dw 0
|
||
dw 0
|
||
dw 0
|
||
dw 0
|
||
;-----------------------------------------------------------------------------
|
||
T0F71N: dw 0 ;/0
|
||
dw 0 ;/1
|
||
dw TPSRLW ;/2
|
||
dw 0 ;/3
|
||
dw TPSRAW ;/4
|
||
dw 0 ;/5
|
||
dw TPSLLW ;/6
|
||
dw 0 ;/7
|
||
;-----------------------------------------------------------------------------
|
||
T0F72N: dw TPRORD ;/0
|
||
dw TPROLD ;/1
|
||
dw TPSRLD ;/2
|
||
dw 0 ;/3
|
||
dw TPSRAD ;/4
|
||
dw 0 ;/5
|
||
dw TPSLLD ;/6
|
||
dw 0 ;/7
|
||
;W1
|
||
dw TPRORQ ;/0
|
||
dw TPROLQ ;/1
|
||
dw 0 ;/2
|
||
dw 0 ;/3
|
||
dw TPSRAQ ;/4
|
||
dw 0 ;/5
|
||
dw 0 ;/6
|
||
dw 0 ;/7
|
||
;-----------------------------------------------------------------------------
|
||
T0F73N: dw 0 ;/0
|
||
dw 0 ;/1
|
||
dw 0 ;/2
|
||
dw TPSRLDQ ;/3
|
||
dw 0 ;/4
|
||
dw 0 ;/5
|
||
dw 0 ;/6
|
||
dw TPSLLDQ ;/7
|
||
;W1
|
||
dw 0 ;/0
|
||
dw 0 ;/1
|
||
dw TPSRLQ ;/2
|
||
dw TPSRLDQ ;/3
|
||
dw 0 ;/4
|
||
dw 0 ;/5
|
||
dw TPSLLQ ;/6
|
||
dw TPSLLDQ ;/7
|
||
;-----------------------------------------------------------------------------
|
||
T??C6N: dw 0 ;/0
|
||
dw TGATHERPF0DPS ;/1
|
||
dw TGATHERPF1DPS ;/2
|
||
dw 0 ;/3
|
||
dw 0 ;/4
|
||
dw TSCATTERPF0DPS ;/5
|
||
dw TSCATTERPF1DPS ;/6
|
||
dw 0 ;/7
|
||
;W1
|
||
dw 0 ;/0
|
||
dw TGATHERPF0DPD ;/1
|
||
dw TGATHERPF1DPD ;/2
|
||
dw 0 ;/3
|
||
dw 0 ;/4
|
||
dw TSCATTERPF0DPD ;/5
|
||
dw TSCATTERPF1DPD ;/6
|
||
dw 0 ;/7
|
||
;-----------------------------------------------------------------------------
|
||
T??C7N: dw 0 ;/0
|
||
dw TGATHERPF0QPS ;/1
|
||
dw TGATHERPF1QPS ;/2
|
||
dw 0 ;/3
|
||
dw 0 ;/4
|
||
dw TSCATTERPF0QPS ;/5
|
||
dw TSCATTERPF1QPS ;/6
|
||
dw 0 ;/7
|
||
;W1
|
||
dw 0 ;/0
|
||
dw TGATHERPF0QPD ;/1
|
||
dw TGATHERPF1QPD ;/2
|
||
dw 0 ;/3
|
||
dw 0 ;/4
|
||
dw TSCATTERPF0QPD ;/5
|
||
dw TSCATTERPF1QPD ;/6
|
||
dw 0 ;/7
|
||
;-----------------------------------------------------------------------------
|
||
C4C5Tab dd C4C500,C4C566,C4C5F3,C4C5F2
|
||
C438Tab dd C43800,C43866,C438F3,C438F2
|
||
C43ATab dd C43A00,C43A66,C43AF3,C43AF2
|
||
;-----------------------------------------------------------------------------
|
||
T6200Tab dd T620000,T620066,T6200F3,T6200F2
|
||
T6238Tab dd T623800,T623866,T6238F3,T6238F2
|
||
T623ATab dd T623A00,T623A66,T623AF3,T623AF2
|
||
;-----------------------------------------------------------------------------
|
||
if used StrLen
|
||
StrLen:
|
||
push rbx
|
||
mov edx,7
|
||
add rdx,rax
|
||
mov ebx,[rax]
|
||
add rax,4
|
||
.1: lea ecx,[rbx-01010101h]
|
||
xor ebx,-1
|
||
and ecx,ebx
|
||
mov ebx,[rax]
|
||
add rax,4
|
||
and ecx,80808080h
|
||
jz .1
|
||
test ecx,00008080h
|
||
jnz .2
|
||
shr ecx,16
|
||
add rax,2
|
||
.2: shl cl,1
|
||
sbb rax,rdx
|
||
pop rbx
|
||
ret
|
||
end if
|
||
|
||
DisAsm:
|
||
mov [I.SaveRSP],rsp
|
||
|
||
mov rsi,[I.Addr]
|
||
mov rdx,[I.Size]
|
||
mov eax,MaxInstructionLength
|
||
cmp rdx,rax
|
||
cmova rdx,rax
|
||
add rdx,rsi
|
||
mov r9,rdx
|
||
|
||
movzx edx,[I.Arch]
|
||
|
||
mov al,[rdx+DefCPU2AD]
|
||
mov [I.Address],al
|
||
mov al,[rdx+DefCPU2OS]
|
||
mov [I.Operand],al
|
||
|
||
mov [I.Table],InstTab
|
||
|
||
call ClrMagicBytes
|
||
|
||
.NextByte:
|
||
|
||
FetchB
|
||
cmp rsi,r9
|
||
ja ErrorDec
|
||
mov [LastByte],al
|
||
|
||
.NewTable:
|
||
|
||
mov ebx,[I.Table]
|
||
|
||
movzx eax,al
|
||
if bsf yyh.Size = bsr yyh.Size
|
||
shl eax,bsf yyh.Size
|
||
else
|
||
imul eax,yyh.Size
|
||
end if
|
||
xor ecx,ecx
|
||
|
||
cmp [I.Only],0 ;only one table?
|
||
jnz .SkipAdd
|
||
cmp [I.Operand],0
|
||
jz .SkipBBBB
|
||
mov ecx,1*yyh.Size
|
||
.SkipBBBB:
|
||
lea eax,[rax*3]
|
||
cmp [I.Arch],CPUX64
|
||
jnz .SkipX64
|
||
mov ecx,2*yyh.Size
|
||
test [I.PreREX],8 ;REX.W
|
||
jnz .SkipX64
|
||
xor ecx,ecx
|
||
cmp [I.Operand],0
|
||
jz .SkipAAA
|
||
mov ecx,1*yyh.Size
|
||
.SkipAAA:
|
||
lea edx,[rcx+rax]
|
||
movzx edx,word [rbx+rdx+yyh.Addr]
|
||
add edx,NextTab
|
||
test [rdx+xxh.Flags],_A
|
||
jz .SkipX64
|
||
mov ecx,2*yyh.Size
|
||
.SkipX64:
|
||
add eax,ecx
|
||
.SkipAdd:
|
||
add ebx,eax
|
||
|
||
movzx edx,word [rbx+yyh.Addr]
|
||
add edx,NextTab
|
||
xchg edx,ebx
|
||
|
||
mov [I.Item],ebx
|
||
|
||
test [rbx+xxh.Flags],_E+_T
|
||
jnz .SkipValue
|
||
mov al,[rbx+xxh.DefReg]
|
||
mov ah,al
|
||
and al,0xF
|
||
mov [I.Arg1.Reg],al
|
||
shr ah,4
|
||
mov [I.RandSize],ah
|
||
.SkipValue:
|
||
if 0
|
||
test [rbx+xxh.Flags+1],_D shr 8
|
||
jz .SkipDetect
|
||
movzx eax,[I.Operand]
|
||
add al,[I.W]
|
||
mov ax,word [rax*2+DefArgSize]
|
||
mov [I.Arg1.Type],al
|
||
mov [I.RandSize],ah
|
||
.SkipDetect:
|
||
end if
|
||
mov [I.SaveRSI],rsi
|
||
|
||
or eax,0xFFFFFFFF
|
||
mov ax,[rdx+yyh.Name]
|
||
mov dword [I.Name],eax
|
||
|
||
movzx eax,[rbx+xxh.Flags]
|
||
mov [I.Flags],ax
|
||
|
||
test al,_T
|
||
jz .SkipTableAddress
|
||
mov edx,[I.Item]
|
||
movzx edx,[rdx+xxh.NxtTab]
|
||
add edx,TTXXXX
|
||
.SkipTableAddress:
|
||
|
||
movzx eax,[rbx+xxh.Rtn]
|
||
add eax,RtnXX
|
||
call rax
|
||
|
||
xor cl,cl
|
||
xchg [I.NextByte],cl
|
||
or cl,cl
|
||
jnz .NextByte
|
||
|
||
xor cl,cl
|
||
xchg [I.NewTable],cl
|
||
or cl,cl
|
||
jnz .NewTable
|
||
|
||
cmp rsi,r9
|
||
ja ErrorDec
|
||
|
||
cmp [I.Mandatory66],0
|
||
jnz .IsMandatory66
|
||
test [I.PreREX],8 ;REX.W
|
||
jz .NoRXW
|
||
BitT I.Prefixes,P66
|
||
jc ErrorDec
|
||
.NoRXW:
|
||
.IsMandatory66:
|
||
if 1
|
||
mov al,[I.CurSeg]
|
||
or al,al
|
||
jz .SkipSegm
|
||
cmp al,[I.DefSeg]
|
||
jnz .SkipSegm
|
||
BitTS I.Prefixes,PSEG
|
||
cmp [I.PosSEG],0
|
||
jz ErrorDec
|
||
.SkipSegm:
|
||
end if
|
||
call SetArguments
|
||
|
||
mov al,[I.Arch]
|
||
cmp al,CPUX64
|
||
jz .SkipRand
|
||
test [I.Flags],_R
|
||
jz .SkipRand
|
||
BitTR I.Prefixes,P66
|
||
.SkipRand:
|
||
cmp al,CPUX64
|
||
jnz .SkipRand64
|
||
test [I.Flags],_R48
|
||
jz .SkipREX48
|
||
mov al,[I.NotW]
|
||
and byte [I.Prefixes],al
|
||
.SkipREX48:
|
||
test [I.Flags],_R64
|
||
jz .SkipRand64
|
||
BitTR I.Prefixes,P66
|
||
.SkipRand64:
|
||
|
||
BitT I.Prefixes,PF0
|
||
jnc .SkipLOCK
|
||
cmp [I.PossibleLOCK],0
|
||
jnz .SkipLOCK
|
||
cmp [I.PrefixNames],TLOCK
|
||
jz ErrorDec
|
||
.SkipLOCK:
|
||
|
||
BitT I.Prefixes,P4X
|
||
jnc .Skip4X
|
||
cmp [I.PrefixNames],TREX??
|
||
jz ErrorDec
|
||
.Skip4X:
|
||
|
||
BitT I.Prefixes,P66
|
||
jnc .Skip66
|
||
cmp [I.PrefixNames],TRAND
|
||
jz ErrorDec
|
||
.Skip66:
|
||
|
||
BitT I.Prefixes,P67
|
||
jnc .Skip67
|
||
cmp [I.PrefixNames],TADDR
|
||
jz ErrorDec
|
||
.Skip67:
|
||
|
||
BitT I.Prefixes,P9B
|
||
jnc .SkipWAIT
|
||
cmp [I.PrefixNames],TWAIT
|
||
jz ErrorDec
|
||
.SkipWAIT:
|
||
|
||
test [I.Flags],_B
|
||
jz .SkipBND
|
||
BitT I.Prefixes,PF2
|
||
jnc .SkipBND
|
||
movzx eax,[I.PosF2]
|
||
mov [rax*2+I.PrefixNames],TBND
|
||
mov [I.PossibleF2F3],True
|
||
.SkipBND:
|
||
|
||
test [I.Flags],_XA+_XR
|
||
jz .SkipXAXR
|
||
|
||
mov al,00h
|
||
test [I.Flags],_XA
|
||
jz .SkipXA
|
||
BitT I.Prefixes,PF2
|
||
setc al
|
||
.SkipXA:
|
||
mov ah,00h
|
||
test [I.Flags],_XR
|
||
jz .SkipXR
|
||
BitT I.Prefixes,PF3
|
||
setc ah
|
||
.SkipXR:
|
||
mov cl,[I.PosF2]
|
||
mov dx,TXACQUIRE
|
||
cmp ax,0001h
|
||
jz .IsF2
|
||
mov cl,[I.PosF3]
|
||
mov dx,TXRELEASE
|
||
cmp ax,0100h
|
||
jz .IsF3
|
||
cmp ax,0101h
|
||
jnz .SkipXAXR
|
||
mov cl,[I.PosF2]
|
||
mov ch,[I.PosF3]
|
||
mov dx,TXACQUIRE
|
||
cmp cl,ch
|
||
ja .IsF2F3
|
||
mov cl,ch
|
||
mov dx,TXRELEASE
|
||
jmp .IsF2F3
|
||
.IsF2: .IsF3:
|
||
mov eax,[I.Prefixes]
|
||
and al,11b
|
||
cmp al,11b
|
||
jnz .IsF2F3
|
||
mov [I.PossibleF2F3],True
|
||
.IsF2F3:
|
||
test [I.Flags],_L
|
||
jnz .SkipTestF0
|
||
BitT I.Prefixes,PF0
|
||
jnc .SkipXAXR
|
||
.SkipTestF0:
|
||
movzx eax,cl
|
||
mov [rax*2+I.PrefixNames],dx
|
||
.SkipXAXR:
|
||
|
||
BitT I.Prefixes,PF2
|
||
jnc .SkipF2
|
||
cmp [I.PossibleF2F3],0
|
||
jnz .SkipF2
|
||
cmp [I.PrefixNames],TREPNE
|
||
jz ErrorDec
|
||
.SkipF2:
|
||
|
||
BitT I.Prefixes,PF3
|
||
jnc .SkipF3
|
||
cmp [I.PossibleF2F3],0
|
||
jnz .SkipF3
|
||
cmp [I.PrefixNames],TREP
|
||
jz ErrorDec
|
||
.SkipF3:
|
||
|
||
cmp [I.DisplayHint],0
|
||
jz .SkipHint
|
||
test [I.Flags],_J
|
||
jz .SkipHint
|
||
cmp [I.Arch],CPUX64
|
||
jz .SkipHint
|
||
mov al,[I.CurSeg]
|
||
cmp al,3Eh
|
||
jz .IsHint
|
||
cmp al,2Eh
|
||
jz .IsHint
|
||
cmp al,64h
|
||
jnz .SkipHint
|
||
.IsHint:
|
||
BitTR I.Prefixes,PSEG
|
||
.SkipHint:
|
||
|
||
BitT I.Prefixes,PSEG
|
||
jnc .SkipPSEG
|
||
cmp [I.PosSEG],0
|
||
jz ErrorDec
|
||
.SkipPSEG:
|
||
|
||
mov rax,rsi
|
||
sub rax,[I.Addr]
|
||
RtnXX: ret
|
||
|
||
ErrorDec:
|
||
mov rsp,[I.SaveRSP]
|
||
|
||
mov eax,[I.PrefixesCpy]
|
||
mov [I.Prefixes],eax
|
||
|
||
mov [I.PrefixCount],1
|
||
|
||
cmp [I.Syntax],0
|
||
jnz .ForceDB
|
||
cmp [I.UseDB],0
|
||
jnz .ForceDB
|
||
movzx eax,[I.PrefixNames+0*2]
|
||
or eax,eax
|
||
jnz .Prefix
|
||
.ForceDB:
|
||
|
||
mov dword [I.Name],T?BYTE shl 16+TDB
|
||
|
||
mov [I.RandSize],0
|
||
mov [I.PrefixCount],0
|
||
|
||
mov rax,[I.Addr]
|
||
mov al,[rax]
|
||
mov [I.Arg1.ImmB],al
|
||
mov [I.Arg1.Type],80h+1
|
||
jmp .Continue
|
||
|
||
.Prefix:mov [I.Name],TNULL
|
||
mov [I.Arg1.Type],0
|
||
.Continue:
|
||
xor eax,eax
|
||
|
||
mov [I.Arg2.Type],al
|
||
mov [I.Arg3.Type],al
|
||
mov [I.Arg4.Type],al
|
||
mov [I.Arg5.Type],al
|
||
|
||
mov [I.Arg1.Mem],al
|
||
mov [I.Arg2.Mem],al
|
||
mov [I.Arg3.Mem],al
|
||
mov [I.Arg4.Mem],al
|
||
mov [I.Arg5.Mem],al
|
||
|
||
mov [I.Prefix],al
|
||
mov [I.LastByte],al
|
||
and dword [I.Suffix],eax
|
||
and dword [I.Suffix2nd],eax
|
||
|
||
mov [I.AAAA],al
|
||
mov [I.Z],al
|
||
|
||
mov [I.Relative],al ;* 23-06-2017
|
||
mov [I.IsAddress],al ;* 23-06-2017
|
||
|
||
mov [I.RandSize],al
|
||
mov [I.Point],ax
|
||
|
||
mov eax,1
|
||
ret
|
||
|
||
SetArguments:
|
||
|
||
call DetectMULT
|
||
|
||
cmp [I.VT],0
|
||
jz .L1
|
||
cmp [I.Indx],-1
|
||
jnz .L1
|
||
mov [I.Indx],4 ;fix for EVEX
|
||
.L1:
|
||
lea rdi,[I.Arg1]
|
||
call SetArgument
|
||
lea rdi,[I.Arg2]
|
||
call SetArgument
|
||
lea rdi,[I.Arg3]
|
||
call SetArgument
|
||
lea rdi,[I.Arg4]
|
||
call SetArgument
|
||
lea rdi,[I.Arg5]
|
||
SetArgument:
|
||
movzx eax,[rdi+TArg.Type2nd]
|
||
and al,7Fh
|
||
mov eax,[rax*4+SetArg]
|
||
jmp rax
|
||
|
||
SetArg dd .Exit,.RM,.Reg,.VVVV,.Exit
|
||
|
||
.RM:
|
||
cmp [I.Mod],3
|
||
setnz [rdi+TArg.Mem]
|
||
|
||
mov dl,[I.RM]
|
||
|
||
mov al,[rdi+TArg.Type]
|
||
and eax,0Fh
|
||
bt [TBIT],eax
|
||
jnc .XXXX
|
||
|
||
add dl,[I.B]
|
||
add dl,[I.XX]
|
||
|
||
cmp al,GPR08
|
||
jnz .NoB8
|
||
call ClearPRM
|
||
jmp .XXXX
|
||
.NoB8: call ClearBRM
|
||
jmp .XXXX
|
||
|
||
.Reg: mov dl,[I.Reg]
|
||
|
||
mov al,[rdi+TArg.Type]
|
||
and eax,0Fh
|
||
bt [TBIT],eax
|
||
jnc .XXXX
|
||
|
||
add dl,[I.R]
|
||
|
||
cmp al,GPR08
|
||
jnz .NoR8
|
||
call ClearP
|
||
jmp .XXXX
|
||
.NoR8: call ClearR
|
||
jmp .XXXX
|
||
|
||
.VVVV: mov dl,[I.VVVV]
|
||
.XXXX: add [rdi+TArg.Reg],dl
|
||
|
||
.Exit: ret
|
||
|
||
ClearR: mov al,[I.NotR]
|
||
and byte [I.Prefixes],al
|
||
ret
|
||
|
||
ClearPRM:
|
||
cmp [I.Mod],3
|
||
jnz ClearP.NoClear
|
||
ClearP: cmp dl,4
|
||
jb .NoClear
|
||
mov al,[I.NotP]
|
||
and byte [I.Prefixes],al
|
||
.NoClear:
|
||
ret
|
||
|
||
ClearBRM:
|
||
cmp [I.Mod],3
|
||
jnz ClearB.NoClear
|
||
ClearB: mov al,[I.NotB]
|
||
and byte [I.Prefixes],al
|
||
.NoClear:
|
||
ret
|
||
|
||
ClearW: mov al,[I.NotW]
|
||
and byte [I.Prefixes],al
|
||
ret
|
||
|
||
MakeSpace:
|
||
cmp r10,0
|
||
jnz .SkipFill
|
||
inc r10
|
||
push rdx
|
||
mov rdx,rdi
|
||
sub rdx,r9
|
||
mov r9,rcx
|
||
mov ecx,[SpaceSize]
|
||
sub rcx,rdx
|
||
pop rdx
|
||
ja .DoFill
|
||
mov ecx,1
|
||
cmp byte [rdi-1],32
|
||
jz .ZeroFill
|
||
.DoFill:
|
||
mov al,32
|
||
rep stosb
|
||
.ZeroFill:
|
||
mov rcx,r9
|
||
.SkipFill:
|
||
ret
|
||
|
||
ShowHint:
|
||
cmp [I.DisplayHint],0
|
||
jz .SkipHint
|
||
test [I.Flags],_J
|
||
jz .SkipHint
|
||
cmp [I.Arch],CPUX64
|
||
jz .SkipHint
|
||
mov si,TJ?
|
||
cmp [I.CurSeg],3Eh
|
||
jz .IsHint
|
||
mov si,TN?
|
||
cmp [I.CurSeg],2Eh
|
||
jz .IsHint
|
||
mov si,TA?
|
||
cmp [I.CurSeg],64h
|
||
jnz .SkipHint
|
||
.IsHint:
|
||
call MoveStringData
|
||
.SkipHint:
|
||
ret
|
||
|
||
PrnAsm:
|
||
mov rdi,[TheBufferO]
|
||
|
||
add [DefInst.Addr],rax
|
||
|
||
mov rsi,rax
|
||
mov rax,[Origin]
|
||
add [Origin],rsi
|
||
cmp [I.NoAddress],0
|
||
jnz .SkipAddr
|
||
|
||
cmp [TheL],0
|
||
jz .SkipL
|
||
mov byte [rdi],'L'
|
||
scasb
|
||
.SkipL:
|
||
if 0
|
||
or ecx,0xFFFFFFFF
|
||
cmp rax,rcx
|
||
setbe cl
|
||
mov ch,16
|
||
shr ch,cl
|
||
mov cl,ch
|
||
else
|
||
if %B=32
|
||
mov cl,8
|
||
else
|
||
mov cl,16
|
||
end if
|
||
end if
|
||
if ~OS
|
||
push rdi
|
||
end if
|
||
call Hex
|
||
if ~OS
|
||
push [LastNames]
|
||
end if
|
||
mov word [rdi],': '
|
||
scasw
|
||
.SkipAddr:
|
||
mov rax,rsi
|
||
|
||
cmp [I.ShowSize],0
|
||
jz .NoShowSize
|
||
mov byte [rdi],'('
|
||
scasb
|
||
mov bl,10
|
||
div bl
|
||
add ax,'00'
|
||
stosw
|
||
mov ax,') '
|
||
stosw
|
||
mov rax,rsi
|
||
.NoShowSize:
|
||
|
||
cmp [I.Medium],0
|
||
jnz .SkipCodeStr
|
||
mov edx,MaxInstructionLength+1
|
||
sub edx,eax
|
||
jc .SkipCodeStr
|
||
mov ecx,eax
|
||
or ecx,ecx
|
||
jz .Skip
|
||
mov r10,rcx
|
||
mov rsi,[I.Addr]
|
||
.Loop:
|
||
lodsb
|
||
mov ecx,[rax*2+HexString]
|
||
mov [rdi],cx
|
||
scasw
|
||
|
||
dec r10
|
||
jnz .Loop
|
||
|
||
lea ecx,[rdx*2+1]
|
||
mov al,32
|
||
rep stosb
|
||
.SkipCodeStr:
|
||
if ~OS
|
||
pop [LastNames]
|
||
xchg rdi,[rsp]
|
||
mov rsi,[LastNames]
|
||
or rsi,rsi
|
||
jz .SkipEmptyName
|
||
.LoopEmptyName:
|
||
mov al,[rsi]
|
||
or al,al
|
||
jz .LastEmptyName
|
||
mov [rdi],al
|
||
inc esi
|
||
inc edi
|
||
jmp .LoopEmptyName
|
||
.LastEmptyName:
|
||
if 1
|
||
mov [rdi],byte 32
|
||
inc edi
|
||
end if
|
||
.SkipEmptyName:
|
||
pop rdi
|
||
end if
|
||
xor edx,edx
|
||
mov r10,rdx ;no space
|
||
movzx ecx,[I.PrefixCount]
|
||
jrcxz .ZeroPrefixes
|
||
.LoopPrefixes:
|
||
movzx eax,[rdx*1+I.PrefixBites]
|
||
mov esi,dword [rdx*2+I.PrefixNames]
|
||
|
||
cmp [I.Syntax],0
|
||
jz .SkipSyn
|
||
mov ebx,dword [I.SegmName]
|
||
cmp al,PSEG
|
||
jz .MoveToESI
|
||
mov bx,TDATA
|
||
cmp al,P66
|
||
jz .MoveToESI
|
||
mov bx,TADDR
|
||
cmp al,P67
|
||
jz .MoveToESI
|
||
cmp al,PF0
|
||
jz .SkipSyn
|
||
cmp al,PF2
|
||
jz .SkipSyn
|
||
cmp al,PF3
|
||
jz .SkipSyn
|
||
jmp .SkipThisPrefix
|
||
.MoveToESI:
|
||
mov esi,ebx
|
||
.SkipSyn:
|
||
|
||
cmp al,P4X
|
||
jnz .SkipCheckREX
|
||
cmp [I.NoREX],0
|
||
jnz .SkipThisPrefix
|
||
.SkipCheckREX:
|
||
|
||
call ShowHint
|
||
|
||
bt [I.Prefixes],eax
|
||
jnc .SkipThisPrefix
|
||
mov r9,rdi
|
||
call MoveStringData
|
||
call MakeSpace
|
||
.SkipThisPrefix:
|
||
inc edx
|
||
loop .LoopPrefixes
|
||
.ZeroPrefixes:
|
||
|
||
movzx eax,[I.Syntax]
|
||
mov esi,dword [I.Name+rax*2]
|
||
cmp si,-1
|
||
cmovz esi,dword [I.Name]
|
||
mov r9,rdi
|
||
|
||
mov al,[I.Prefix]
|
||
or al,al
|
||
jz .SkipPrefix
|
||
stosb
|
||
.SkipPrefix:
|
||
call MoveStringData
|
||
|
||
mov eax,dword [I.Suffix2nd]
|
||
or eax,eax
|
||
jnz .SyntaxSuffix
|
||
mov eax,dword [I.Suffix]
|
||
cmp [I.Syntax],0
|
||
jz .SyntaxSuffix
|
||
test [I.Flags],_S
|
||
jz .SyntaxSuffix
|
||
movzx eax,[I.RandSize]
|
||
|
||
cmp [I.IsFloat],0
|
||
jz .NoFloat
|
||
and al,7Fh
|
||
mov ah,al
|
||
mov al,'s'
|
||
cmp ah,VDWORD
|
||
jz .SyntaxSuffix
|
||
mov al,'l'
|
||
cmp ah,VQWORD
|
||
jz .SyntaxSuffix
|
||
mov al,'t'
|
||
cmp ah,VTWORD
|
||
jz .SyntaxSuffix
|
||
xor ah,ah
|
||
.NoFloat:
|
||
|
||
or al,al
|
||
jz .SyntaxIntel
|
||
.SelectPoint:
|
||
cmp al,VQWORD
|
||
ja .SyntaxIntel
|
||
mov al,[rax+Suffixes]
|
||
.SyntaxSuffix:
|
||
or al,al
|
||
jz .SyntaxIntel
|
||
.StoreChar:
|
||
stosb
|
||
shr eax,8
|
||
cmp al,32
|
||
jae .StoreChar
|
||
.SyntaxIntel:
|
||
|
||
mov al,[I.LastByte]
|
||
or al,al
|
||
jz .NoModify
|
||
mov [rdi-1],al
|
||
.NoModify:
|
||
|
||
push r10
|
||
call MakeSpace
|
||
pop r10
|
||
cmp r10,0
|
||
jz .SkipSpace
|
||
mov al,32
|
||
stosb
|
||
.SkipSpace:
|
||
|
||
cmp [I.Syntax],0
|
||
jnz .SkipPoint
|
||
movzx esi,[I.Point]
|
||
or esi,esi
|
||
jz .SkipPoint
|
||
call MoveStringData
|
||
.SkipPoint:
|
||
|
||
r8 equ rbx
|
||
|
||
cmp [I.Syntax],0
|
||
jnz .SyntaxATT
|
||
lea r8,[I.Arg1]
|
||
call ParseArg
|
||
call MoveKandZ
|
||
lea r8,[I.Arg2]
|
||
call ParseArg
|
||
lea r8,[I.Arg3]
|
||
call ParseArg
|
||
lea r8,[I.Arg4]
|
||
call ParseArg
|
||
lea r8,[I.Arg5]
|
||
call ParseArg
|
||
test [I.MainFlags],00000001b
|
||
jnz .SkipSAE
|
||
call MoveSAE1
|
||
.SkipSAE:
|
||
jmp .Print
|
||
|
||
.SyntaxATT:
|
||
call MoveSAE2
|
||
lea r8,[I.Arg5]
|
||
call ParseArgATT
|
||
lea r8,[I.Arg4]
|
||
call ParseArgATT
|
||
lea r8,[I.Arg3]
|
||
call ParseArgATT
|
||
lea r8,[I.Arg2]
|
||
call ParseArgATT
|
||
lea r8,[I.Arg1]
|
||
call ParseArgATT
|
||
call MoveKandZ
|
||
.Print:
|
||
|
||
.ScanBack:
|
||
dec rdi
|
||
cmp byte [rdi],32
|
||
jz .ScanBack
|
||
scasb
|
||
|
||
lea rsi,[CrLf]
|
||
call MoveStringDataRSI
|
||
|
||
mov byte [rdi],0
|
||
if 1
|
||
mov rax,rdi
|
||
sub rax,[TheBufferO]
|
||
else
|
||
mov rax,[TheBufferO]
|
||
call StrLen
|
||
end if
|
||
if 0
|
||
cmp [I.Compression],0
|
||
jz .NoComp
|
||
Compress
|
||
.NoComp:
|
||
add [TheBufferO],rax
|
||
|
||
mov rdi,[TheBufferO]
|
||
cmp rdi,Buffer+BufferSizeO-255
|
||
jb .Skip
|
||
call PrintBuffer
|
||
mov [TheBufferO],Buffer
|
||
end if
|
||
.Skip:
|
||
ret
|
||
if 0
|
||
PrintBuffer:
|
||
mov edi,Buffer
|
||
mov rcx,[TheBufferO]
|
||
sub rcx,rdi
|
||
jbe .DoNotWrite
|
||
mov rdx,rdi
|
||
call WriteBlock
|
||
jc WriteErr
|
||
.DoNotWrite:
|
||
ret
|
||
end if
|
||
MoveStringData:
|
||
movzx esi,si
|
||
add esi,Names
|
||
MoveStringDataRSI:
|
||
@@:
|
||
movsb
|
||
cmp byte [rdi-1],0
|
||
jnz @B
|
||
dec rdi
|
||
ret
|
||
|
||
AddVT:
|
||
cmp [I.VT],0
|
||
jz .Old
|
||
|
||
movzx edx,[I.VT]
|
||
mov edx,[rdx*4+AD2Regs]
|
||
.Old:
|
||
cmp [I.VT],0
|
||
jz .TTTT
|
||
add al,[I.V]
|
||
.TTTT:
|
||
cmp [I.Arch],CPUX64
|
||
jz .VVVV
|
||
and al,00111b
|
||
.VVVV:
|
||
ret
|
||
|
||
StoreSegment:
|
||
cmp [I.IsLEA],0
|
||
jnz .SkipSegm
|
||
mov al,[I.CurSeg]
|
||
or al,al
|
||
jz .SkipSegm
|
||
cmp al,[I.DefSeg]
|
||
jz .SkipSegm
|
||
mov si,[I.SegmName]
|
||
cmp si,TNULL
|
||
jz .SkipSegm
|
||
|
||
cmp [I.Syntax],0
|
||
jz .SkipPercent
|
||
mov al,'%'
|
||
stosb
|
||
.SkipPercent:
|
||
|
||
call MoveStringData
|
||
mov al,':'
|
||
stosb
|
||
.SkipSegm:
|
||
ret
|
||
|
||
ParseArgATT:
|
||
mov [I.HexPrefix],True
|
||
|
||
cmp [r8+TArg.Mem],0
|
||
jnz .SkipType
|
||
cmp [r8+TArg.Type],0
|
||
jz ParseArg.SkipArg
|
||
.SkipType:
|
||
|
||
cmp [I.IsCALLJMP],0
|
||
jz .No
|
||
mov al,'*'
|
||
stosb
|
||
.No:
|
||
mov rax,r8
|
||
xchg [I.LastArg],rax
|
||
or rax,rax
|
||
jz .Arg1st
|
||
mov al,','
|
||
stosb
|
||
.Arg1st:
|
||
|
||
cmp [r8+TArg.Type2nd],Is1
|
||
jz .Put1
|
||
test [r8+TArg.Type],10h
|
||
jnz .PtrATT
|
||
test [r8+TArg.Type],80h
|
||
jnz ParseArg.ImmATT
|
||
cmp [r8+TArg.Mem],0
|
||
jz .Reg
|
||
.Mem:
|
||
call StoreSegment
|
||
|
||
mov cl,[I.MULT]
|
||
cmp [I.DispSize],1
|
||
jnz .NoMULT
|
||
mov ch,byte [I.Disp+1]
|
||
sal [I.Disp],cl
|
||
cmp ch,byte [I.Disp+1]
|
||
jz .NoMULT
|
||
inc [I.DispSize]
|
||
.NoMULT:
|
||
|
||
mov al,[I.DispSize]
|
||
or al,al
|
||
jz .SkipDisp
|
||
|
||
mov rax,[I.Disp]
|
||
if %B=32
|
||
mov edx,[I.Disp+4]
|
||
test [I.MainFlags],80h
|
||
jnz .SkipCDQ
|
||
cmp [I.DispSize],4
|
||
ja .SkipCDQ
|
||
cdq
|
||
.SkipCDQ:
|
||
end if
|
||
cmp byte [rdi-1],'['
|
||
jz .SkipNegate
|
||
cmp [I.Negate],0
|
||
jz .SkipNegate
|
||
if %B=64
|
||
or rax,rax
|
||
else
|
||
cmp [I.Arch],CPUX64
|
||
jz .Arch64
|
||
.Arch64:or eax,eax
|
||
jmp .ArchXX
|
||
or edx,edx
|
||
.ArchXX:
|
||
end if
|
||
jns .SkipNegate
|
||
mov byte [rdi],'-'
|
||
scasb
|
||
.NoPlus:
|
||
neg rax
|
||
if %B=32
|
||
adc edx,0
|
||
neg edx
|
||
end if
|
||
.SkipNegate:
|
||
|
||
mov cl,[I.DispSize]
|
||
add cl,cl
|
||
if %B=32
|
||
cmp cl,8
|
||
jbe .SkipHigh
|
||
push eax
|
||
mov eax,edx
|
||
mov cl,8
|
||
call Bin2Hex32
|
||
pop eax
|
||
mov cl,8
|
||
call Hex
|
||
jmp .SkipDisp
|
||
.SkipHigh:
|
||
end if
|
||
call Bin2Hex
|
||
.SkipDisp:
|
||
|
||
cmp [I.Relative],0
|
||
jnz .SkipCheck
|
||
mov al,[I.Base]
|
||
and al,[I.Indx]
|
||
cmp al,-1
|
||
jz .SkipBaseIndx
|
||
.SkipCheck:
|
||
|
||
mov al,'('
|
||
stosb
|
||
|
||
movzx eax,[I.Address]
|
||
mov edx,[rax*4+AD2Regs]
|
||
|
||
cmp [I.Relative],0
|
||
jz .SkipRels
|
||
mov byte [rdi],'%'
|
||
scasb
|
||
mov esi,[16*2+rdx]
|
||
call MoveStringData
|
||
dec rdi
|
||
.SkipRels:
|
||
|
||
mov al,[I.Base]
|
||
cmp al,-1
|
||
jz .SkipBase
|
||
|
||
call AddVT.TTTT
|
||
|
||
mov byte [rdi],'%'
|
||
scasb
|
||
mov esi,[rax*2+rdx]
|
||
call MoveStringData
|
||
.SkipBase:
|
||
|
||
mov al,[I.Indx]
|
||
cmp al,-1
|
||
jz .SkipIndx
|
||
|
||
call AddVT
|
||
|
||
mov word [rdi],',%'
|
||
scasw
|
||
mov esi,[rax*2+rdx]
|
||
call MoveStringData
|
||
mov al,','
|
||
stosb
|
||
mov al,[I.Scale]
|
||
cmp al,-1
|
||
jz .SkipScale
|
||
mov al,[rax+Scales]
|
||
stosb
|
||
.SkipScale:
|
||
|
||
.SkipIndx:
|
||
mov al,')'
|
||
stosb
|
||
|
||
.SkipBaseIndx:
|
||
|
||
call MoveXtoX
|
||
|
||
ret
|
||
.Reg:
|
||
mov al,'%'
|
||
stosb
|
||
jmp ParseArg.Reg
|
||
|
||
.PtrATT:
|
||
mov ax,'(%'
|
||
stosw
|
||
|
||
movzx eax,[I.Address]
|
||
mov edx,[rax*4+AD2Regs]
|
||
|
||
mov al,[r8+TArg.Reg]
|
||
mov esi,dword [rax*2+rdx]
|
||
call MoveStringData
|
||
|
||
jmp .SkipIndx
|
||
|
||
ParseArg.SkipArg:
|
||
ret
|
||
|
||
ParseArgATT.Put1:
|
||
mov al,'$'
|
||
stosb
|
||
ParseArg.Put1:
|
||
mov al,'1'
|
||
stosb
|
||
ret
|
||
|
||
ParseArg:
|
||
test [r8+TArg.Type],80h
|
||
jz .NoIMM
|
||
or [I.MainFlags],00000001b
|
||
call MoveSAE1
|
||
.NoIMM:
|
||
cmp [r8+TArg.Mem],0
|
||
jnz .SkipType
|
||
cmp [r8+TArg.Type],0
|
||
jz .SkipArg
|
||
.SkipType:
|
||
lea rax,[I.Arg1]
|
||
cmp r8,rax
|
||
jz .Arg1st
|
||
test [r8+TArg.Type2nd],80h
|
||
jz .NoPlusReg
|
||
mov ax,'+3'
|
||
stosw
|
||
.NoPlusReg:
|
||
mov al,','
|
||
cmp [I.MemSeparator],0
|
||
jz .NoSeparate
|
||
mov al,':'
|
||
.NoSeparate:
|
||
stosb
|
||
.Arg1st:
|
||
|
||
cmp [r8+TArg.Type2nd],Is1
|
||
jz .Put1
|
||
test [r8+TArg.Type],10h
|
||
jnz .Ptr
|
||
test [r8+TArg.Type],80h
|
||
jnz .Imm
|
||
|
||
cmp [r8+TArg.Mem],0
|
||
jz .Reg
|
||
.Mem:
|
||
movzx eax,[I.Address]
|
||
mov edx,[rax*4+AD2Regs]
|
||
|
||
movzx eax,[I.RandSize]
|
||
|
||
cmp [I.NoShowRand],0
|
||
jnz .SkipRand
|
||
cmp [I.ShowRand],0
|
||
jnz .DoShowIt
|
||
test [I.Flags],_O
|
||
jnz .SkipRand
|
||
bt eax,7
|
||
jc .SkipRand
|
||
.DoShowIt:
|
||
and al,7Fh
|
||
mov esi,dword [rax*2+SZ2Name]
|
||
call MoveStringData
|
||
.SkipRand:
|
||
|
||
cmp [I.Fasm],0
|
||
jnz .SkipSegm
|
||
call StoreSegment
|
||
.SkipSegm:
|
||
|
||
mov al,'['
|
||
stosb
|
||
|
||
cmp [I.Fasm],0
|
||
jz .SegmSkip
|
||
call StoreSegment
|
||
.SegmSkip:
|
||
|
||
cmp [I.Fasm],0
|
||
jz .SkipSizeOvr
|
||
BitT I.PrefixesCpy,P67
|
||
jnc .NoAddress
|
||
cmp [I.Relative],0
|
||
jnz .NoAddress
|
||
mov al,[I.Base]
|
||
and al,[I.Indx]
|
||
cmp al,-1
|
||
jnz .NoAddress
|
||
movzx eax,[I.DispSize]
|
||
bsf eax,eax
|
||
mov esi,dword [rax*2+SZ2Mems]
|
||
call MoveStringData
|
||
jmp .SkipSizeOvr
|
||
.NoAddress:
|
||
movzx eax,[I.DispSize]
|
||
or al,al
|
||
jz .SkipSizeOvr
|
||
mov rcx,[I.Disp]
|
||
bsf eax,eax
|
||
cmp rcx,[rax*_8_+SZ2Mask]
|
||
ja .SkipSizeOvr
|
||
if %B=32
|
||
cmp eax,3
|
||
jnz .SkipSizeQWs
|
||
cmp [I.Disp+4],0
|
||
ja .SkipSizeOvr
|
||
.SkipSizeQWs:
|
||
end if
|
||
mov esi,dword [rax*2+SZ2Mems]
|
||
call MoveStringData
|
||
.SkipSizeOvr:
|
||
|
||
mov al,[I.Base]
|
||
cmp al,-1
|
||
jz .SkipBase
|
||
call AddVT.TTTT
|
||
mov esi,[rax*2+rdx]
|
||
call MoveStringData
|
||
.SkipBase:
|
||
mov al,[I.Indx]
|
||
cmp al,-1
|
||
jz .SkipIndx
|
||
|
||
cmp [I.Base],-1
|
||
jz .Skip1
|
||
mov byte [rdi],'+'
|
||
scasb
|
||
.Skip1:
|
||
|
||
call AddVT
|
||
|
||
mov esi,[rax*2+rdx]
|
||
call MoveStringData
|
||
.SkipIndx:
|
||
mov al,[I.Indx]
|
||
cmp al,-1
|
||
jz .SkipScale
|
||
mov al,[I.Scale]
|
||
cmp al,-1
|
||
jz .SkipScale
|
||
cmp [I.ShowScale],0
|
||
jnz .DoShowScale
|
||
or al,al
|
||
jz .SkipScale
|
||
.DoShowScale:
|
||
mov ah,[rax+Scales]
|
||
mov al,'*'
|
||
stosw
|
||
.SkipScale:
|
||
|
||
mov cl,[I.MULT]
|
||
cmp [I.DispSize],1
|
||
jnz .NoMULT
|
||
mov ch,byte [I.Disp+1]
|
||
sal [I.Disp],cl
|
||
cmp ch,byte [I.Disp+1]
|
||
jz .NoMULT
|
||
inc [I.DispSize]
|
||
.NoMULT:
|
||
|
||
mov al,[I.DispSize]
|
||
or al,al
|
||
jz .SkipDisp
|
||
|
||
mov al,[I.Base]
|
||
and al,[I.Indx]
|
||
cmp al,-1
|
||
jz .Skip2
|
||
mov byte [rdi],'+'
|
||
scasb
|
||
.Skip2:
|
||
|
||
cmp [I.Relative],0
|
||
jz .SkipRels
|
||
cmp [I.HideRIP],0
|
||
jnz .HideRels
|
||
mov esi,[16*2+rdx]
|
||
call MoveStringData
|
||
jmp .SkipRels
|
||
.HideRels:
|
||
mov [I.DispSize],8
|
||
mov rax,[I.Disp]
|
||
add rax,[Origin]
|
||
if %B=32
|
||
mov edx,[I.Disp+4]
|
||
adc edx,0
|
||
end if
|
||
cmp [I.Address],AD64
|
||
jz .SkipCut
|
||
mov eax,eax
|
||
mov [I.DispSize],4
|
||
.SkipCut:
|
||
mov [I.Disp],rax
|
||
if %B=32
|
||
mov [I.Disp+4],edx
|
||
end if
|
||
.SkipRels:
|
||
mov rax,[I.Disp]
|
||
if %B=32
|
||
mov edx,[I.Disp+4]
|
||
test [I.MainFlags],80h
|
||
jnz .SkipCDQ
|
||
cmp [I.DispSize],4
|
||
ja .SkipCDQ
|
||
cdq
|
||
.SkipCDQ:
|
||
end if
|
||
cmp [TheL],0
|
||
jz .SkipL
|
||
cmp [I.DispSize],4
|
||
jb .SkipL
|
||
cmp byte [rdi-1],'+'
|
||
jz .SkipL
|
||
mov byte [rdi],'L'
|
||
scasb
|
||
jmp .SkipNegate
|
||
.SkipL:
|
||
|
||
cmp byte [rdi-1],'['
|
||
jz .SkipNegate
|
||
cmp [I.Negate],0
|
||
jz .SkipNegate
|
||
cmp [I.DispSize],8
|
||
jz .SkipNegate
|
||
if %B=64
|
||
or rax,rax
|
||
else
|
||
cmp [I.Arch],CPUX64
|
||
jz .Arch64
|
||
.Arch64:or eax,eax
|
||
jmp .ArchXX
|
||
or edx,edx
|
||
.ArchXX:
|
||
end if
|
||
jns .SkipNegate
|
||
cmp byte [rdi-1],'+'
|
||
jnz .NoPlus
|
||
mov byte [rdi-1],'-'
|
||
.NoPlus:
|
||
neg rax
|
||
if %B=32
|
||
adc edx,0
|
||
neg edx
|
||
end if
|
||
.SkipNegate:
|
||
|
||
mov cl,[I.DispSize]
|
||
add cl,cl
|
||
if %B=32
|
||
cmp cl,8
|
||
jbe .SkipHigh
|
||
push eax
|
||
mov eax,edx
|
||
mov cl,8
|
||
call Bin2Hex32
|
||
pop eax
|
||
mov cl,8
|
||
call Hex
|
||
jmp .SkipDisp
|
||
.SkipHigh:
|
||
end if
|
||
call Bin2Hex
|
||
.SkipDisp:
|
||
|
||
mov al,']'
|
||
stosb
|
||
|
||
call MoveXtoX
|
||
|
||
ret
|
||
|
||
.Ptr:
|
||
test [r8+TArg.Type],20h
|
||
jz .RandSkip
|
||
movzx eax,[I.RandSize]
|
||
mov esi,dword [rax*2+SZ2Name]
|
||
call MoveStringData
|
||
.RandSkip:
|
||
|
||
mov al,'['
|
||
stosb
|
||
|
||
movzx eax,[I.Address]
|
||
mov edx,[rax*4+AD2Regs]
|
||
|
||
mov al,[r8+TArg.Reg]
|
||
mov esi,dword [rax*2+rdx]
|
||
call MoveStringData
|
||
.SkipAddr:
|
||
|
||
jmp .SkipDisp
|
||
|
||
.Reg:
|
||
movzx eax,[r8+TArg.Type]
|
||
mov edx,[(rax-1)*4+SZ2Regs]
|
||
|
||
cmp al,GPR08
|
||
jnz .SkipByte
|
||
cmp [I.P],0
|
||
jz .SkipByte
|
||
mov edx,[IntelName]
|
||
.SkipByte:
|
||
|
||
movzx eax,[r8+TArg.Reg]
|
||
mov esi,[rax*2+rdx]
|
||
call MoveStringData
|
||
ret
|
||
|
||
.ImmATT:
|
||
mov [I.Dollar],0
|
||
cmp [I.IsAddress],0
|
||
jnz .ImmContinue
|
||
mov byte [rdi],'$'
|
||
scasb
|
||
jmp .ImmContinue
|
||
.Imm:
|
||
cmp [I.IsShort],0
|
||
jz .NoShort
|
||
mov si,TSHORT
|
||
call MoveStringData
|
||
.NoShort:
|
||
|
||
mov cl,[r8+TArg.Type]
|
||
test cl,20h
|
||
jz .ImmContinue
|
||
and ecx,0Fh
|
||
bsf ecx,ecx
|
||
mov esi,dword [(rcx+1)*2+SZ2Name]
|
||
call MoveStringData
|
||
.ImmContinue:
|
||
mov rax,[r8+TArg.Imm]
|
||
if %B=32
|
||
mov edx,[r8+TArg.Imm+4]
|
||
test [r8+TArg.Type],8
|
||
jnz .SkipImmCDQ
|
||
cdq
|
||
.SkipImmCDQ:
|
||
end if
|
||
mov cl,[r8+TArg.Type]
|
||
test cl,40h
|
||
jz .SkipNeg
|
||
if %B=64
|
||
or rax,rax
|
||
else
|
||
or edx,edx
|
||
end if
|
||
jns .SkipNeg
|
||
mov byte [rdi],'-'
|
||
scasb
|
||
neg rax
|
||
if %B=32
|
||
adc edx,0
|
||
neg edx
|
||
end if
|
||
.SkipNeg:
|
||
cmp [I.IsAddress],0
|
||
if %B=32
|
||
jnz .Hex32
|
||
else
|
||
jnz .Hex
|
||
end if
|
||
and cl,0Fh
|
||
add cl,cl
|
||
if %B=32
|
||
cmp cl,8
|
||
jbe .SkipHigh32
|
||
push eax
|
||
mov eax,edx
|
||
mov cl,8
|
||
call Bin2Hex32
|
||
pop eax
|
||
mov cl,8
|
||
call Hex
|
||
jmp .SkipDisp32
|
||
.SkipHigh32:
|
||
end if
|
||
call Bin2Hex
|
||
.SkipDisp32:
|
||
ret
|
||
if %B=32
|
||
.Hex32: or edx,edx
|
||
jz .Hex
|
||
push eax
|
||
mov eax,edx
|
||
call .Hex
|
||
pop eax
|
||
mov cl,8
|
||
jmp Hex
|
||
end if
|
||
.Hex: mov cl,16
|
||
mov edx,-1
|
||
cmp rax,rdx
|
||
ja .DoHex
|
||
mov cl,8
|
||
.DoHex:
|
||
cmp [I.HexPrefix],0
|
||
je .L1
|
||
mov word [rdi],'0x'
|
||
scasw
|
||
if 1
|
||
cmp [I.IsAddress],0
|
||
jz .L2
|
||
cmp [TheL],0
|
||
jz .L2
|
||
dec rdi
|
||
mov byte [rdi-1],'L'
|
||
end if
|
||
jmp .L2
|
||
.L1:
|
||
cmp [I.Dollar],0
|
||
jne .L2
|
||
mov byte [rdi],'$'
|
||
scasb
|
||
if 1
|
||
cmp [I.IsAddress],0
|
||
jz .L2
|
||
cmp [TheL],0
|
||
jz .L2
|
||
mov byte [rdi-1],'L'
|
||
end if
|
||
.L2:
|
||
call Hex
|
||
ret
|
||
|
||
PrefixErrorDec:
|
||
cmp [I.PosSEG],0
|
||
jz ErrorDec
|
||
mov [I.SegmName],TNULL ;ignore this prefix
|
||
ret
|
||
|
||
Rtn6465:
|
||
movzx eax,byte [rsi-1]
|
||
mov [I.CurSeg],al
|
||
|
||
mov dx,[(rax-60h)*2+NSEGR]
|
||
mov [I.SegmName],dx
|
||
mov dx,[(rax-60h)*2+NSEGX]
|
||
jmp Rtn262E363E.C6464
|
||
|
||
Rtn262E363E64:
|
||
push PrefixErrorDec
|
||
Rtn262E363E:
|
||
movzx eax,byte [rsi-1]
|
||
mov [I.CurSeg],al
|
||
|
||
shr al,3
|
||
mov dx,[(rax-4)*2+NSEGR]
|
||
mov [I.SegmName],dx
|
||
mov dx,[(rax-4)*2+NSEGX]
|
||
.C6464:
|
||
movzx eax,[I.PrefixCount]
|
||
mov [rax*2+I.PrefixNames],dx
|
||
mov [rax+I.PrefixBites],PSEG
|
||
inc [I.PrefixCount]
|
||
|
||
BitTS I.PrefixesCpy,PSEG
|
||
BitTS I.Prefixes,PSEG
|
||
jnc @F
|
||
cmp [I.PosSEG],0
|
||
jz ErrorDec
|
||
@@:
|
||
mov [I.PosSEG],al
|
||
|
||
call ClrMagicBytes
|
||
|
||
mov [I.NextByte],1
|
||
ret
|
||
|
||
Rtn4X:
|
||
mov al,[rsi-1]
|
||
mov [I.PreREX],al
|
||
|
||
call SetMagicBytes
|
||
|
||
movzx eax,[I.PrefixCount]
|
||
mov [rax*2+I.PrefixNames],TREX??
|
||
mov [rax+I.PrefixBites],P4X
|
||
inc [I.PrefixCount]
|
||
mov [I.Name],TNULL
|
||
|
||
BitTS I.PrefixesCpy,P4X
|
||
BitTS I.Prefixes,P4X
|
||
jnc @F
|
||
cmp [I.Pos4X],0
|
||
jz ErrorDec
|
||
@@:
|
||
mov [I.Pos4X],al
|
||
|
||
mov al,[rsi-1]
|
||
mov ax,[rax*2+HexString]
|
||
mov word [Names+TREX??+3],ax
|
||
|
||
mov [I.NextByte],1
|
||
ret
|
||
Rtn66:
|
||
movzx eax,[I.Arch]
|
||
mov al,[rax+XorCPU2OS]
|
||
mov [I.Operand],al
|
||
|
||
movzx eax,[I.PrefixCount]
|
||
mov [rax*2+I.PrefixNames],TRAND
|
||
mov [rax+I.PrefixBites],P66
|
||
inc [I.PrefixCount]
|
||
|
||
mov [I.Name],TNULL
|
||
|
||
BitTS I.PrefixesCpy,P66
|
||
BitTS I.PrefixByte,P66
|
||
BitTS I.Prefixes,P66
|
||
jnc @F
|
||
cmp [I.Pos66],0
|
||
jz ErrorDec
|
||
@@:
|
||
mov [I.Pos66],al
|
||
|
||
call ClrMagicBytes
|
||
|
||
mov [I.NextByte],1
|
||
ret
|
||
Rtn67:
|
||
movzx eax,[I.Arch]
|
||
mov al,[rax+XorCPU2AD]
|
||
mov [I.Address],al
|
||
|
||
movzx eax,[I.PrefixCount]
|
||
mov [rax*2+I.PrefixNames],TADDR
|
||
mov [rax+I.PrefixBites],P67
|
||
inc [I.PrefixCount]
|
||
|
||
mov [I.Name],TNULL
|
||
|
||
BitTS I.PrefixesCpy,P67
|
||
BitTS I.Prefixes,P67
|
||
jnc @F
|
||
cmp [I.Pos67],0
|
||
jz ErrorDec
|
||
@@:
|
||
mov [I.Pos67],al
|
||
|
||
call ClrMagicBytes
|
||
|
||
mov [I.NextByte],1
|
||
ret
|
||
Rtn9B:
|
||
movzx eax,[I.PrefixCount]
|
||
mov [rax*2+I.PrefixNames],TWAIT
|
||
mov [rax+I.PrefixBites],P9B
|
||
inc [I.PrefixCount]
|
||
|
||
mov [I.Name],TNULL
|
||
|
||
BitTS I.PrefixesCpy,P9B
|
||
BitTS I.Prefixes,P9B
|
||
jnc @F
|
||
cmp [I.Pos9B],0
|
||
jz ErrorDec
|
||
@@:
|
||
mov [I.Pos9B],al
|
||
|
||
mov [I.NextByte],1
|
||
ret
|
||
|
||
RtnF0:
|
||
movzx eax,[I.PrefixCount]
|
||
mov [rax*2+I.PrefixNames],TLOCK
|
||
mov [rax+I.PrefixBites],PF0
|
||
inc [I.PrefixCount]
|
||
|
||
mov [I.Name],TNULL
|
||
|
||
BitTS I.PrefixesCpy,PF0
|
||
BitTS I.Prefixes,PF0
|
||
jnc @F
|
||
cmp [I.PosF0],0
|
||
jz ErrorDec
|
||
@@:
|
||
mov [I.PosF0],al
|
||
|
||
call ClrMagicBytes
|
||
|
||
mov [I.NextByte],1
|
||
ret
|
||
RtnF2:
|
||
movzx eax,[I.PrefixCount]
|
||
mov [rax*2+I.PrefixNames],TREPNE
|
||
mov [rax+I.PrefixBites],PF2
|
||
inc [I.PrefixCount]
|
||
|
||
mov [I.Name],TNULL
|
||
|
||
BitTS I.PrefixesCpy,PF2
|
||
BitTS I.PrefixByte,PF2
|
||
BitTS I.Prefixes,PF2
|
||
jnc @F
|
||
cmp [I.PosF2],0
|
||
jz ErrorDec
|
||
@@:
|
||
mov [I.PosF2],al
|
||
|
||
call ClrMagicBytes
|
||
|
||
mov [I.NextByte],1
|
||
ret
|
||
RtnF3:
|
||
movzx eax,[I.PrefixCount]
|
||
mov [rax*2+I.PrefixNames],TREP
|
||
mov [rax+I.PrefixBites],PF3
|
||
inc [I.PrefixCount]
|
||
|
||
mov [I.Name],TNULL
|
||
|
||
BitTS I.PrefixesCpy,PF3
|
||
BitTS I.PrefixByte,PF3
|
||
BitTS I.Prefixes,PF3
|
||
jnc @F
|
||
cmp [I.PosF3],0
|
||
jz ErrorDec
|
||
@@:
|
||
mov [I.PosF3],al
|
||
|
||
call ClrMagicBytes
|
||
|
||
mov [I.NextByte],1
|
||
ret
|
||
|
||
RtnF1: cmp [I.Syntax],0
|
||
jz .2
|
||
mov [I.Name],TICEBP
|
||
.2:
|
||
test [I.Sensitive],UND
|
||
jz .1
|
||
mov [I.Name],TSMI
|
||
.1: ret
|
||
|
||
r8b equ cl
|
||
r8 equ rcx
|
||
|
||
Rtn8F: mov al,[rsi]
|
||
and al,38h
|
||
shr al,3
|
||
jz EXTINST
|
||
|
||
cmp [I.PreREX],0
|
||
jnz ErrorDec
|
||
|
||
FetchB
|
||
mov ah,al
|
||
;and al,11100000b ;XOP.RXB
|
||
xor al,11100000b
|
||
shr al,5
|
||
mov [I.PreREX],al
|
||
|
||
call SetMagicBytes
|
||
|
||
mov [I.P],1
|
||
|
||
mov al,ah
|
||
and al,11111b
|
||
mov edx,StrTabXOP8
|
||
cmp al,8
|
||
jb ErrorDec
|
||
je .Z1
|
||
mov edx,StrTabXOP9
|
||
cmp al,9
|
||
je .Z1
|
||
mov edx,StrTabXOPA
|
||
cmp al,0Ah
|
||
ja ErrorDec
|
||
.Z1: mov [I.MMMMM],al
|
||
|
||
FetchB
|
||
mov ah,al
|
||
and al,01111000b
|
||
xor al,01111000b
|
||
shr al,3
|
||
mov [I.VVVV],al
|
||
|
||
mov al,ah
|
||
test al,11b
|
||
jnz ErrorDec
|
||
|
||
and al,10000100b ;Mask XOP.W & XOP.L
|
||
mov [I.XOP],al
|
||
|
||
FetchB
|
||
mov [I.SaveRSI],rsi
|
||
|
||
.Z2: cmp dword [rdx],-1
|
||
je ErrorDec
|
||
cmp al,[rdx+XOP.Imm]
|
||
jz .Z3
|
||
add edx,XOP.Size
|
||
jmp .Z2
|
||
.Z3:
|
||
mov [I.Prefix],'v'
|
||
|
||
mov al,[rdx+XOP.Flags]
|
||
mov [I.FlagsXOP],al
|
||
test al,XOPV
|
||
jz .Z4
|
||
cmp [I.VVVV],0
|
||
jnz ErrorDec
|
||
.Z4:
|
||
and al,XOPW+XOPL
|
||
test [I.XOP],al
|
||
jnz ErrorDec
|
||
|
||
mov r8b,XMMRG shl 4+XMMRG
|
||
|
||
mov eax,dword [rdx+XOP.MOS]
|
||
test [I.XOP],XOPL
|
||
jz .Z5
|
||
mov r8b,YMMRG shl 4+YMMRG
|
||
shr eax,8
|
||
.Z5: mov [I.RandSize],al
|
||
|
||
movzx ebx,[rdx+XOP.Rtn]
|
||
add ebx,RtnXX
|
||
|
||
mov edx,dword [rdx+XOP.Name]
|
||
mov [I.Name],dx
|
||
|
||
push r8
|
||
call .Arg
|
||
call rbx
|
||
pop r8
|
||
.Arg:
|
||
test [I.FlagsXOP],XOP2
|
||
jz .Z6
|
||
and r8b,0x0F
|
||
or r8b,XMMRG shl 4
|
||
.Z6:
|
||
test [I.FlagsXOP],XOP1
|
||
jz .Z7
|
||
and r8b,0xF0
|
||
or r8b,XMMRG
|
||
.Z7:
|
||
mov al,r8b
|
||
and al,0Fh
|
||
mov [I.Arg1.Type],al
|
||
shr r8b,4
|
||
mov [I.Arg2.Type],r8b
|
||
ret
|
||
;-----------------------------------------------------------------------------
|
||
XOP3Rtn:call FetchModRM
|
||
mov [I.Arg1.Type2nd],InReg
|
||
mov [I.Arg3.Type],XMMRG
|
||
test [I.XOP],XOPW
|
||
jz .L1
|
||
;cmp [I.Mod],3
|
||
;setnz [I.Arg3.Mem]
|
||
mov [I.Arg2.Type2nd],InVVVV
|
||
mov [I.Arg3.Type2nd],InRM
|
||
ret
|
||
.L1: ;cmp [I.Mod],3
|
||
;setnz [I.Arg2.Mem]
|
||
mov [I.Arg3.Type2nd],InVVVV
|
||
mov [I.Arg2.Type2nd],InRM
|
||
ret
|
||
;-----------------------------------------------------------------------------
|
||
;encoded bh,vvvv,bl,imm7:4 / bh,vvvv,bl,imm7:4 - W0 / W1
|
||
;-----------------------------------------------------------------------------
|
||
XOP4Rtn:
|
||
call FetchModRM
|
||
mov [I.Arg1.Type2nd],InReg
|
||
mov [I.Arg2.Type2nd],InVVVV
|
||
mov al,[I.Arg1.Type]
|
||
mov [I.Arg3.Type],al
|
||
mov [I.Arg4.Type],al
|
||
|
||
test [I.XOP],XOPW
|
||
jnz .L1
|
||
|
||
;cmp [I.Mod],3
|
||
;setnz [I.Arg3.Mem]
|
||
mov [I.Arg3.Type2nd],InRM
|
||
test [I.FlagsXOP],XOPI
|
||
jnz .I1
|
||
ret
|
||
.I1:
|
||
FetchB
|
||
shr al,4
|
||
mov [I.Arg4.Reg],al
|
||
ret
|
||
.L1:
|
||
;cmp [I.Mod],3
|
||
;setnz [I.Arg4.Mem]
|
||
mov [I.Arg4.Type2nd],InRM
|
||
test [I.FlagsXOP],XOPI
|
||
jnz .I2
|
||
ret
|
||
.I2:
|
||
FetchB
|
||
shr al,4
|
||
mov [I.Arg3.Reg],al
|
||
ret
|
||
;-----------------------------------------------------------------------------
|
||
XOPImm8:call RtnXOP
|
||
FetchB
|
||
mov [I.Arg3.Type],80h+1
|
||
mov [I.Arg3.ImmB],al
|
||
ret
|
||
;-----------------------------------------------------------------------------
|
||
SuffixCOMUQ:
|
||
mov bx,'uq'
|
||
jmp SuffixCOMB.1
|
||
;-----------------------------------------------------------------------------
|
||
SuffixCOMUD:
|
||
mov bx,'ud'
|
||
jmp SuffixCOMB.1
|
||
;-----------------------------------------------------------------------------
|
||
SuffixCOMUW:
|
||
mov bx,'uw'
|
||
jmp SuffixCOMB.1
|
||
;-----------------------------------------------------------------------------
|
||
SuffixCOMUB:
|
||
mov bx,'ub'
|
||
jmp SuffixCOMB.1
|
||
;-----------------------------------------------------------------------------
|
||
SuffixCOMQ:
|
||
mov bx,'q'
|
||
jmp SuffixCOMB.1
|
||
;-----------------------------------------------------------------------------
|
||
SuffixCOMD:
|
||
mov bx,'d'
|
||
jmp SuffixCOMB.1
|
||
;-----------------------------------------------------------------------------
|
||
SuffixCOMW:
|
||
mov bx,'w'
|
||
jmp SuffixCOMB.1
|
||
;-----------------------------------------------------------------------------
|
||
SuffixCOMB:
|
||
mov bx,'b'
|
||
.1:
|
||
mov word [I.Suffix2nd],bx
|
||
call XOP4Rtn
|
||
xor eax,eax
|
||
FetchB
|
||
cmp al,7
|
||
jbe .L1
|
||
.L0: mov [I.Arg4.Type],80h+1
|
||
mov [I.Arg4.ImmB],al
|
||
ret
|
||
.L1: mov eax,[rax*2+TablePCOM]
|
||
mov [I.Name],ax
|
||
mov [I.Arg4.Type],0 ;delete
|
||
ret
|
||
;-----------------------------------------------------------------------------
|
||
RtnTBM0:
|
||
add rsp,2*_8_ ;remove r8 & return
|
||
|
||
mov [I.RandSize],VDWORD+80h
|
||
mov ebx,R32RM32
|
||
test [I.XOP],XOPW
|
||
jz .L1
|
||
cmp [I.Arch],CPUX64
|
||
jne .L1
|
||
mov [I.RandSize],VQWORD+80h
|
||
mov ebx,R64RM64
|
||
.L1:
|
||
cmp [I.Arch],CPUX64
|
||
je .L2
|
||
mov [I.B],0
|
||
mov [I.R],0
|
||
mov [I.X],0
|
||
.L2:
|
||
mov [I.Prefix],0
|
||
mov [I.Name],TBEXTR
|
||
call rbx
|
||
FetchD
|
||
mov [I.Arg3.Type],80h+4
|
||
mov [I.Arg3.Imm],rax
|
||
ret
|
||
;-----------------------------------------------------------------------------
|
||
RtnLWPCB:
|
||
add rsp,2*_8_ ;remove r8 & return
|
||
|
||
call FetchModRM
|
||
cmp [I.Mod],3
|
||
jne ErrorDec
|
||
mov [I.Arg1.Type2nd],InRM
|
||
mov [I.Arg1.Type],GPR32
|
||
test [I.XOP],XOPW
|
||
jz .1
|
||
mov [I.Arg1.Type],GPR64
|
||
.1:
|
||
mov dx,TSLWPCB
|
||
cmp [I.Reg],1
|
||
je .2
|
||
ja ErrorDec
|
||
mov dx,TLLWPCB
|
||
.2: mov [I.Name],dx
|
||
mov [I.Arg2.Type],0 ;delete
|
||
mov [I.Prefix],0
|
||
ret
|
||
;-----------------------------------------------------------------------------
|
||
RtnLWPxx:
|
||
add rsp,2*_8_ ;remove r8 & return
|
||
|
||
call FetchModRM
|
||
|
||
mov [I.RandSize],VDWORD+80h
|
||
|
||
mov dx,TLWPVAL
|
||
cmp [I.Reg],1
|
||
je .2
|
||
ja ErrorDec
|
||
mov dx,TLWPINS
|
||
.2: mov [I.Name],dx
|
||
mov [I.Prefix],0
|
||
|
||
mov [I.Arg1.Type],GPR32
|
||
mov [I.Arg2.Type],GPR32
|
||
test [I.XOP],XOPW
|
||
jz .1
|
||
mov [I.Arg1.Type],GPR64
|
||
.1:
|
||
mov [I.Arg1.Type2nd],InVVVV
|
||
;cmp [I.Mod],3
|
||
;setnz [I.Arg2.Mem]
|
||
mov [I.Arg2.Type2nd],InRM
|
||
|
||
FetchD
|
||
mov [I.Arg3.Type],80h+4
|
||
mov [I.Arg3.Imm],rax
|
||
ret
|
||
;-----------------------------------------------------------------------------
|
||
r8d equ edi
|
||
r8 equ rdi
|
||
RtnTBM2:mov r15d,TBM2Table
|
||
jmp RtnTBM1.L0
|
||
RtnTBM1:mov r15d,TBM1Table
|
||
.L0:
|
||
add rsp,2*_8_ ;remove r8 & return
|
||
|
||
mov [I.RandSize],VDWORD+80h
|
||
mov r8d,R32RM32
|
||
test [I.XOP],XOPW
|
||
jz .L1
|
||
cmp [I.Arch],CPUX64
|
||
jne .L1
|
||
mov [I.RandSize],VQWORD+80h
|
||
mov r8d,R64RM64
|
||
.L1:
|
||
cmp [I.Arch],CPUX64
|
||
je .L2
|
||
mov [I.B],0
|
||
mov [I.R],0
|
||
mov [I.X],0
|
||
and [I.VVVV],111b
|
||
.L2:
|
||
call FetchModRM
|
||
mov rsi,[I.SaveRSI]
|
||
|
||
movzx eax,[I.Reg]
|
||
if %B=32
|
||
mov rdx,r15
|
||
mov edx,[rax*2+rdx]
|
||
else
|
||
mov edx,[rax*2+r15]
|
||
end if
|
||
or dx,dx
|
||
jz ErrorDec
|
||
mov [I.Prefix],0
|
||
mov [I.Name],dx
|
||
|
||
call r8
|
||
mov [I.Arg1.Type2nd],InVVVV
|
||
ret
|
||
;-----------------------------------------------------------------------------
|
||
RtnC6: mov al,[rsi]
|
||
and al,38h
|
||
shr al,3
|
||
jz EXTINSONE
|
||
FetchB
|
||
cmp al,0xF8
|
||
jnz ErrorDec
|
||
mov [I.Name],TXABORT
|
||
FetchB
|
||
mov [I.Arg1.Type],80h+1
|
||
mov [I.Arg1.Imm],rax
|
||
ret
|
||
|
||
RtnC7: mov al,[rsi]
|
||
and al,38h
|
||
shr al,3
|
||
jz EXTINST
|
||
FetchB
|
||
cmp al,0xF8
|
||
jnz ErrorDec
|
||
BitTR I.Prefixes,P66
|
||
mov [I.Name],TXBEGIN
|
||
DODISPWD:
|
||
cmp [I.Operand],0
|
||
jnz DODISPD
|
||
jmp DODISPW
|
||
|
||
EXTINSTFF:
|
||
mov al,[rsi]
|
||
and al,38h
|
||
shr al,3
|
||
;
|
||
cmp al,2
|
||
jb EXTINST
|
||
cmp al,5
|
||
ja EXTINST
|
||
;
|
||
mov [I.IsCALLJMP],True
|
||
jmp EXTINST
|
||
|
||
EXTINSONEFLT:
|
||
mov [I.IsFloat],1
|
||
EXTINSONE:
|
||
mov [I.Only],1
|
||
EXTINST:
|
||
mov eax,[I.Item]
|
||
movzx eax,[rax+xxh.NxtTab]
|
||
add eax,EXT80
|
||
mov [I.Table],eax
|
||
|
||
mov al,[rsi]
|
||
and al,38h
|
||
shr al,3
|
||
mov [I.NewTable],1
|
||
ret
|
||
|
||
Rtn0F: movzx eax,byte [rsi]
|
||
shr al,4 ;Lose low nibble.
|
||
|
||
bt [EXTBITS],eax
|
||
setc [I.Only]
|
||
|
||
mov eax,[rax*4+EXT0F] ;Get new table address.
|
||
mov [I.Table],eax
|
||
|
||
FetchB
|
||
and al,0Fh ;Make sure only lower nibble counts.
|
||
mov [I.NewTable],1
|
||
ret
|
||
|
||
Rtn9X16:
|
||
mov [I.Arg1.Type],GPR16
|
||
mov [I.Arg2.Type],GPR16
|
||
jmp Rtn9XXX
|
||
Rtn9X32:
|
||
mov [I.Arg1.Type],GPR32
|
||
mov [I.Arg2.Type],GPR32
|
||
jmp Rtn9XXX
|
||
Rtn9X64:
|
||
mov [I.Arg1.Type],GPR64
|
||
mov [I.Arg2.Type],GPR64
|
||
Rtn9XXX:
|
||
mov al,[rsi-1]
|
||
and al,0Fh
|
||
jnz .No90
|
||
|
||
cmp [I.PrefixByte],bit PF3
|
||
jz .IsPause
|
||
|
||
cmp [I.PrefixByte],0
|
||
jnz .No90
|
||
cmp [I.B],0
|
||
jnz .No90
|
||
mov [I.Name],TNOP
|
||
jmp .PauseNOP
|
||
.IsPause:
|
||
BitTR I.Prefixes,PF3
|
||
mov [I.Name],TPAUSE
|
||
.PauseNOP:
|
||
and [I.Flags],not _S
|
||
mov [I.Arg1.Type],0
|
||
mov [I.Arg2.Type],0
|
||
ret
|
||
|
||
.No90:
|
||
add al,[I.B]
|
||
mov [I.Arg1.Reg],al
|
||
call ClearB
|
||
ret
|
||
|
||
Rtn9864:mov [I.AltName],TCLTQ
|
||
ret
|
||
Rtn9816:mov [I.AltName],TCBTW
|
||
ret
|
||
Rtn9832:mov [I.AltName],TCWTL
|
||
ret
|
||
|
||
Rtn9964:mov [I.AltName],TCQTO
|
||
ret
|
||
Rtn9916:mov [I.AltName],TCWTD
|
||
ret
|
||
Rtn9932:mov [I.AltName],TCLTD
|
||
ret
|
||
|
||
RtnEA: mov [I.AltName],TLJMP
|
||
jmp RtnXA
|
||
Rtn9A: mov [I.AltName],TLCALL
|
||
RtnXA:
|
||
r10 equ rbx
|
||
mov [I.MemSeparator],True
|
||
lea r10,[I.Arg1]
|
||
lea rax,[I.Arg2]
|
||
mov r8,rax
|
||
xor r8,r10
|
||
|
||
cmp [I.Syntax],0
|
||
jnz .ATT
|
||
xor r10,r8
|
||
.ATT:
|
||
mov al,[I.Operand]
|
||
or al,al
|
||
jz .W
|
||
jmp .D
|
||
.W: mov [I.RandSize],VWORD
|
||
mov [I.Point],TDWORD
|
||
FetchW
|
||
movzx eax,ax
|
||
mov [r10+TArg.Type],80h+2
|
||
jmp .X
|
||
.D: mov [I.RandSize],VDWORD
|
||
mov [I.Point],TFWORD
|
||
FetchD
|
||
mov [r10+TArg.Type],80h+4
|
||
.X: mov [r10+TArg.Imm],rax
|
||
FetchW
|
||
movzx eax,ax
|
||
xor r10,r8
|
||
mov [r10+TArg.Type],80h+2
|
||
mov [r10+TArg.Imm],rax
|
||
ret
|
||
|
||
RtnF16: mov [I.Suffix],'w'
|
||
ret
|
||
|
||
RtnF32: mov [I.Suffix],'d'
|
||
ret
|
||
|
||
RtnF64: mov [I.Suffix],'q'
|
||
ret
|
||
|
||
RtnA0: mov al,[I.Arch]
|
||
cmp al,CPUX16
|
||
jz RtnA016
|
||
cmp al,CPUX32
|
||
jz RtnA032
|
||
jmp RtnA064
|
||
|
||
RtnA016:
|
||
mov [I.Arg1.Type],GPR08
|
||
|
||
BitTR I.Prefixes,P67
|
||
jc .D
|
||
mov [I.DispSize],2
|
||
FetchW
|
||
movzx eax,ax
|
||
jmp .X
|
||
.D: mov [I.DispSize],4
|
||
FetchUD
|
||
.X:
|
||
mov [I.Arg2.Type],GPR08
|
||
mov [I.Arg2.Mem],True
|
||
mov [I.Disp],rax
|
||
call ClearSeg
|
||
mov [I.PossibleLOCK],True
|
||
ret
|
||
|
||
RtnA032:
|
||
mov [I.Arg1.Type],GPR08
|
||
|
||
BitTR I.Prefixes,P67
|
||
jc .W
|
||
mov [I.DispSize],4
|
||
FetchUD
|
||
jmp .X
|
||
.W: mov [I.DispSize],2
|
||
FetchW
|
||
movzx eax,ax
|
||
.X:
|
||
mov [I.Arg2.Type],GPR08
|
||
mov [I.Arg2.Mem],True
|
||
mov [I.Disp],rax
|
||
call ClearSeg
|
||
mov [I.PossibleLOCK],True
|
||
ret
|
||
|
||
RtnA064:
|
||
mov [I.Arg1.Type],GPR08
|
||
|
||
BitTR I.Prefixes,P67
|
||
jc .D
|
||
mov [I.DispSize],8
|
||
FetchQ
|
||
if %B=32
|
||
mov [I.Disp+4],edx
|
||
end if
|
||
jmp .X
|
||
.D: mov [I.DispSize],4
|
||
FetchUD
|
||
.X:
|
||
mov [I.Arg2.Type],GPR08
|
||
mov [I.Arg2.Mem],True
|
||
mov [I.Disp],rax
|
||
call ClearSeg
|
||
mov [I.PossibleLOCK],True
|
||
ret
|
||
|
||
RtnA1: mov al,[I.Arch]
|
||
cmp al,CPUX16
|
||
jz RtnA116
|
||
cmp al,CPUX32
|
||
jz RtnA132
|
||
jmp RtnA164
|
||
|
||
RtnA116:
|
||
mov al,GPR16
|
||
mov [I.RandSize],VWORD
|
||
BitTR I.Prefixes,P66
|
||
jnc .16
|
||
mov al,GPR32
|
||
mov [I.RandSize],VDWORD
|
||
.16:
|
||
mov [I.Arg1.Type],al
|
||
mov [I.Arg2.Type],al
|
||
|
||
BitTR I.Prefixes,P67
|
||
jc .D
|
||
mov [I.DispSize],2
|
||
FetchW
|
||
movzx eax,ax
|
||
jmp .X
|
||
.D: mov [I.DispSize],4
|
||
FetchUD
|
||
.X:
|
||
mov [I.Arg2.Mem],True
|
||
mov [I.Disp],rax
|
||
call ClearSeg
|
||
mov [I.PossibleLOCK],True
|
||
ret
|
||
|
||
RtnA132:
|
||
mov al,GPR16
|
||
mov [I.RandSize],VWORD
|
||
BitTR I.Prefixes,P66
|
||
jc .16
|
||
mov al,GPR32
|
||
mov [I.RandSize],VDWORD
|
||
.16:
|
||
mov [I.Arg1.Type],al
|
||
mov [I.Arg2.Type],al
|
||
|
||
BitTR I.Prefixes,P67
|
||
jc .W
|
||
mov [I.DispSize],4
|
||
FetchUD
|
||
jmp .X
|
||
.W: mov [I.DispSize],2
|
||
FetchW
|
||
movzx eax,ax
|
||
.X:
|
||
mov [I.Arg2.Mem],True
|
||
mov [I.Disp],rax
|
||
call ClearSeg
|
||
mov [I.PossibleLOCK],True
|
||
ret
|
||
|
||
RtnA164:
|
||
mov al,GPR16
|
||
mov [I.RandSize],VWORD
|
||
BitTR I.Prefixes,P66
|
||
jc .16
|
||
mov al,GPR32
|
||
mov [I.RandSize],VDWORD
|
||
.16:
|
||
cmp [I.W],0
|
||
jz .XX
|
||
mov al,GPR64
|
||
mov [I.RandSize],VQWORD
|
||
.XX:
|
||
mov [I.Arg1.Type],al
|
||
mov [I.Arg2.Type],al
|
||
|
||
BitTR I.Prefixes,P67
|
||
jc .D
|
||
mov [I.DispSize],8
|
||
FetchQ
|
||
if %B=32
|
||
mov [I.Disp+4],edx
|
||
end if
|
||
jmp .X
|
||
.D: mov [I.DispSize],4
|
||
FetchUD
|
||
.X:
|
||
mov [I.Arg2.Mem],True
|
||
mov [I.Disp],rax
|
||
call ClearSeg
|
||
mov [I.PossibleLOCK],True
|
||
ret
|
||
|
||
RtnA2: mov al,[I.Arch]
|
||
cmp al,CPUX16
|
||
jz RtnA216
|
||
cmp al,CPUX32
|
||
jz RtnA232
|
||
jmp RtnA264
|
||
ret
|
||
|
||
RtnA216:
|
||
mov [I.Arg2.Type],GPR08
|
||
|
||
BitTR I.Prefixes,P67
|
||
jc .D
|
||
mov [I.DispSize],2
|
||
FetchW
|
||
movzx eax,ax
|
||
jmp .X
|
||
.D: mov [I.DispSize],4
|
||
FetchUD
|
||
.X:
|
||
mov [I.Arg1.Type],GPR08
|
||
mov [I.Arg1.Mem],True
|
||
mov [I.Disp],rax
|
||
call ClearSeg
|
||
mov [I.PossibleLOCK],True
|
||
ret
|
||
|
||
RtnA232:
|
||
mov [I.Arg2.Type],GPR08
|
||
|
||
BitTR I.Prefixes,P67
|
||
jc .W
|
||
mov [I.DispSize],4
|
||
FetchUD
|
||
jmp .X
|
||
.W: mov [I.DispSize],2
|
||
FetchW
|
||
movzx eax,ax
|
||
.X:
|
||
mov [I.Arg1.Type],GPR08
|
||
mov [I.Arg1.Mem],True
|
||
mov [I.Disp],rax
|
||
call ClearSeg
|
||
mov [I.PossibleLOCK],True
|
||
ret
|
||
|
||
RtnA264:
|
||
mov [I.Arg2.Type],GPR08
|
||
|
||
BitTR I.Prefixes,P67
|
||
jc .D
|
||
mov [I.DispSize],8
|
||
FetchQ
|
||
if %B=32
|
||
mov [I.Disp+4],edx
|
||
end if
|
||
jmp .X
|
||
.D: mov [I.DispSize],4
|
||
FetchUD
|
||
.X:
|
||
mov [I.Arg1.Type],GPR08
|
||
mov [I.Arg1.Mem],True
|
||
mov [I.Disp],rax
|
||
call ClearSeg
|
||
mov [I.PossibleLOCK],True
|
||
ret
|
||
|
||
RtnA3: mov al,[I.Arch]
|
||
cmp al,CPUX16
|
||
jz RtnA316
|
||
cmp al,CPUX32
|
||
jz RtnA332
|
||
jmp RtnA364
|
||
ret
|
||
|
||
RtnA316:
|
||
mov al,GPR16
|
||
mov [I.RandSize],VWORD
|
||
BitTR I.Prefixes,P66
|
||
jnc .16
|
||
mov al,GPR32
|
||
mov [I.RandSize],VDWORD
|
||
.16:
|
||
mov [I.Arg1.Type],al
|
||
mov [I.Arg2.Type],al
|
||
|
||
BitTR I.Prefixes,P67
|
||
jc .D
|
||
mov [I.DispSize],2
|
||
FetchW
|
||
movzx eax,ax
|
||
jmp .X
|
||
.D: mov [I.DispSize],4
|
||
FetchUD
|
||
.X:
|
||
mov [I.Arg1.Mem],True
|
||
mov [I.Disp],rax
|
||
call ClearSeg
|
||
mov [I.PossibleLOCK],True
|
||
ret
|
||
|
||
RtnA332:
|
||
mov al,GPR16
|
||
mov [I.RandSize],VWORD
|
||
BitTR I.Prefixes,P66
|
||
jc .16
|
||
mov al,GPR32
|
||
mov [I.RandSize],VDWORD
|
||
.16:
|
||
mov [I.Arg1.Type],al
|
||
mov [I.Arg2.Type],al
|
||
|
||
BitTR I.Prefixes,P67
|
||
jc .W
|
||
mov [I.DispSize],4
|
||
FetchUD
|
||
jmp .X
|
||
.W: mov [I.DispSize],2
|
||
FetchW
|
||
movzx eax,ax
|
||
.X:
|
||
mov [I.Arg1.Mem],True
|
||
mov [I.Disp],rax
|
||
call ClearSeg
|
||
mov [I.PossibleLOCK],True
|
||
ret
|
||
|
||
RtnA364:
|
||
mov al,GPR16
|
||
mov [I.RandSize],VWORD
|
||
BitTR I.Prefixes,P66
|
||
jc .16
|
||
mov al,GPR32
|
||
mov [I.RandSize],VDWORD
|
||
.16:
|
||
cmp [I.W],0
|
||
jz .XX
|
||
mov al,GPR64
|
||
mov [I.RandSize],VQWORD
|
||
.XX:
|
||
mov [I.Arg1.Type],al
|
||
mov [I.Arg2.Type],al
|
||
|
||
BitTR I.Prefixes,P67
|
||
jc .D
|
||
mov [I.DispSize],8
|
||
FetchQ
|
||
if %B=32
|
||
mov [I.Disp+4],edx
|
||
end if
|
||
jmp .X
|
||
.D: mov [I.DispSize],4
|
||
FetchUD
|
||
.X:
|
||
mov [I.Arg1.Mem],True
|
||
mov [I.Disp],rax
|
||
call ClearSeg
|
||
mov [I.PossibleLOCK],True
|
||
ret
|
||
|
||
RtnMOVX:
|
||
mov [I.PossibleF2F3],True
|
||
|
||
mov [I.AltName],TMOVS
|
||
|
||
test byte [I.Prefixes],bit PSEG+bit P67
|
||
jz .SkipATT
|
||
|
||
BitTR I.Prefixes,P67
|
||
|
||
mov [I.Name],TMOVS
|
||
mov [I.NoShowRand],True
|
||
|
||
mov [I.Base],RRSI
|
||
|
||
mov [I.Arg1.Type],10h+20h
|
||
mov [I.Arg1.Reg],RRDI
|
||
|
||
mov [I.Arg2.Type],1
|
||
mov [I.Arg2.Mem],True
|
||
|
||
call ClearSeg
|
||
.SkipATT:
|
||
ret
|
||
|
||
RtnCMPX:
|
||
mov [I.PossibleF2F3],True
|
||
|
||
mov [I.AltName],TCMPS
|
||
|
||
test byte [I.Prefixes],bit PSEG+bit P67
|
||
jz .SkipATT
|
||
|
||
BitTR I.Prefixes,P67
|
||
|
||
mov [I.Name],TCMPS
|
||
|
||
mov [I.Base],RRSI
|
||
|
||
mov [I.Arg2.Type],10h
|
||
mov [I.Arg2.Reg],RRDI
|
||
|
||
mov [I.Arg1.Type],1
|
||
mov [I.Arg1.Mem],True
|
||
|
||
call ClearSeg
|
||
.SkipATT:
|
||
ret
|
||
|
||
RtnSTOX:
|
||
mov [I.PossibleF2F3],True
|
||
|
||
mov [I.AltName],TSTOS
|
||
|
||
BitTR I.Prefixes,P67
|
||
jnc .SkipATT
|
||
|
||
mov [I.Name],TSTOS
|
||
|
||
mov [I.Arg1.Reg],RRDI
|
||
mov [I.Arg1.Type],10h+20h
|
||
.SkipATT:
|
||
ret
|
||
|
||
RtnLODX:
|
||
mov [I.PossibleF2F3],True
|
||
|
||
mov [I.AltName],TLODS
|
||
|
||
test byte [I.Prefixes],bit PSEG+bit P67
|
||
jz .SkipATT
|
||
|
||
BitTR I.Prefixes,P67
|
||
|
||
mov [I.Name],TLODS
|
||
|
||
mov [I.Base],RRSI
|
||
|
||
mov [I.Arg1.Type],1
|
||
mov [I.Arg1.Mem],True
|
||
|
||
call ClearSeg
|
||
.SkipATT:
|
||
ret
|
||
|
||
RtnSCAX:
|
||
mov [I.PossibleF2F3],True
|
||
|
||
mov [I.AltName],TSCAS
|
||
|
||
BitTR I.Prefixes,P67
|
||
jnc .SkipATT
|
||
|
||
mov [I.Name],TSCAS
|
||
|
||
mov [I.Arg1.Reg],RRDI
|
||
mov [I.Arg1.Type],10h+20h
|
||
.SkipATT:
|
||
ret
|
||
|
||
R8IMM8:
|
||
mov al,[rsi-1]
|
||
and al,0Fh
|
||
add al,[I.B]
|
||
mov [I.Arg1.Reg],al
|
||
call ClearB
|
||
|
||
mov [I.Arg1.Type],GPR08
|
||
|
||
FetchSB
|
||
mov [I.Arg2.Type],80h+1
|
||
mov [I.Arg2.Imm],rax
|
||
ret
|
||
|
||
R16IMM16:
|
||
mov al,[rsi-1]
|
||
sub al,0xB8
|
||
add al,[I.B]
|
||
mov [I.Arg1.Reg],al
|
||
call ClearB
|
||
|
||
mov [I.Arg1.Type],GPR16
|
||
|
||
FetchSW
|
||
mov [I.Arg2.Type],80h+2
|
||
mov [I.Arg2.Imm],rax
|
||
ret
|
||
|
||
R32IMM32:
|
||
mov al,[rsi-1]
|
||
sub al,0xB8
|
||
add al,[I.B]
|
||
mov [I.Arg1.Reg],al
|
||
call ClearB
|
||
|
||
mov [I.Arg1.Type],GPR32
|
||
|
||
FetchSD
|
||
mov [I.Arg2.Type],80h+4
|
||
mov [I.Arg2.Imm],rax
|
||
ret
|
||
|
||
R64IMM64:
|
||
mov al,[rsi-1]
|
||
sub al,0xB8
|
||
add al,[I.B]
|
||
mov [I.Arg1.Reg],al
|
||
call ClearB
|
||
|
||
mov [I.Arg1.Type],GPR64
|
||
|
||
FetchQ
|
||
if %B=32
|
||
mov [I.Arg2.Imm+4],edx
|
||
end if
|
||
mov [I.Arg2.Type],80h+8
|
||
mov [I.Arg2.Imm],rax
|
||
ret
|
||
|
||
RM8R8: call FetchModRM
|
||
|
||
;cmp [I.Mod],3
|
||
;setnz [I.Arg1.Mem]
|
||
mov [I.Arg1.Type],GPR08
|
||
mov [I.Arg1.Type2nd],InRM
|
||
|
||
mov [I.Arg2.Type],GPR08
|
||
mov [I.Arg2.Type2nd],InReg
|
||
ret
|
||
|
||
RM8IMM8:call FetchModRM
|
||
|
||
;cmp [I.Mod],3
|
||
;setnz [I.Arg1.Mem]
|
||
mov [I.Arg1.Type],GPR08
|
||
mov [I.Arg1.Type2nd],InRM
|
||
|
||
FetchB
|
||
mov [I.Arg2.Type],80h+1
|
||
mov [I.Arg2.Imm],rax
|
||
ret
|
||
|
||
RM16IMM16:
|
||
call FetchModRM
|
||
|
||
;cmp [I.Mod],3
|
||
;setnz [I.Arg1.Mem]
|
||
mov [I.Arg1.Type],GPR16
|
||
mov [I.Arg1.Type2nd],InRM
|
||
|
||
FetchSW
|
||
mov [I.Arg2.Type],80h+2
|
||
mov [I.Arg2.Imm],rax
|
||
ret
|
||
|
||
RM32IMM32:
|
||
call FetchModRM
|
||
|
||
;cmp [I.Mod],3
|
||
;setnz [I.Arg1.Mem]
|
||
mov [I.Arg1.Type],GPR32
|
||
mov [I.Arg1.Type2nd],InRM
|
||
|
||
FetchSD
|
||
mov [I.Arg2.Type],80h+4
|
||
mov [I.Arg2.Imm],rax
|
||
ret
|
||
|
||
RM64IMM32:
|
||
call FetchModRM
|
||
|
||
;cmp [I.Mod],3
|
||
;setnz [I.Arg1.Mem]
|
||
mov [I.Arg1.Type],GPR64
|
||
mov [I.Arg1.Type2nd],InRM
|
||
|
||
FetchSD
|
||
mov [I.Arg2.Type],80h+40h+4
|
||
mov [I.Arg2.Imm],rax
|
||
ret
|
||
|
||
RM16IMMS8:
|
||
call FetchModRM
|
||
|
||
;cmp [I.Mod],3
|
||
;setnz [I.Arg1.Mem]
|
||
mov [I.Arg1.Type],GPR16
|
||
mov [I.Arg1.Type2nd],InRM
|
||
|
||
FetchSB
|
||
mov [I.Arg2.Type],80h+40h+20h+1
|
||
mov [I.Arg2.Imm],rax
|
||
ret
|
||
|
||
RM32IMMS8:
|
||
call FetchModRM
|
||
|
||
;cmp [I.Mod],3
|
||
;setnz [I.Arg1.Mem]
|
||
mov [I.Arg1.Type],GPR32
|
||
mov [I.Arg1.Type2nd],InRM
|
||
|
||
FetchSB
|
||
mov [I.Arg2.Type],80h+40h+20h+1
|
||
mov [I.Arg2.Imm],rax
|
||
ret
|
||
|
||
RM64IMMS8:
|
||
call FetchModRM
|
||
|
||
;cmp [I.Mod],3
|
||
;setnz [I.Arg1.Mem]
|
||
mov [I.Arg1.Type],GPR64
|
||
mov [I.Arg1.Type2nd],InRM
|
||
|
||
FetchSB
|
||
mov [I.Arg2.Type],80h+40h+20h+1
|
||
mov [I.Arg2.Imm],rax
|
||
ret
|
||
|
||
RM16R16CL:
|
||
push SetArg3CL
|
||
jmp RM16R16
|
||
|
||
RM16R16I8:
|
||
push SetArg3Imm
|
||
RM16R16:
|
||
call FetchModRM
|
||
|
||
;cmp [I.Mod],3
|
||
;setnz [I.Arg1.Mem]
|
||
mov [I.Arg1.Type],GPR16
|
||
mov [I.Arg1.Type2nd],InRM
|
||
|
||
mov [I.Arg2.Type],GPR16
|
||
mov [I.Arg2.Type2nd],InReg
|
||
ret
|
||
|
||
RM32R32CL:
|
||
push SetArg3CL
|
||
jmp RM32R32
|
||
|
||
RM32R32I8:
|
||
push SetArg3Imm
|
||
jmp RM32R32
|
||
|
||
RM32R32X:
|
||
push SetArg12X
|
||
RM32R32:
|
||
call FetchModRM
|
||
RM32R32M:
|
||
;cmp [I.Mod],3
|
||
;setnz [I.Arg1.Mem]
|
||
mov [I.Arg1.Type],GPR32
|
||
mov [I.Arg1.Type2nd],InRM
|
||
|
||
mov [I.Arg2.Type],GPR32
|
||
mov [I.Arg2.Type2nd],InReg
|
||
ret
|
||
|
||
RM64R64CL:
|
||
push SetArg3CL
|
||
jmp RM64R64
|
||
RM64R64I8:
|
||
push SetArg3Imm
|
||
RM64R64:
|
||
call FetchModRM
|
||
RM64R64M:
|
||
;cmp [I.Mod],3
|
||
;setnz [I.Arg1.Mem]
|
||
mov [I.Arg1.Type],GPR64
|
||
mov [I.Arg1.Type2nd],InRM
|
||
|
||
mov [I.Arg2.Type],GPR64
|
||
mov [I.Arg2.Type2nd],InReg
|
||
ret
|
||
|
||
R8RM8: call FetchModRM
|
||
|
||
;cmp [I.Mod],3
|
||
;setnz [I.Arg2.Mem]
|
||
mov [I.Arg2.Type],GPR08
|
||
mov [I.Arg2.Type2nd],InRM
|
||
|
||
mov [I.Arg1.Type],GPR08
|
||
mov [I.Arg1.Type2nd],InReg
|
||
ret
|
||
|
||
RM8: call FetchModRM
|
||
|
||
;cmp [I.Mod],3
|
||
;setnz [I.Arg1.Mem]
|
||
mov [I.Arg1.Type],GPR08
|
||
mov [I.Arg1.Type2nd],InRM
|
||
ret
|
||
|
||
R16RM16LZ:
|
||
BitTR I.Prefixes,PF3
|
||
jnc .L1
|
||
mov [I.Name],TLZCNT
|
||
.L1: jmp R16RM16
|
||
R16RM16TZ:
|
||
BitTR I.Prefixes,PF3
|
||
jnc .L1
|
||
mov [I.Name],TTZCNT
|
||
.L1: jmp R16RM16
|
||
|
||
R16RM16W:
|
||
R16RM16:
|
||
call FetchModRM
|
||
|
||
;cmp [I.Mod],3
|
||
;setnz [I.Arg2.Mem]
|
||
mov [I.Arg2.Type],GPR16
|
||
mov [I.Arg2.Type2nd],InRM
|
||
|
||
mov [I.Arg1.Type],GPR16
|
||
mov [I.Arg1.Type2nd],InReg
|
||
ret
|
||
|
||
R32RM32LZ:
|
||
BitTR I.Prefixes,PF3
|
||
jnc .L1
|
||
mov [I.Name],TLZCNT
|
||
.L1: jmp R32RM32
|
||
R32RM32TZ:
|
||
BitTR I.Prefixes,PF3
|
||
jnc .L1
|
||
mov [I.Name],TTZCNT
|
||
.L1: jmp R32RM32
|
||
|
||
R32RM32X:
|
||
push SetArg12X
|
||
jmp R32RM32
|
||
R32RM32W:
|
||
push SetArg2W
|
||
R32RM32:
|
||
call FetchModRM
|
||
R32RM32M:
|
||
;cmp [I.Mod],3
|
||
;setnz [I.Arg2.Mem]
|
||
mov [I.Arg2.Type],GPR32
|
||
mov [I.Arg2.Type2nd],InRM
|
||
|
||
mov [I.Arg1.Type],GPR32
|
||
mov [I.Arg1.Type2nd],InReg
|
||
ret
|
||
|
||
R64RM64LZ:
|
||
BitTR I.Prefixes,PF3
|
||
jnc .L1
|
||
mov [I.Name],TLZCNT
|
||
.L1: jmp R64RM64
|
||
R64RM64TZ:
|
||
BitTR I.Prefixes,PF3
|
||
jnc .L1
|
||
mov [I.Name],TTZCNT
|
||
.L1: jmp R64RM64
|
||
|
||
R64RM64W:
|
||
push SetArg2W
|
||
R64RM64:
|
||
call FetchModRM
|
||
|
||
;cmp [I.Mod],3
|
||
;setnz [I.Arg2.Mem]
|
||
mov [I.Arg2.Type],GPR64
|
||
mov [I.Arg2.Type2nd],InRM
|
||
|
||
mov [I.Arg1.Type],GPR64
|
||
mov [I.Arg1.Type2nd],InReg
|
||
ret
|
||
|
||
R3264RM3264:
|
||
cmp [I.W],0
|
||
jz R32RM32
|
||
mov [I.RandSize],VQWORD
|
||
jmp R64RM64
|
||
|
||
R16RM16L:
|
||
mov [I.IsLEA],True
|
||
R16RM163:
|
||
call FetchModRM
|
||
|
||
cmp [I.Mod],3
|
||
jz ErrorDec
|
||
|
||
;cmp [I.Mod],3
|
||
;setnz [I.Arg2.Mem]
|
||
mov [I.Arg2.Type],GPR16
|
||
mov [I.Arg2.Type2nd],InRM
|
||
|
||
mov [I.Arg1.Type],GPR16
|
||
mov [I.Arg1.Type2nd],InReg
|
||
ret
|
||
|
||
R32RM32L:
|
||
mov [I.IsLEA],True
|
||
R32RM323:
|
||
call FetchModRM
|
||
|
||
cmp [I.Mod],3
|
||
jz ErrorDec
|
||
|
||
;cmp [I.Mod],3
|
||
;setnz [I.Arg2.Mem]
|
||
mov [I.Arg2.Type],GPR32
|
||
mov [I.Arg2.Type2nd],InRM
|
||
|
||
mov [I.Arg1.Type],GPR32
|
||
mov [I.Arg1.Type2nd],InReg
|
||
ret
|
||
|
||
R64RM64L:
|
||
mov [I.IsLEA],True
|
||
R64RM643:
|
||
call FetchModRM
|
||
|
||
cmp [I.Mod],3
|
||
jz ErrorDec
|
||
|
||
;cmp [I.Mod],3
|
||
;setnz [I.Arg2.Mem]
|
||
mov [I.Arg2.Type],GPR64
|
||
mov [I.Arg2.Type2nd],InRM
|
||
|
||
mov [I.Arg1.Type],GPR64
|
||
mov [I.Arg1.Type2nd],InReg
|
||
ret
|
||
|
||
RM16R163:
|
||
call FetchModRM
|
||
|
||
cmp [I.Mod],3
|
||
jz ErrorDec
|
||
|
||
;cmp [I.Mod],3
|
||
;setnz [I.Arg1.Mem]
|
||
mov [I.Arg1.Type],GPR16
|
||
mov [I.Arg1.Type2nd],InRM
|
||
|
||
mov [I.Arg2.Type],GPR16
|
||
mov [I.Arg2.Type2nd],InReg
|
||
ret
|
||
|
||
RM32R323:
|
||
call FetchModRM
|
||
|
||
cmp [I.Mod],3
|
||
jz ErrorDec
|
||
|
||
;cmp [I.Mod],3
|
||
;setnz [I.Arg1.Mem]
|
||
mov [I.Arg1.Type],GPR32
|
||
mov [I.Arg1.Type2nd],InRM
|
||
|
||
mov [I.Arg2.Type],GPR32
|
||
mov [I.Arg2.Type2nd],InReg
|
||
ret
|
||
|
||
RM64R643:
|
||
call FetchModRM
|
||
|
||
cmp [I.Mod],3
|
||
jz ErrorDec
|
||
|
||
;cmp [I.Mod],3
|
||
;setnz [I.Arg1.Mem]
|
||
mov [I.Arg1.Type],GPR64
|
||
mov [I.Arg1.Type2nd],InRM
|
||
|
||
mov [I.Arg2.Type],GPR64
|
||
mov [I.Arg2.Type2nd],InReg
|
||
ret
|
||
|
||
RM16SEG:
|
||
call FetchModRM
|
||
|
||
;cmp [I.Mod],3
|
||
;setnz [I.Arg1.Mem]
|
||
mov [I.Arg1.Type],GPR16
|
||
mov [I.Arg1.Type2nd],InRM
|
||
|
||
mov [I.Arg2.Type],SEGRG
|
||
mov [I.Arg2.Type2nd],InReg
|
||
ret
|
||
|
||
RM32SEG:
|
||
call FetchModRM
|
||
|
||
;cmp [I.Mod],3
|
||
;setnz [I.Arg1.Mem]
|
||
mov [I.Arg1.Type],GPR32
|
||
mov [I.Arg1.Type2nd],InRM
|
||
|
||
mov [I.Arg2.Type],SEGRG
|
||
mov [I.Arg2.Type2nd],InReg
|
||
ret
|
||
|
||
RM64SEG:
|
||
call FetchModRM
|
||
|
||
;cmp [I.Mod],3
|
||
;setnz [I.Arg1.Mem]
|
||
mov [I.Arg1.Type],GPR64
|
||
mov [I.Arg1.Type2nd],InRM
|
||
|
||
mov [I.Arg2.Type],SEGRG
|
||
mov [I.Arg2.Type2nd],InReg
|
||
ret
|
||
|
||
SEGRM16:
|
||
call FetchModRM
|
||
|
||
;cmp [I.Mod],3
|
||
;setnz [I.Arg2.Mem]
|
||
mov [I.Arg2.Type],GPR16
|
||
mov [I.Arg2.Type2nd],InRM
|
||
|
||
mov [I.Arg1.Type],SEGRG
|
||
mov [I.Arg1.Type2nd],InReg
|
||
ret
|
||
|
||
SEGRM32:
|
||
call FetchModRM
|
||
|
||
;cmp [I.Mod],3
|
||
;setnz [I.Arg2.Mem]
|
||
mov [I.Arg2.Type],GPR32
|
||
mov [I.Arg2.Type2nd],InRM
|
||
|
||
mov [I.Arg1.Type],SEGRG
|
||
mov [I.Arg1.Type2nd],InReg
|
||
ret
|
||
|
||
SEGRM64:
|
||
call FetchModRM
|
||
|
||
;cmp [I.Mod],3
|
||
;setnz [I.Arg2.Mem]
|
||
mov [I.Arg2.Type],GPR64
|
||
mov [I.Arg2.Type2nd],InRM
|
||
|
||
mov [I.Arg1.Type],SEGRG
|
||
mov [I.Arg1.Type2nd],InReg
|
||
ret
|
||
|
||
RM16N: mov [I.Point],TNEAR
|
||
RM16: call FetchModRM
|
||
|
||
;cmp [I.Mod],3
|
||
;setnz [I.Arg1.Mem]
|
||
mov [I.Arg1.Type],GPR16
|
||
mov [I.Arg1.Type2nd],InRM
|
||
ret
|
||
|
||
RM32N: mov [I.Point],TNEAR
|
||
RM32: call FetchModRM
|
||
|
||
;cmp [I.Mod],3
|
||
;setnz [I.Arg1.Mem]
|
||
mov [I.Arg1.Type],GPR32
|
||
mov [I.Arg1.Type2nd],InRM
|
||
ret
|
||
|
||
RM64N: mov [I.Point],TNEAR
|
||
RM64: call FetchModRM
|
||
|
||
;cmp [I.Mod],3
|
||
;setnz [I.Arg1.Mem]
|
||
mov [I.Arg1.Type],GPR64
|
||
mov [I.Arg1.Type2nd],InRM
|
||
ret
|
||
|
||
RM163264W:
|
||
call FetchModRM
|
||
|
||
cmp [I.Mod],3
|
||
jnz .No3
|
||
BitTR I.Prefixes,P66
|
||
.No3:
|
||
cmp [I.Syntax],0
|
||
jz .SkipIntel
|
||
mov [I.RandSize],0
|
||
.SkipIntel:
|
||
|
||
;cmp [I.Mod],3
|
||
;setnz [I.Arg1.Mem]
|
||
|
||
mov [I.Arg1.Type],GPR16
|
||
cmp [I.Operand],0
|
||
jz .XX
|
||
mov [I.Arg1.Type],GPR32
|
||
.XX:
|
||
cmp [I.W],0
|
||
jz .64
|
||
BitTR I.Prefixes,P4X
|
||
mov [I.Arg1.Type],GPR64
|
||
.64:
|
||
mov [I.Arg1.Type2nd],InRM
|
||
ret
|
||
|
||
RMDW: call FetchModRM
|
||
|
||
cmp [I.Mod],3
|
||
;setnz [I.Arg1.Mem]
|
||
jnz .No3
|
||
BitTR I.Prefixes,P66
|
||
.No3:
|
||
mov [I.Arg1.Type],GPR16
|
||
cmp [I.Operand],0
|
||
jz .XX
|
||
mov [I.RandSize],VDWORD
|
||
mov [I.Arg1.Type],GPR32
|
||
.XX:
|
||
mov [I.Arg1.Type2nd],InRM
|
||
ret
|
||
|
||
RMW0100:call FetchModRM
|
||
cmp [I.Mod],3
|
||
setnz [I.Arg1.Mem]
|
||
jnz .Exit
|
||
mov dx,TENCLV
|
||
cmp al,$C0
|
||
jz .L1
|
||
mov dx,TVMCALL
|
||
cmp al,$C1
|
||
jz .L1
|
||
mov dx,TVMLAUNCH
|
||
cmp al,$C2
|
||
jz .L1
|
||
mov dx,TVMRESUME
|
||
cmp al,$C3
|
||
jz .L1
|
||
mov dx,TVMXOFF
|
||
cmp al,$C4
|
||
jz .L1
|
||
mov dx,TPCONFIG
|
||
cmp al,$C5
|
||
jnz ErrorDec
|
||
.L1: mov [I.Name],dx
|
||
.Exit: ret
|
||
|
||
RMW0101:call FetchModRM
|
||
cmp [I.Mod],3
|
||
setnz [I.Arg1.Mem]
|
||
jnz .Exit
|
||
mov dx,TMONITOR
|
||
cmp al,$C8
|
||
je .L1
|
||
mov dx,TMWAIT
|
||
cmp al,$C9
|
||
je .L1
|
||
mov dx,TCLAC
|
||
cmp al,$CA
|
||
je .L1
|
||
mov dx,TSTAC
|
||
cmp al,$CB
|
||
jz .L1
|
||
mov dx,TENCLS
|
||
cmp al,$CF
|
||
jne ErrorDec
|
||
.L1: mov [I.Name],dx
|
||
ret
|
||
.Exit: call TWorFW
|
||
ret
|
||
|
||
RMW0102:call FetchModRM
|
||
cmp [I.Mod],3
|
||
setnz [I.Arg1.Mem]
|
||
jnz .Exit
|
||
mov dx,TENCLU
|
||
cmp al,$D7
|
||
je .L1
|
||
mov dx,TXTEST
|
||
cmp al,$D6
|
||
je .L1
|
||
mov dx,TXEND
|
||
cmp al,$D5
|
||
je .L1
|
||
mov dx,TVMFUNC
|
||
cmp al,$D4
|
||
je .L1
|
||
mov dx,TXGETBV
|
||
cmp al,$D0
|
||
je .L1
|
||
mov dx,TXSETBV
|
||
cmp al,$D1
|
||
jne ErrorDec
|
||
.L1: mov [I.Name],dx
|
||
ret
|
||
.Exit: call TWorFW
|
||
ret
|
||
|
||
RMW0103:call FetchModRM
|
||
cmp [I.Mod],3
|
||
setnz [I.Arg1.Mem]
|
||
jnz .Quit
|
||
movzx eax,byte [rsi-1]
|
||
mov edx,[rax*2+TVMXXTable-$D8*2]
|
||
mov [I.Name],dx
|
||
cmp al,$D9
|
||
je .Exit
|
||
cmp al,$DC
|
||
je .Exit
|
||
cmp al,$DD
|
||
je .Exit
|
||
;
|
||
cmp [I.Syntax],0
|
||
jz .YY
|
||
cmp al,$DF
|
||
je .Exit
|
||
.YY: ;
|
||
mov al,[I.Arch]
|
||
cmp al,CPUX16
|
||
jz .16
|
||
cmp al,CPUX32
|
||
jz .32
|
||
|
||
.64: mov [I.Arg1.Type],GPR64
|
||
BitTR I.Prefixes,P67
|
||
jnc @F
|
||
mov [I.Arg1.Type],GPR32
|
||
@@:
|
||
jmp .XX
|
||
.16: mov [I.Arg1.Type],GPR16
|
||
BitTR I.Prefixes,P67
|
||
jnc @F
|
||
mov [I.Arg1.Type],GPR32
|
||
@@:
|
||
jmp .XX
|
||
.32: mov [I.Arg1.Type],GPR32
|
||
BitTR I.Prefixes,P67
|
||
jnc @F
|
||
mov [I.Arg1.Type],GPR16
|
||
@@:
|
||
.XX: cmp dx,TINVLPGA
|
||
jnz @F
|
||
mov [I.Arg2.Type],GPR32
|
||
mov [I.Arg2.Reg],RRCX
|
||
@@:
|
||
.Exit: ret
|
||
|
||
.Quit: call TWorFW
|
||
ret
|
||
|
||
RMW0104:call FetchModRM
|
||
|
||
cmp [I.Mod],3
|
||
;setnz [I.Arg1.Mem]
|
||
jnz .Exit
|
||
|
||
mov [I.Arg1.Type],GPR16
|
||
mov al,[I.Operand]
|
||
add [I.Arg1.Type],al
|
||
|
||
mov [I.Arg1.Type2nd],InRM
|
||
|
||
cmp [I.W],0
|
||
jz .W0
|
||
BitTR I.Prefixes,P4X
|
||
mov [I.Arg1.Type],GPR64
|
||
.W0:
|
||
BitTR I.Prefixes,P66
|
||
.Exit: ret
|
||
|
||
RtnPKRU:cmp byte [rsi],0xC0
|
||
jb .IsRSTORSSP
|
||
FetchB
|
||
mov dx,TSETSSBSY
|
||
cmp al,0xE8
|
||
jz .IsEA
|
||
mov dx,TSAVEPREVSSP
|
||
cmp al,0xEA
|
||
jz .IsEA
|
||
mov dx,TRDPKRU
|
||
cmp al,0xEE
|
||
jz .MoveName
|
||
mov dx,TWRPKRU
|
||
cmp al,0xEF
|
||
jnz ErrorDec
|
||
.MoveName:
|
||
mov [I.Name],dx
|
||
ret
|
||
.IsEA: BitTR I.Prefixes,PF3
|
||
jc .MoveName
|
||
jmp ErrorDec
|
||
.IsRSTORSSP:
|
||
BitTR I.Prefixes,PF3
|
||
jnc ErrorDec
|
||
setc [I.Arg1.Mem]
|
||
mov [I.Name],TRSTORSSP
|
||
jmp FetchModRM
|
||
|
||
RMW0107:call FetchModRM
|
||
|
||
cmp [I.Mod],3
|
||
setnz [I.Arg1.Mem]
|
||
jnz .Exit
|
||
|
||
mov dx,TRDPRU
|
||
cmp al,$FD
|
||
je .L1
|
||
mov dx,TCLZERO
|
||
cmp al,$FC
|
||
je .L1
|
||
mov dx,TMWAITX
|
||
cmp al,$FB
|
||
je .L1
|
||
mov dx,TMONITORX
|
||
cmp al,$FA
|
||
je .L1
|
||
mov dx,TRDTSCP
|
||
cmp al,$F9
|
||
je .L1
|
||
cmp [I.Arch],CPUX64
|
||
jne ErrorDec
|
||
mov dx,TSWAPGS
|
||
cmp al,$F8
|
||
jne ErrorDec
|
||
.L1: mov [I.Name],dx
|
||
.Exit: ret
|
||
|
||
LOADALL2:
|
||
test [I.Sensitive],UND
|
||
jz .L1
|
||
mov [I.Name],TLOADALL286
|
||
.L1: ret
|
||
|
||
Rtn0F07:
|
||
test [I.Sensitive],UND
|
||
jz .L1
|
||
mov [I.Name],TLOADALL
|
||
.L1: ret
|
||
|
||
PREFETCHRTN:
|
||
call FetchModRM
|
||
|
||
cmp [I.Mod],3
|
||
setnz [I.Arg1.Mem]
|
||
jz .Exit
|
||
|
||
mov al,[I.Reg]
|
||
mov dx,TPREFETCHWT1
|
||
cmp al,2
|
||
jz .L1
|
||
cmp al,1
|
||
jne .Exit
|
||
mov dx,TPREFETCHW
|
||
.L1: mov [I.Name],dx
|
||
.Exit: ret
|
||
|
||
RtnMM4MM:
|
||
call FetchModRM
|
||
|
||
;cmp [I.Mod],3
|
||
;setnz [I.Arg1.Mem]
|
||
mov [I.Arg1.Type],MMXRG
|
||
mov [I.Arg2.Type],MMXRG
|
||
|
||
mov [I.Arg1.Type2nd],InRM
|
||
mov [I.Arg2.Type2nd],InReg
|
||
ret
|
||
|
||
RtnMM2MM:
|
||
call FetchModRM
|
||
|
||
;cmp [I.Mod],3
|
||
;setnz [I.Arg2.Mem]
|
||
mov [I.Arg2.Type],MMXRG
|
||
mov [I.Arg1.Type],MMXRG
|
||
|
||
mov [I.Arg2.Type2nd],InRM
|
||
mov [I.Arg1.Type2nd],InReg
|
||
ret
|
||
|
||
Rtn0F0F:call RtnMM2MM
|
||
mov ecx,(End3D-Now3D)/3
|
||
mov edx,Now3D
|
||
FetchB
|
||
.L1: cmp [rdx],al
|
||
je .L2
|
||
add edx,3
|
||
loop .L1
|
||
jmp ErrorDec
|
||
.L2: mov eax,[rdx+1]
|
||
mov [I.Name],ax
|
||
ret
|
||
;-----------------------------------------------------------------------------
|
||
Rtn0F22:push R32RM32C
|
||
jmp Rtn0F20.L1
|
||
;-----------------------------------------------------------------------------
|
||
Rtn0F20:push RM32R32C
|
||
.L1: call FetchModRM
|
||
cmp [I.Mod],3
|
||
jne ErrorDec
|
||
ret
|
||
;-----------------------------------------------------------------------------
|
||
Rtn0F23:push R32RM32D
|
||
jmp Rtn0F21.L1
|
||
;-----------------------------------------------------------------------------
|
||
Rtn0F21:push RM32R32D
|
||
.L1: call FetchModRM
|
||
cmp [I.Mod],3
|
||
jne ErrorDec
|
||
ret
|
||
;-----------------------------------------------------------------------------
|
||
Rtn0F26:push R32RM32T
|
||
jmp Rtn0F24.L1
|
||
;-----------------------------------------------------------------------------
|
||
Rtn0F24:push RM32R32T
|
||
.L1: call FetchModRM
|
||
cmp [I.Mod],3
|
||
jne ErrorDec
|
||
ret
|
||
;-----------------------------------------------------------------------------
|
||
Rtn0F37:test [I.Sensitive],NIA
|
||
ifz ret
|
||
mov [I.Name],TWRSHR
|
||
Rtn0F36:test [I.Sensitive],NIA
|
||
jz ErrorDec
|
||
cmp [I.Arch],CPUX64
|
||
jz ErrorDec
|
||
call FetchModRM
|
||
cmp [I.Reg],0
|
||
jnz ErrorDec
|
||
BitTR I.Prefixes,P66
|
||
;cmp [I.Mod],3
|
||
;setnz [I.Arg1.Mem]
|
||
mov [I.Arg1.Type],GPR32
|
||
mov [I.Arg1.Type2nd],InRM
|
||
ret
|
||
;-----------------------------------------------------------------------------
|
||
Rtn0F3800:
|
||
test [I.Sensitive],NIA
|
||
jz .L1
|
||
mov [I.Name],TSMINT
|
||
ret
|
||
.L1: FetchB
|
||
cmp al,0xF0
|
||
jb .L0
|
||
cmp al,0xF1
|
||
jbe RtnMOVBE
|
||
cmp al,0xF6
|
||
jz RtnWRSSX
|
||
.L0:
|
||
mov dx,TSHA1NEXTE
|
||
cmp al,0xC8
|
||
jz .0F38XX
|
||
mov dx,TSHA1MSG1
|
||
cmp al,0xC9
|
||
jz .0F38XX
|
||
mov dx,TSHA1MSG2
|
||
cmp al,0xCA
|
||
jz .0F38XX
|
||
mov dx,TSHA256RNDS2
|
||
cmp al,0xCB
|
||
jz .0F38XX
|
||
mov dx,TSHA256MSG1
|
||
cmp al,0xCC
|
||
jz .0F38XX
|
||
mov dx,TSHA256MSG2
|
||
cmp al,0xCD
|
||
jnz .FUCK
|
||
.0F38XX:mov [I.Name],dx
|
||
mov [I.RandSize],VXWORD+80h
|
||
cmp al,0xCB
|
||
ifz mov [I.Arg3.Type],XMMRG
|
||
jmp R32RM32X
|
||
.FUCK: mov ebx,RtnMM2MM
|
||
call CheckPrevSSE4
|
||
jc ErrorDec
|
||
ret
|
||
;-----------------------------------------------------------------------------
|
||
RtnWRSSX:
|
||
mov [I.Name],TWRSSD
|
||
test [I.PreREX],8 ;REX.W
|
||
jz RM32R32
|
||
call ClearW
|
||
mov [I.Name],TWRSSQ
|
||
jmp RM64R64
|
||
;-----------------------------------------------------------------------------
|
||
Rtn0F3X:test [I.Sensitive],NIA
|
||
jz ErrorDec
|
||
ret
|
||
;-----------------------------------------------------------------------------
|
||
Rtn0F50:test [I.Sensitive],NIA
|
||
jz Rtn0066F2F3X
|
||
.L0: mov [I.RandSize],VQWORD+80h
|
||
jmp RtnMM2MM
|
||
;-----------------------------------------------------------------------------
|
||
RtnIAMM:test [I.Sensitive],NIA
|
||
jz Rtn0066F2F3
|
||
jmp Rtn0F50.L0
|
||
;-----------------------------------------------------------------------------
|
||
RtnIAM3:test [I.Sensitive],NIA
|
||
jz Rtn0066F2F3
|
||
cmp byte [rsi],0xC0
|
||
jae ErrorDec
|
||
jmp Rtn0F50.L0
|
||
;-----------------------------------------------------------------------------
|
||
Rtn0F6X:cmp [I.PrefixByte],bit P66
|
||
jnz .L1
|
||
and byte [I.Prefixes],not (bit P66)
|
||
mov [I.Mandatory66],1
|
||
mov [I.RandSize],VXWORD+80h
|
||
jmp R32RM32X
|
||
.L1: cmp [I.PrefixByte],0
|
||
jnz ErrorDec
|
||
cmp byte [rsi-1],6Ch
|
||
jae ErrorDec
|
||
jmp RtnMM2MM
|
||
;-----------------------------------------------------------------------------
|
||
Rtn0F72:mov r8d,T0F72Names
|
||
jmp Rtn0F71.L0
|
||
;-----------------------------------------------------------------------------
|
||
Rtn0F71:mov r8d,T0F71Names
|
||
.L0: call FetchModRM
|
||
.0L: movzx eax,[I.Reg]
|
||
mov edx,[rax*2+r8]
|
||
or dx,dx
|
||
jz .L5
|
||
.L1: cmp [I.Mod],3
|
||
jne .L5
|
||
mov [I.Name],dx
|
||
mov al,[I.PrefixByte]
|
||
cmp al,bit P66
|
||
jnz .L4
|
||
and byte [I.Prefixes],not (bit P66)
|
||
mov [I.Mandatory66],1
|
||
.L2: mov [I.Arg1.Type],XMMRG
|
||
.L3: mov [I.Arg1.Type2nd],InRM
|
||
FetchB
|
||
mov [I.Arg2.Type],80h+1
|
||
mov [I.Arg2.ImmB],al
|
||
ret
|
||
.L4: mov [I.Arg1.Type],MMXRG
|
||
or al,al
|
||
jz .L3
|
||
.L5: jmp ErrorDec
|
||
;-----------------------------------------------------------------------------
|
||
Rtn0F73:mov r8d,T0F73Names
|
||
call FetchModRM
|
||
cmp [I.PrefixByte],0
|
||
jnz Rtn0F71.0L
|
||
;MMX /2 /6
|
||
cmp [I.Reg],2
|
||
je Rtn0F71.0L
|
||
cmp [I.Reg],6
|
||
je Rtn0F71.0L
|
||
jmp ErrorDec
|
||
;-----------------------------------------------------------------------------
|
||
RtnMMXM:mov edx,RtnMM2MM
|
||
mov al,[I.PrefixByte]
|
||
or al,al
|
||
jz .L1
|
||
cmp al,bit P66
|
||
jnz ErrorDec
|
||
mov edx,R32RM32X
|
||
and byte [I.Prefixes],not (bit P66)
|
||
mov [I.Mandatory66],1
|
||
mov [I.RandSize],VXWORD+80h
|
||
.L1: jmp rdx
|
||
;-----------------------------------------------------------------------------
|
||
Rtn0F78:
|
||
test [I.Sensitive],NIA
|
||
jz .L0
|
||
cmp byte [rsi],0xC0
|
||
jae ErrorDec
|
||
mov [I.RandSize],VTWORD+80h
|
||
mov [I.Name],TSVDC
|
||
jmp RM16SEG
|
||
.L0: mov al,[I.PrefixByte]
|
||
or al,al
|
||
jnz .L2
|
||
mov edx,RM32R32
|
||
mov [I.RandSize],VDWORD+80h
|
||
cmp [I.Arch],CPUX64
|
||
jnz .L1
|
||
mov edx,RM64R64
|
||
mov [I.RandSize],VQWORD+80h
|
||
.L1: jmp rdx
|
||
.L2: cmp byte [rsi],0xC0
|
||
jb ErrorDec
|
||
cmp al,bit P66
|
||
jnz .L3
|
||
call FetchModRM
|
||
cmp [I.Reg],0
|
||
jnz ErrorDec
|
||
and byte [I.Prefixes],not (bit P66)
|
||
mov [I.Mandatory66],1
|
||
mov [I.Name],TEXTRQ
|
||
mov [I.Arg1.Type],XMMRG
|
||
mov [I.Arg1.Type2nd],InRM
|
||
lea r8,[I.Arg2]
|
||
.LX: FetchW
|
||
mov [r8+TArg.Type],80h+1
|
||
mov [r8+TArg.ImmB],al
|
||
add r8d,sizeof.TArg
|
||
mov [r8+TArg.Type],80h+1
|
||
mov al,ah
|
||
mov [r8+TArg.ImmB],al
|
||
ret
|
||
.L3: cmp al,bit PF2
|
||
jnz ErrorDec
|
||
and byte [I.Prefixes],not (bit PF2)
|
||
mov [I.Name],TINSERTQ
|
||
call R32RM32X
|
||
lea r8,[I.Arg3]
|
||
jmp .LX
|
||
;-----------------------------------------------------------------------------
|
||
Rtn0F79:test [I.Sensitive],NIA
|
||
jz .L0
|
||
cmp byte [rsi],0xC0
|
||
jae ErrorDec
|
||
mov [I.RandSize],VTWORD+80h
|
||
mov [I.Name],TRSDC
|
||
jmp SEGRM16
|
||
.L0: mov al,[I.PrefixByte]
|
||
or al,al
|
||
jnz .L2
|
||
mov edx,R32RM32
|
||
mov [I.RandSize],VDWORD+80h
|
||
cmp [I.Arch],CPUX64
|
||
jnz .L1
|
||
mov edx,R64RM64
|
||
mov [I.RandSize],VQWORD+80h
|
||
.L1: jmp rdx
|
||
.L2: cmp byte [rsi],0xC0
|
||
jb ErrorDec
|
||
cmp al,bit P66
|
||
jnz .L3
|
||
and byte [I.Prefixes],not (bit P66)
|
||
mov [I.Mandatory66],1
|
||
mov [I.Name],TEXTRQ
|
||
jmp R32RM32X
|
||
.L3: cmp al,bit PF2
|
||
jnz ErrorDec
|
||
and byte [I.Prefixes],not (bit PF2)
|
||
mov [I.Name],TINSERTQ
|
||
jmp R32RM32X
|
||
;-----------------------------------------------------------------------------
|
||
Rtn0F7B:
|
||
Rtn0F7A:test [I.Sensitive],NIA
|
||
jz ErrorDec
|
||
.L1: call FetchModRM
|
||
cmp [I.Mod],3
|
||
jz ErrorDec
|
||
cmp [I.Reg],0
|
||
jnz ErrorDec
|
||
mov [I.Arg1.Type],GPR32
|
||
mov [I.Arg1.Type2nd],InRM
|
||
ret
|
||
;-----------------------------------------------------------------------------
|
||
Rtn0F7D:
|
||
Rtn0F7C:
|
||
test [I.Sensitive],NIA
|
||
jz Rtn0066F2F3
|
||
jmp Rtn0F7A.L1
|
||
;-----------------------------------------------------------------------------
|
||
Rtn0F7E:test [I.Sensitive],NIA
|
||
jz Rtn0066F2F3X
|
||
ret
|
||
;-----------------------------------------------------------------------------
|
||
Rtn0FA6:test [I.Sensitive],NIA
|
||
jnz .L1
|
||
cmp [I.Arch],CPUX64
|
||
je .L0
|
||
mov [I.RandSize],VBYTE+80h
|
||
test [I.Sensitive],UND
|
||
jnz RM8R8
|
||
.L0: jmp ErrorDec
|
||
|
||
.L1: call FetchModRM
|
||
cmp [I.Mod],3
|
||
jnz .L0
|
||
cmp [I.RM],0
|
||
jnz .L0
|
||
movzx eax,[I.Reg]
|
||
cmp al,2
|
||
ja .L0
|
||
BitTR I.Prefixes,PF3
|
||
jnc .L0
|
||
mov eax,[rax*2+TCentTable]
|
||
mov [I.Name],ax
|
||
ret
|
||
;-----------------------------------------------------------------------------
|
||
Rtn0FA7:test [I.Sensitive],NIA
|
||
jnz .L1
|
||
test [I.Sensitive],UND
|
||
jz .L4
|
||
cmp [I.Arch],CPUX64
|
||
je .L4
|
||
BitTR I.Prefixes,P66
|
||
cmp [I.Operand],0
|
||
mov [I.RandSize],VDWORD+80h
|
||
jnz RM32R32
|
||
mov [I.RandSize],VWORD+80h
|
||
jmp RM16R16
|
||
|
||
.L1: call FetchModRM
|
||
cmp [I.Mod],3
|
||
jnz .L4
|
||
cmp [I.RM],0
|
||
jnz .L4
|
||
cmp [I.PrefixByte],bit PF3
|
||
jnz .L3
|
||
BitTR I.Prefixes,PF3
|
||
movzx eax,[I.Reg]
|
||
mov eax,[rax*2+TCRYPTable]
|
||
or ax,ax
|
||
jz .L4
|
||
.L2: mov [I.Name],ax
|
||
ret
|
||
.L3: cmp al,$C0
|
||
mov ax,TXSTORE
|
||
jz .L2
|
||
.L4: jmp ErrorDec
|
||
;-----------------------------------------------------------------------------
|
||
Rtn0FAE:call FetchModRM
|
||
mov rsi,[I.SaveRSI]
|
||
|
||
movzx ebx,[I.Reg]
|
||
|
||
cmp [I.PrefixByte],bit P66
|
||
je Rtn660FAE
|
||
|
||
cmp [I.Mod],3
|
||
je .L2
|
||
|
||
mov edx,T0FAETable
|
||
cmp [I.W],0
|
||
jz .L0
|
||
mov edx,T0FAETab64
|
||
call ClearW
|
||
.L0:
|
||
cmp [I.PrefixByte],bit PF3
|
||
je RtnF30FAE
|
||
|
||
mov edx,[rbx*2+rdx]
|
||
.L1: or dx,dx
|
||
jz ErrorDec
|
||
mov [I.Name],dx
|
||
jmp RM32
|
||
.L2:
|
||
cmp [I.PrefixByte],bit PF3
|
||
je RtnF30FAE
|
||
cmp [I.PrefixByte],bit PF2
|
||
je RtnF20FAE
|
||
mov dx,TLFENCE
|
||
cmp al,$E8
|
||
je .L3
|
||
mov dx,TMFENCE
|
||
cmp al,$F0
|
||
je .L3
|
||
mov dx,TSFENCE
|
||
cmp al,$F8
|
||
jne ErrorDec
|
||
.L3: lodsb
|
||
mov [I.Name],dx
|
||
ret
|
||
|
||
Rtn660FAE:
|
||
and byte [I.Prefixes],not (bit P66)
|
||
mov edx,T660FAETable3
|
||
cmp [I.Mod],3
|
||
jz .L1
|
||
mov edx,T660FAETable0
|
||
.L1: mov edx,[rbx*2+rdx]
|
||
or dx,dx
|
||
jz ErrorDec
|
||
mov [I.Name],dx
|
||
jmp RM32
|
||
|
||
RtnF20FAE:
|
||
and byte [I.Prefixes],not (bit PF2)
|
||
cmp byte [rsi],0xC0
|
||
jb ErrorDec
|
||
mov [I.Name],TUMWAIT
|
||
jmp RM32
|
||
|
||
RtnF30FAE:
|
||
cmp bl,06h
|
||
jz .L0
|
||
cmp [I.Arch],CPUX64
|
||
jne ErrorDec
|
||
.L0:
|
||
mov edx,[rbx*2+TF30FAETable]
|
||
or dx,dx
|
||
jz ErrorDec
|
||
mov [I.Name],dx
|
||
and byte [I.Prefixes],not (bit PF3)
|
||
cmp bl,06h
|
||
jz IsUMONITOR
|
||
call ClearW
|
||
mov [I.RandSize],VDWORD
|
||
cmp [I.W],0
|
||
jz RM32
|
||
cmp bl,5
|
||
ifz mov [I.Name],TINCSSPQ
|
||
mov [I.RandSize],VQWORD
|
||
jmp RM64
|
||
IsUMONITOR:
|
||
cmp byte [rsi],0xC0
|
||
jbe .1
|
||
BitTR I.Prefixes,P67
|
||
call FetchModRM
|
||
;cmp [I.Mod],3
|
||
;setnz [I.Arg1.Mem]
|
||
mov al,[I.Address]
|
||
add al,GPR16
|
||
mov [I.Arg1.Type],al
|
||
mov [I.Arg1.Type2nd],InRM
|
||
ret
|
||
.1: mov [I.Name],TCLRSSBSY
|
||
call FetchModRM
|
||
mov [I.Arg1.Mem],1
|
||
ret
|
||
;-----------------------------------------------------------------------------
|
||
Rtn0FC2:xor ebx,ebx
|
||
mov al,[I.PrefixByte]
|
||
or al,al
|
||
jz .L1
|
||
inc ebx
|
||
cmp al,bit P66
|
||
setz [I.Mandatory66]
|
||
jz .L1
|
||
inc ebx
|
||
cmp al,bit PF2
|
||
jz .L1
|
||
inc ebx
|
||
cmp al,bit PF3
|
||
jnz ErrorDec
|
||
.L1: not al
|
||
and byte [I.Prefixes],al
|
||
|
||
mov eax,[rbx*3+CMPSuffixesY]
|
||
mov word [I.Suffix2nd],ax
|
||
shr eax,16
|
||
mov [I.RandSize],al
|
||
|
||
call R32RM32X
|
||
xor eax,eax
|
||
FetchB
|
||
mov edx,[rax*2+CMPxxNames]
|
||
cmp al,7
|
||
ja .L2
|
||
mov [I.Name],dx
|
||
ret
|
||
.L2: mov [I.Name],TCMP
|
||
mov [I.Arg3.Type],80h+1
|
||
mov [I.Arg3.ImmB],al
|
||
ret
|
||
;-----------------------------------------------------------------------------
|
||
Rtn0FC73:
|
||
mov ax,TRDPID
|
||
cmp [I.Reg],7
|
||
jnz .M7
|
||
BitTR I.Prefixes,PF3
|
||
jc .M0
|
||
.M7: cmp [I.Reg],6
|
||
jb ErrorDec
|
||
mov ax,TRDRAND
|
||
jz .M0
|
||
mov ax,TRDSEED
|
||
.M0: mov [I.Name],ax
|
||
cmp [I.W],0
|
||
jz .M1
|
||
call ClearW
|
||
jmp RM64
|
||
.M1: BitTR I.Prefixes,P66
|
||
cmp [I.Operand],0
|
||
jnz RM32
|
||
jmp RM16
|
||
;-----------------------------------------------------------------------------
|
||
Rtn0FC7:call FetchModRM
|
||
mov rsi,[I.SaveRSI]
|
||
cmp [I.Mod],3
|
||
jz Rtn0FC73
|
||
cmp [I.Reg],1
|
||
jne .L0
|
||
or [I.Flags],_XA+_XR
|
||
mov [I.RandSize],VQWORD+80h
|
||
cmp [I.W],0
|
||
jz .RM
|
||
mov [I.RandSize],VXWORD+80h
|
||
mov dx,TCMPXCHG16B
|
||
.WWWW: call ClearW
|
||
.EA: mov [I.Name],dx
|
||
.RM: jmp RM32
|
||
.L0:
|
||
mov edx,T0FC7Table
|
||
cmp [I.W],0
|
||
jz .W0
|
||
mov edx,T0FC7Tab64
|
||
.W0: movzx eax,[I.Reg]
|
||
mov dx,[rax*2+rdx]
|
||
or dx,dx
|
||
jnz .WWWW
|
||
|
||
mov [I.RandSize],VQWORD+80h
|
||
mov ah,[I.Reg]
|
||
mov al,[I.PrefixByte]
|
||
or al,al
|
||
jne .L1
|
||
mov dx,TVMPTRLD
|
||
cmp ah,6
|
||
je .EA
|
||
mov dx,TVMPTRST
|
||
cmp ah,7
|
||
je .EA
|
||
.ED: jmp ErrorDec
|
||
|
||
.L1: cmp [I.Reg],6
|
||
jne .ED
|
||
cmp al,bit P66
|
||
jne .L2
|
||
mov dx,TVMCLEAR
|
||
mov [I.Mandatory66],1
|
||
.AN: not al
|
||
and byte [I.Prefixes],al
|
||
jmp .EA
|
||
|
||
.L2: cmp al,bit PF3
|
||
jne .ED
|
||
mov dx,TVMXON
|
||
jmp .AN
|
||
;-----------------------------------------------------------------------------
|
||
RtnBSWAP:
|
||
mov al,[rsi-1]
|
||
sub al,0xC8
|
||
mov [I.RM],al
|
||
mov [I.Mod],3
|
||
mov [I.Arg1.Type2nd],InRM
|
||
mov [I.Arg1.Type],GPR64
|
||
cmp [I.W],0
|
||
jnz .Exit
|
||
BitTR I.Prefixes,P66
|
||
mov [I.Arg1.Type],GPR32
|
||
cmp [I.Operand],0
|
||
jnz .Exit
|
||
mov [I.Arg1.Type],GPR16
|
||
.Exit: ret
|
||
;-----------------------------------------------------------------------------
|
||
MOVZXWB:call R16RM16
|
||
mov [I.AltName],TMOVZBW
|
||
mov [I.Arg2.Type],GPR08
|
||
ret
|
||
MOVZXDB:call R32RM32
|
||
mov [I.AltName],TMOVZBL
|
||
mov [I.Arg2.Type],GPR08
|
||
ret
|
||
MOVZXQB:call R64RM64
|
||
mov [I.AltName],TMOVZBQ
|
||
mov [I.Arg2.Type],GPR08
|
||
ret
|
||
MOVZXWW:call R16RM16
|
||
mov [I.AltName],TMOVZWW
|
||
ret
|
||
MOVZXDW:call R32RM32
|
||
mov [I.AltName],TMOVZWL
|
||
mov [I.Arg2.Type],GPR16
|
||
ret
|
||
MOVZXQW:call R64RM64
|
||
mov [I.AltName],TMOVZWQ
|
||
mov [I.Arg2.Type],GPR16
|
||
ret
|
||
;-----------------------------------------------------------------------------
|
||
MOVSXWB:call R16RM16
|
||
mov [I.AltName],TMOVSBW
|
||
mov [I.Arg2.Type],GPR08
|
||
ret
|
||
MOVSXDB:call R32RM32
|
||
mov [I.AltName],TMOVSBL
|
||
mov [I.Arg2.Type],GPR08
|
||
ret
|
||
MOVSXQB:call R64RM64
|
||
mov [I.AltName],TMOVSBQ
|
||
mov [I.Arg2.Type],GPR08
|
||
ret
|
||
MOVSXWW:call R16RM16
|
||
mov [I.AltName],TMOVSWW
|
||
ret
|
||
MOVSXDW:call R32RM32
|
||
mov [I.AltName],TMOVSWL
|
||
mov [I.Arg2.Type],GPR16
|
||
ret
|
||
MOVSXQW:call R64RM64
|
||
mov [I.AltName],TMOVSWQ
|
||
mov [I.Arg2.Type],GPR16
|
||
ret
|
||
;-----------------------------------------------------------------------------
|
||
R16RM16B8:
|
||
BitTR I.Prefixes,PF3
|
||
jnc .L1
|
||
call R16RM16
|
||
mov [I.RandSize],VWORD+80h
|
||
ret
|
||
.L1: mov [I.Name],TJMPE
|
||
or [I.Flags],_J
|
||
jmp DODISPW
|
||
;-----------------------------------------------------------------------------
|
||
R32RM32B8:
|
||
BitTR I.Prefixes,PF3
|
||
jnc .L1
|
||
call R32RM32
|
||
mov [I.RandSize],VDWORD+80h
|
||
ret
|
||
.L1: mov [I.Name],TJMPE
|
||
or [I.Flags],_J
|
||
jmp DODISPD
|
||
;-----------------------------------------------------------------------------
|
||
R64RM64B8:
|
||
BitTR I.Prefixes,PF3
|
||
jnc .L1
|
||
call ClearW
|
||
call R64RM64
|
||
mov [I.RandSize],VQWORD+80h
|
||
ret
|
||
.L1: mov [I.Name],TJMPE
|
||
or [I.Flags],_J
|
||
jmp DODISPD
|
||
;-----------------------------------------------------------------------------
|
||
RtnCRC32:
|
||
mov [I.Table],TableCRC32
|
||
jmp RtnMOV32
|
||
;-----------------------------------------------------------------------------
|
||
RtnMOVBE:
|
||
mov [I.Table],TableMOVBE
|
||
RtnMOV32:
|
||
mov [I.NewTable],1
|
||
mov [I.Only],0
|
||
sub al,0xF0
|
||
ret
|
||
;-----------------------------------------------------------------------------
|
||
RtnADOX:mov [I.Table],TableADOX
|
||
jmp RtnADXX
|
||
RtnADCX:mov [I.Table],TableADCX
|
||
RtnADXX:mov [I.NewTable],1
|
||
mov [I.Only],1
|
||
xor al,al
|
||
ret
|
||
;-----------------------------------------------------------------------------
|
||
RtnINVXX:
|
||
mov [I.Table],TableINVx
|
||
mov [I.NewTable],1
|
||
mov [I.Only],1
|
||
sub al,80h
|
||
ret
|
||
;-----------------------------------------------------------------------------
|
||
Rtn0F388X:
|
||
call R32RM32
|
||
cmp [I.Mod],3
|
||
jz ErrorDec
|
||
cmp [I.Arch],CPUX64
|
||
jnz .L1
|
||
mov [I.Arg1.Type],GPR64
|
||
.L1: ret
|
||
;-----------------------------------------------------------------------------
|
||
Rtn0F3866:
|
||
FetchB
|
||
cmp al,0x80
|
||
jb .M0
|
||
cmp al,0x82
|
||
jbe RtnINVXX
|
||
.M0:
|
||
cmp al,0xF0
|
||
jb .L0
|
||
cmp al,0xF1
|
||
jbe RtnMOVBE
|
||
|
||
cmp al,0xF6
|
||
jz RtnADCX
|
||
|
||
.L0: mov ebx,R32RM32X
|
||
call CheckPrevSSE4
|
||
jnc .LX
|
||
call CheckNextSSE4
|
||
jc ErrorDec
|
||
.LX: ret
|
||
;-----------------------------------------------------------------------------
|
||
Rtn0F38F2:
|
||
FetchB
|
||
cmp al,0xF0
|
||
jb .L0
|
||
cmp al,0xF1
|
||
jbe RtnCRC32
|
||
.L0: jmp ErrorDec
|
||
;-----------------------------------------------------------------------------
|
||
Rtn0F38F3:
|
||
FetchB
|
||
cmp al,0xF6
|
||
jz RtnADOX
|
||
.L0: jmp ErrorDec
|
||
;-----------------------------------------------------------------------------
|
||
CRC32R: call R32RM32
|
||
mov [I.Arg2.Type],GPR08
|
||
cmp [I.W],0
|
||
jz .L1
|
||
mov [I.Arg1.Type],GPR64
|
||
.L1: ret
|
||
;-----------------------------------------------------------------------------
|
||
CRC32X: call R32RM32
|
||
BitTR I.Prefixes,P66
|
||
jnc .L0
|
||
mov [I.Arg2.Type],GPR16
|
||
.L0:
|
||
cmp [I.W],0
|
||
jz .L1
|
||
mov [I.Arg1.Type],GPR64
|
||
mov [I.Arg2.Type],GPR64
|
||
.L1: ret
|
||
;-----------------------------------------------------------------------------
|
||
Rtn0F39:test [I.Sensitive],NIA
|
||
jz ErrorDec
|
||
ret
|
||
;-----------------------------------------------------------------------------
|
||
Rtn0F3A:test [I.Sensitive],NIA
|
||
jnz .L0
|
||
test [I.Sensitive],UND
|
||
jz .L1
|
||
mov [I.Name],TRDM
|
||
ret
|
||
.L0: mov [I.Name],TBB0?RESET
|
||
ret
|
||
.L1: FetchB
|
||
cmp al,14h
|
||
jz Rtn0F3A14
|
||
cmp al,15h
|
||
jz Rtn0F3A15
|
||
cmp al,16h
|
||
jz Rtn0F3A16
|
||
cmp al,17h
|
||
jz Rtn0F3A17
|
||
cmp al,20h
|
||
jz Rtn0F3A20
|
||
cmp al,21h
|
||
jz Rtn0F3A21
|
||
cmp al,22h
|
||
jz Rtn0F3A22
|
||
cmp al,44h
|
||
jz Rtn0F3A44
|
||
cmp al,$CC
|
||
jz .CC
|
||
|
||
mov edx,TableSXSSE
|
||
.L5: cmp al,[rdx]
|
||
je .L4
|
||
add edx,4
|
||
cmp edx,TableEXSSE
|
||
jb .L5
|
||
jmp ErrorDec
|
||
.L4: mov edx,[rdx+1]
|
||
mov [I.RandSize],dl
|
||
shr edx,8
|
||
mov [I.Name],dx
|
||
|
||
BitTR I.Prefixes,P66
|
||
jnc .No66
|
||
mov [I.Mandatory66],1
|
||
.L3: call R32RM32X
|
||
.L2: FetchB
|
||
mov [I.Arg3.Type],80h+1
|
||
mov [I.Arg3.ImmB],al
|
||
ret
|
||
.No66: cmp al,0Fh
|
||
jnz ErrorDec
|
||
mov [I.RandSize],VQWORD+80h
|
||
call RtnMM2MM
|
||
jmp .L2
|
||
.CC: mov [I.Name],TSHA1RNDS4
|
||
mov [I.RandSize],VXWORD+80h
|
||
jmp .L3
|
||
;-----------------------------------------------------------------------------
|
||
Rtn0F1012:
|
||
test [I.Sensitive],UND
|
||
jnz RM8R8
|
||
jmp Rtn0066F2F3
|
||
|
||
Rtn0F11X:
|
||
test [I.Sensitive],UND
|
||
jz Rtn0066F2F3
|
||
cmp [I.Operand],0
|
||
jz RM16R16
|
||
jmp RM32R32
|
||
|
||
Rtn0F13X:
|
||
test [I.Sensitive],UND
|
||
jz Rtn0066F2F3
|
||
cmp [I.Operand],0
|
||
jz R16RM16
|
||
jmp R32RM32
|
||
|
||
Rtn0F18:call FetchModRM
|
||
cmp [I.Mod],3
|
||
jz ErrorDec
|
||
setnz [I.Arg1.Mem]
|
||
mov al,[I.Reg]
|
||
mov dx,TPREFETCHNTA
|
||
or al,al
|
||
jz .L1
|
||
mov dx,TPREFETCHT0
|
||
cmp al,1
|
||
jz .L1
|
||
mov dx,TPREFETCHT1
|
||
cmp al,2
|
||
jz .L1
|
||
mov dx,TPREFETCHT2
|
||
cmp al,3
|
||
jnz ErrorDec
|
||
.L1: mov [I.Name],dx
|
||
mov [I.RandSize],0
|
||
ret
|
||
|
||
|
||
Rtn0F1C:call FetchModRM
|
||
cmp [I.Mod],3
|
||
jz .Exit
|
||
cmp [I.Reg],0
|
||
jnz .Exit
|
||
stc
|
||
ret
|
||
.Exit: mov rsi,[I.SaveRSI]
|
||
clc
|
||
ret
|
||
|
||
Is0F1C: mov [I.RandSize],VBYTE+80h
|
||
mov [I.Name],TCLDEMOTE
|
||
;cmp [I.Mod],3
|
||
;setnz [I.Arg1.Mem]
|
||
mov [I.Arg1.Type],GPR08
|
||
mov [I.Arg1.Type2nd],InRM
|
||
ret
|
||
|
||
Rtn0F1C16:
|
||
call Rtn0F1C
|
||
jc Is0F1C
|
||
Rtn0F1X16:
|
||
mov ebx,RM16
|
||
jmp Rtn0F18XX.L1
|
||
Rtn0F1C32:
|
||
call Rtn0F1C
|
||
jc Is0F1C
|
||
Rtn0F1X32:
|
||
mov ebx,RM32
|
||
jmp Rtn0F18XX.L1
|
||
Rtn0F1C64:
|
||
call Rtn0F1C
|
||
jc Is0F1C
|
||
Rtn0F1X64:
|
||
mov ebx,RM64
|
||
jmp Rtn0F18XX.L1
|
||
|
||
Rtn0F1816:
|
||
mov ebx,RM16
|
||
jmp Rtn0F18XX
|
||
Rtn0F1832:
|
||
mov ebx,RM32
|
||
jmp Rtn0F18XX
|
||
Rtn0F1864:
|
||
mov ebx,RM64
|
||
;jmp Rtn0F18XX
|
||
Rtn0F18XX:
|
||
.L0: test [I.Sensitive],UND
|
||
jz Rtn0F18
|
||
.L1: BitTR I.Prefixes,P66
|
||
call ClearW
|
||
|
||
movzx eax,word [rsi-1]
|
||
sub al,18h
|
||
shl al,3
|
||
and ah,111000b
|
||
shr ah,3
|
||
add al,ah
|
||
xor ah,ah
|
||
mov cl,10
|
||
div cl
|
||
add ax,'00'
|
||
cmp al,'0'
|
||
jne @F
|
||
mov al,ah
|
||
xor ah,ah
|
||
@@: mov [Names+THINT?NOPXX+8],ax
|
||
mov [I.Name],THINT?NOPXX
|
||
jmp rbx
|
||
|
||
Rtn0F1A:mov r8d,N0F1A
|
||
jmp Rtn0F1B.L0
|
||
Rtn0F1B:mov r8d,N0F1B
|
||
.L0: xor edx,edx
|
||
mov dl,3
|
||
mov ecx,edx
|
||
movzx eax,[I.PrefixByte]
|
||
bsf edx,eax
|
||
bsr ecx,eax
|
||
cmp edx,ecx
|
||
jnz ErrorDec
|
||
push rdx
|
||
mov edx,[rdx*2+r8]
|
||
mov [I.Name],dx
|
||
BitTR I.Prefixes,P67 ; 0x48 & 0x67 have no effect
|
||
pushf
|
||
call FetchModRM
|
||
popf
|
||
jnc @F
|
||
BitTS I.Prefixes,P67
|
||
@@:
|
||
pop rdx
|
||
movzx eax,word [rdx*2+r8+4*2]
|
||
add eax,RtnXX
|
||
mov [I.RandSize],0
|
||
jmp rax
|
||
;-----------------------------------------------------------------------------
|
||
Rtn0F1E:
|
||
BitTR I.Prefixes,PF3
|
||
jz ErrorDec
|
||
mov al,[rsi]
|
||
mov dx,TENDBR32
|
||
cmp al,0xFB
|
||
jz .2
|
||
mov dx,TENDBR64
|
||
cmp al,0xFA
|
||
jz .2
|
||
mov [I.Arg1.Type],GPR64
|
||
mov dx,TRDSSPQ
|
||
test [I.PreREX],8 ;REX.W
|
||
jnz .1
|
||
mov [I.Arg1.Type],GPR32
|
||
mov dx,TRDSSPD
|
||
.1: mov [I.Name],dx
|
||
call FetchModRM
|
||
cmp [I.Mod],3
|
||
jnz ErrorDec
|
||
cmp [I.Reg],1
|
||
jnz ErrorDec
|
||
mov [I.Arg1.Type2nd],InRM
|
||
ret
|
||
.2: mov [I.Name],dx
|
||
lodsb
|
||
ret
|
||
;-----------------------------------------------------------------------------
|
||
RBNDLDX:push BNDX1
|
||
cmp [I.Mod],3
|
||
jz ErrorDec
|
||
jmp R32RM32M
|
||
;-----------------------------------------------------------------------------
|
||
RBNDSTX:push BNDX2
|
||
cmp [I.Mod],3
|
||
jz ErrorDec
|
||
jmp RM32R32M
|
||
;-----------------------------------------------------------------------------
|
||
RBNDMOV1:
|
||
push BNDX3
|
||
BitTR I.Prefixes,P66
|
||
jmp RM32R32M
|
||
;-----------------------------------------------------------------------------
|
||
RBNDMOV2:
|
||
push BNDX3
|
||
BitTR I.Prefixes,P66
|
||
jmp R32RM32M
|
||
;-----------------------------------------------------------------------------
|
||
RBNDCU: RBNDCN:
|
||
push BNDX4
|
||
BitTR I.Prefixes,PF2
|
||
jmp R32RM32M
|
||
;-----------------------------------------------------------------------------
|
||
RBNDMK: cmp [I.Mod],3
|
||
jz ErrorDec
|
||
RBNDCL: push BNDX4
|
||
BitTR I.Prefixes,PF3
|
||
jmp R32RM32M
|
||
;-----------------------------------------------------------------------------
|
||
Rtn0066F2F3:
|
||
call Start66F2F3
|
||
.L1:
|
||
movzx ebx,word [rdx+rbx+4*1+4*2]
|
||
add ebx,RtnXX
|
||
|
||
mov edx,[rdx]
|
||
or dx,dx
|
||
jz ErrorDec
|
||
not al
|
||
and byte [I.Prefixes],al
|
||
mov [I.Name],dx
|
||
|
||
jmp rbx
|
||
;-----------------------------------------------------------------------------
|
||
RtnWB: BitTR I.Prefixes,PF3
|
||
jnc .Exit
|
||
mov [I.Name],TWBNOINVD
|
||
.Exit: ret
|
||
;-----------------------------------------------------------------------------
|
||
YaMOVDIRI:
|
||
mov [I.Name],TMOVDIRI
|
||
mov [I.RandSize],VDWORD+80h
|
||
cmp [I.W],0
|
||
jz RM32R32
|
||
BitTR I.Prefixes,P4X
|
||
mov [I.RandSize],VQWORD+80h
|
||
jmp RM64R64
|
||
;-----------------------------------------------------------------------------
|
||
YaMOVDIR64B:
|
||
BitTR I.Prefixes,P66
|
||
mov [I.Mandatory66],True
|
||
mov [I.Name],TMOVDIR64B
|
||
call FetchModRM
|
||
;cmp [I.Mod],3
|
||
;setnz [I.Arg1.Mem]
|
||
mov al,[I.Address]
|
||
add al,GPR16
|
||
mov [I.Arg1.Type],al
|
||
mov [I.Arg1.Type2nd],InReg
|
||
|
||
mov [I.Arg2.Type],GPR64
|
||
mov [I.Arg2.Type2nd],InRM
|
||
ret
|
||
;-----------------------------------------------------------------------------
|
||
Rtn0066F2F3Y:
|
||
lodsb
|
||
cmp [I.PrefixByte],bit P66
|
||
jnz NoMOVDIR64B
|
||
cmp al,0xF8
|
||
jnz NoMOVDIR64B
|
||
cmp byte [rsi],0xC0
|
||
jb YaMOVDIR64B
|
||
NoMOVDIR64B:
|
||
cmp al,0xF9
|
||
jnz NoMOVDIRI
|
||
cmp byte [rsi],0xC0
|
||
jb YaMOVDIRI
|
||
NoMOVDIRI:
|
||
dec rsi
|
||
|
||
mov ecx,[rdx+4*2]
|
||
|
||
mov al,[I.PrefixByte]
|
||
or al,al
|
||
jz .L1
|
||
shr ecx,8
|
||
add edx,2
|
||
cmp al,bit P66
|
||
setz [I.Mandatory66]
|
||
jz .L1
|
||
shr ecx,8
|
||
add edx,2
|
||
cmp al,bit PF2
|
||
jz .L1
|
||
cmp al,bit PF2+bit P66
|
||
jz .L0
|
||
shr ecx,8
|
||
add edx,2
|
||
cmp al,bit PF3
|
||
jz .L1
|
||
jmp ErrorDec
|
||
.L0: mov al,bit PF2
|
||
.L1: mov [I.RandSize],cl
|
||
|
||
xor ebx,ebx
|
||
jmp Rtn0066F2F3.L1
|
||
;-----------------------------------------------------------------------------
|
||
Rtn0066F2F3X:
|
||
r8w equ di
|
||
call Start66F2F3
|
||
|
||
mov r8d,[rdx+rbx+2*2*4+4]
|
||
|
||
movzx ebx,word [rdx+rbx+1*2*4+4]
|
||
add ebx,RtnXX
|
||
|
||
mov edx,[rdx]
|
||
or dx,dx
|
||
jz ErrorDec
|
||
not al
|
||
and byte [I.Prefixes],al
|
||
mov [I.Name],dx
|
||
|
||
push r8
|
||
call rbx
|
||
pop r8
|
||
|
||
mov eax,r8d
|
||
and eax,0F0Fh
|
||
mov [I.Arg1.Type],al
|
||
mov [I.Arg2.Type],ah
|
||
|
||
test r8w,8080h
|
||
jz .L1
|
||
cmp [I.W],0
|
||
jz .L1
|
||
call ClearW
|
||
|
||
test r8b,0080h
|
||
ifnz mov [I.Arg1.Type],GPR64
|
||
test r8w,8000h
|
||
ifnz mov [I.Arg2.Type],GPR64
|
||
|
||
test r8w,2020h
|
||
ifnz mov [I.LastByte],'q'
|
||
|
||
test r8w,4040h
|
||
jz .L1
|
||
and [I.RandSize],0xF0
|
||
or [I.RandSize],VQWORD
|
||
.L1:
|
||
test r8w,1010h
|
||
jz .L2
|
||
FetchB
|
||
mov [I.Arg3.Type],80h+1
|
||
mov [I.Arg3.ImmB],al
|
||
.L2:
|
||
ret
|
||
|
||
RM16F5: mov [I.AltName],TLJMP
|
||
jmp RM16F35
|
||
RM16F3: mov [I.AltName],TLCALL
|
||
RM16F35:mov [I.Point],TFAR
|
||
call RM16
|
||
cmp [I.Mod],3
|
||
jz ErrorDec
|
||
cmp [I.Syntax],0
|
||
jnz .SkipATT
|
||
mov [I.RandSize],VDWORD
|
||
.SkipATT:
|
||
ret
|
||
|
||
RM32F5: mov [I.AltName],TLJMP
|
||
jmp RM32F35
|
||
RM32F3: mov [I.AltName],TLCALL
|
||
RM32F35:mov [I.Point],TFAR
|
||
call RM32
|
||
cmp [I.Mod],3
|
||
jz ErrorDec
|
||
cmp [I.Syntax],0
|
||
jnz .SkipATT
|
||
mov [I.RandSize],VFWORD
|
||
.SkipATT:
|
||
ret
|
||
|
||
RM64F5: mov [I.AltName],TLJMP
|
||
jmp RM64F35
|
||
RM64F3: mov [I.AltName],TLCALL
|
||
RM64F35:mov [I.Point],TFAR
|
||
call RM64
|
||
cmp [I.Mod],3
|
||
jz ErrorDec
|
||
cmp [I.Syntax],0
|
||
jnz .SkipATT
|
||
mov [I.RandSize],VTWORD
|
||
.SkipATT:
|
||
ret
|
||
|
||
R8I08:
|
||
FetchB
|
||
|
||
mov [I.Arg1.Type],GPR08
|
||
|
||
mov [I.Arg2.Type],80h+1
|
||
mov [I.Arg2.ImmB],al
|
||
|
||
ret
|
||
|
||
R16I16:
|
||
FetchW
|
||
|
||
mov [I.Arg1.Type],GPR16
|
||
|
||
mov [I.Arg2.Type],80h+2
|
||
mov [I.Arg2.Imm],rax
|
||
|
||
ret
|
||
|
||
R32I32:
|
||
FetchSD
|
||
|
||
mov [I.Arg1.Type],GPR32
|
||
|
||
mov [I.Arg2.Type],80h+4
|
||
mov [I.Arg2.Imm],rax
|
||
|
||
ret
|
||
|
||
R64I32:
|
||
FetchSD
|
||
|
||
mov [I.Arg1.Type],GPR64
|
||
|
||
mov [I.Arg2.Type],80h+40h+4
|
||
mov [I.Arg2.Imm],rax
|
||
|
||
ret
|
||
|
||
R16RM16I16:
|
||
call FetchModRM
|
||
|
||
;cmp [I.Mod],3
|
||
;setnz [I.Arg2.Mem]
|
||
mov [I.Arg2.Type],GPR16
|
||
mov [I.Arg2.Type2nd],InRM
|
||
|
||
mov [I.Arg1.Type],GPR16
|
||
mov [I.Arg1.Type2nd],InReg
|
||
|
||
FetchSW
|
||
mov [I.Arg3.Type],80h+40h+20h+2
|
||
mov [I.Arg3.Imm],rax
|
||
ret
|
||
|
||
R32RM32I32:
|
||
call FetchModRM
|
||
|
||
;cmp [I.Mod],3
|
||
;setnz [I.Arg2.Mem]
|
||
mov [I.Arg2.Type],GPR32
|
||
mov [I.Arg2.Type2nd],InRM
|
||
|
||
mov [I.Arg1.Type],GPR32
|
||
mov [I.Arg1.Type2nd],InReg
|
||
|
||
FetchSD
|
||
mov [I.Arg3.Type],80h+40h+20h+4
|
||
mov [I.Arg3.Imm],rax
|
||
ret
|
||
|
||
R64RM64I32:
|
||
call FetchModRM
|
||
|
||
;cmp [I.Mod],3
|
||
;setnz [I.Arg2.Mem]
|
||
mov [I.Arg2.Type],GPR64
|
||
mov [I.Arg2.Type2nd],InRM
|
||
|
||
mov [I.Arg1.Type],GPR64
|
||
mov [I.Arg1.Type2nd],InReg
|
||
|
||
FetchSD
|
||
mov [I.Arg3.Type],80h+40h+20h+4
|
||
mov [I.Arg3.Imm],rax
|
||
ret
|
||
|
||
R16RM16SI16:
|
||
call FetchModRM
|
||
|
||
;cmp [I.Mod],3
|
||
;setnz [I.Arg2.Mem]
|
||
mov [I.Arg2.Type],GPR16
|
||
mov [I.Arg2.Type2nd],InRM
|
||
|
||
mov [I.Arg1.Type],GPR16
|
||
mov [I.Arg1.Type2nd],InReg
|
||
|
||
FetchSB
|
||
mov [I.Arg3.Type],80h+40h+20h+1
|
||
mov [I.Arg3.Imm],rax
|
||
ret
|
||
|
||
R32RM32SI32:
|
||
call FetchModRM
|
||
|
||
;cmp [I.Mod],3
|
||
;setnz [I.Arg2.Mem]
|
||
mov [I.Arg2.Type],GPR32
|
||
mov [I.Arg2.Type2nd],InRM
|
||
|
||
mov [I.Arg1.Type],GPR32
|
||
mov [I.Arg1.Type2nd],InReg
|
||
|
||
FetchSB
|
||
mov [I.Arg3.Type],80h+40h+20h+1
|
||
mov [I.Arg3.Imm],rax
|
||
ret
|
||
|
||
R64RM64SI32:
|
||
call FetchModRM
|
||
|
||
;cmp [I.Mod],3
|
||
;setnz [I.Arg2.Mem]
|
||
mov [I.Arg2.Type],GPR64
|
||
mov [I.Arg2.Type2nd],InRM
|
||
|
||
mov [I.Arg1.Type],GPR64
|
||
mov [I.Arg1.Type2nd],InReg
|
||
|
||
FetchSB
|
||
mov [I.Arg3.Type],80h+40h+20h+1
|
||
mov [I.Arg3.Imm],rax
|
||
ret
|
||
|
||
RtnINSX:
|
||
mov [I.PossibleF2F3],True
|
||
|
||
mov [I.AltName],TINS
|
||
|
||
BitTR I.Prefixes,P67
|
||
jnc .SkipATT
|
||
|
||
mov [I.Name],TINS
|
||
|
||
mov [I.Base],RRDI
|
||
|
||
mov [I.Arg1.Type],1
|
||
mov [I.Arg1.Mem],True
|
||
|
||
mov [I.Arg2.Type],2
|
||
mov [I.Arg2.Reg],RRDX
|
||
.SkipATT:
|
||
ret
|
||
|
||
RtnOUTSX:
|
||
mov [I.PossibleF2F3],True
|
||
|
||
mov [I.AltName],TOUTS
|
||
|
||
test byte [I.Prefixes],bit PSEG+bit P67
|
||
jz .SkipATT
|
||
|
||
BitTR I.Prefixes,P67
|
||
|
||
mov [I.Name],TOUTS
|
||
|
||
mov [I.Base],RRSI
|
||
|
||
mov [I.Arg2.Type],1
|
||
mov [I.Arg2.Mem],True
|
||
|
||
mov [I.Arg1.Type],2
|
||
mov [I.Arg1.Reg],RRDX
|
||
|
||
call ClearSeg
|
||
.SkipATT:
|
||
ret
|
||
|
||
RM16I8: call FetchModRM
|
||
|
||
;cmp [I.Mod],3
|
||
;setnz [I.Arg1.Mem]
|
||
mov [I.Arg1.Type],GPR16
|
||
mov [I.Arg1.Type2nd],InRM
|
||
|
||
FetchB
|
||
mov [I.Arg2.Type],80h+1
|
||
mov [I.Arg2.Imm],rax
|
||
ret
|
||
|
||
RM32I8: call FetchModRM
|
||
|
||
;cmp [I.Mod],3
|
||
;setnz [I.Arg1.Mem]
|
||
mov [I.Arg1.Type],GPR32
|
||
mov [I.Arg1.Type2nd],InRM
|
||
|
||
FetchB
|
||
mov [I.Arg2.Type],80h+1
|
||
mov [I.Arg2.Imm],rax
|
||
ret
|
||
|
||
RM64I8: call FetchModRM
|
||
|
||
;cmp [I.Mod],3
|
||
;setnz [I.Arg1.Mem]
|
||
mov [I.Arg1.Type],GPR64
|
||
mov [I.Arg1.Type2nd],InRM
|
||
|
||
FetchB
|
||
mov [I.Arg2.Type],80h+1
|
||
mov [I.Arg2.Imm],rax
|
||
ret
|
||
|
||
RtnC216:
|
||
mov [I.IsRET],True
|
||
FetchW
|
||
mov [I.Arg1.Type],80h+2
|
||
mov [I.Arg1.Imm],rax
|
||
|
||
BitT I.Prefixes,P66
|
||
jnc .SkipSuffix
|
||
mov [I.Suffix],'w'
|
||
.SkipSuffix:
|
||
ret
|
||
|
||
RtnC232:
|
||
mov [I.IsRET],True
|
||
FetchW
|
||
mov [I.Arg1.Type],80h+2
|
||
mov [I.Arg1.Imm],rax
|
||
BitT I.Prefixes,P66
|
||
jnc .SkipSuffix
|
||
mov [I.Suffix],'d'
|
||
.SkipSuffix:
|
||
ret
|
||
|
||
RtnC264:
|
||
mov [I.IsRET],True
|
||
FetchW
|
||
mov [I.Arg1.Type],80h+2
|
||
mov [I.Arg1.Imm],rax
|
||
AddSuffixX:
|
||
cmp [I.W],0
|
||
jz .SkipSuffix
|
||
BitTR I.Prefixes,P4X
|
||
mov [I.Suffix],'q'
|
||
.SkipSuffix:
|
||
ret
|
||
|
||
AddSuffixQ:
|
||
cmp [I.Syntax],0
|
||
jz AddSuffixX
|
||
ret
|
||
|
||
RtnC316:
|
||
mov [I.IsRET],True
|
||
BitT I.Prefixes,P66
|
||
jnc .SkipSuffix
|
||
mov [I.Suffix],'w'
|
||
.SkipSuffix:
|
||
ret
|
||
|
||
RtnC332:
|
||
mov [I.IsRET],True
|
||
BitT I.Prefixes,P66
|
||
jnc .SkipSuffix
|
||
mov [I.Suffix],'d'
|
||
.SkipSuffix:
|
||
ret
|
||
|
||
RtnC364:
|
||
mov [I.IsRET],True
|
||
cmp [I.W],0
|
||
jz .SkipSuffix
|
||
BitTR I.Prefixes,P4X
|
||
mov [I.Suffix],'q'
|
||
.SkipSuffix:
|
||
ret
|
||
|
||
RtnC816:
|
||
BitT I.Prefixes,P66
|
||
jnc .SkipSuffix
|
||
mov [I.RandSize],VWORD
|
||
mov [I.Suffix],'w'
|
||
.SkipSuffix:
|
||
jmp RtnC864
|
||
|
||
RtnC832:
|
||
BitT I.Prefixes,P66
|
||
jnc .SkipSuffix
|
||
mov [I.RandSize],VDWORD
|
||
mov [I.Suffix],'d'
|
||
.SkipSuffix:
|
||
jmp RtnC864
|
||
|
||
RtnC864:
|
||
lea r10,[I.Arg2]
|
||
lea rax,[I.Arg1]
|
||
mov r8,rax
|
||
xor r8,r10
|
||
|
||
cmp [I.Syntax],0
|
||
jnz .ATT
|
||
xor r10,r8
|
||
.ATT:
|
||
FetchW
|
||
mov [r10+TArg.Type],80h+2
|
||
mov [r10+TArg.Imm],rax
|
||
FetchB
|
||
xor r10,r8
|
||
mov [r10+TArg.Type],80h+1
|
||
mov [r10+TArg.Imm],rax
|
||
ret
|
||
|
||
RtnC916:
|
||
BitT I.Prefixes,P66
|
||
jnc .SkipSuffix
|
||
mov [I.RandSize],VWORD
|
||
mov [I.Suffix],'w'
|
||
.SkipSuffix:
|
||
jmp RtnC964
|
||
RtnC932:
|
||
BitT I.Prefixes,P66
|
||
jnc .SkipSuffix
|
||
mov [I.RandSize],VDWORD
|
||
mov [I.Suffix],'d'
|
||
.SkipSuffix:
|
||
RtnC964:
|
||
ret
|
||
|
||
RtnCD: cmp [I.Emulated],0
|
||
jnz .Emul
|
||
FetchB
|
||
.L4: mov [I.Name],TINT
|
||
mov [I.Arg1.Type],80h+1
|
||
mov [I.Arg1.ImmB],al
|
||
ret
|
||
.Emul:
|
||
FetchB
|
||
cmp al,34h
|
||
jb .L4
|
||
cmp al,3Bh
|
||
ja .L1
|
||
add al,$D8-34h
|
||
pop rdx
|
||
jmp DisAsm.NewTable
|
||
.L1: cmp al,3Ch
|
||
jne .L2
|
||
FetchB
|
||
mov [I.SegmName],TES
|
||
cmp al,$C0
|
||
jae .V9
|
||
cmp al,$3F
|
||
jb .V9
|
||
mov [I.SegmName],TSS
|
||
cmp al,7Fh
|
||
ja .V9
|
||
mov [I.SegmName],TCS
|
||
.V9:
|
||
mov [I.CurSeg],0xFF
|
||
and al,8
|
||
add al,$D0
|
||
pop rdx
|
||
jmp DisAsm.NewTable
|
||
.L2: cmp al,3Dh
|
||
jne .L3
|
||
mov [I.Name],TWAIT
|
||
ret
|
||
.L3: cmp al,3Eh
|
||
jne .L4
|
||
FetchW
|
||
mov al,3Eh
|
||
jmp .L4
|
||
|
||
RM81: call FetchModRM
|
||
|
||
;cmp [I.Mod],3
|
||
;setnz [I.Arg1.Mem]
|
||
mov [I.Arg1.Type],GPR08
|
||
mov [I.Arg1.Type2nd],InRM
|
||
|
||
mov word [I.Arg2.Type],Is1 shl 8+80h+1
|
||
ret
|
||
|
||
RM161: call FetchModRM
|
||
|
||
;cmp [I.Mod],3
|
||
;setnz [I.Arg1.Mem]
|
||
mov [I.Arg1.Type],GPR16
|
||
mov [I.Arg1.Type2nd],InRM
|
||
|
||
mov word [I.Arg2.Type],Is1 shl 8+80h+1
|
||
ret
|
||
|
||
RM321: call FetchModRM
|
||
|
||
;cmp [I.Mod],3
|
||
;setnz [I.Arg1.Mem]
|
||
mov [I.Arg1.Type],GPR32
|
||
mov [I.Arg1.Type2nd],InRM
|
||
|
||
mov word [I.Arg2.Type],Is1 shl 8+80h+1
|
||
ret
|
||
|
||
RM641: call FetchModRM
|
||
|
||
;cmp [I.Mod],3
|
||
;setnz [I.Arg1.Mem]
|
||
mov [I.Arg1.Type],GPR64
|
||
mov [I.Arg1.Type2nd],InRM
|
||
|
||
mov word [I.Arg2.Type],Is1 shl 8+80h+1
|
||
ret
|
||
|
||
RM8CL: call FetchModRM
|
||
|
||
;cmp [I.Mod],3
|
||
;setnz [I.Arg1.Mem]
|
||
mov [I.Arg1.Type],GPR08
|
||
mov [I.Arg1.Type2nd],InRM
|
||
|
||
mov [I.Arg2.Type],GPR08
|
||
mov [I.Arg2.Reg],RRCX
|
||
ret
|
||
|
||
RM16CL: call FetchModRM
|
||
|
||
;cmp [I.Mod],3
|
||
;setnz [I.Arg1.Mem]
|
||
mov [I.Arg1.Type],GPR16
|
||
mov [I.Arg1.Type2nd],InRM
|
||
|
||
mov [I.Arg2.Type],GPR08
|
||
mov [I.Arg2.Reg],RRCX
|
||
ret
|
||
|
||
RM32CL: call FetchModRM
|
||
|
||
;cmp [I.Mod],3
|
||
;setnz [I.Arg1.Mem]
|
||
mov [I.Arg1.Type],GPR32
|
||
mov [I.Arg1.Type2nd],InRM
|
||
|
||
mov [I.Arg2.Type],GPR08
|
||
mov [I.Arg2.Reg],RRCX
|
||
ret
|
||
|
||
RM64CL: call FetchModRM
|
||
|
||
;cmp [I.Mod],3
|
||
;setnz [I.Arg1.Mem]
|
||
mov [I.Arg1.Type],GPR64
|
||
mov [I.Arg1.Type2nd],InRM
|
||
|
||
mov [I.Arg2.Type],GPR08
|
||
mov [I.Arg2.Reg],RRCX
|
||
ret
|
||
|
||
LoseByte:
|
||
FetchB
|
||
cmp al,0Ah
|
||
je .Default
|
||
mov [I.Arg1.Type],80h+1
|
||
mov [I.Arg1.ImmB],al
|
||
.Default:
|
||
ret
|
||
|
||
RtnD7:
|
||
test byte [I.Prefixes],bit PSEG+bit P67
|
||
jz .SkipATT
|
||
|
||
BitTR I.Prefixes,P67
|
||
|
||
mov [I.Name],TXLAT
|
||
|
||
mov [I.RandSize],VBYTE
|
||
|
||
mov [I.Base],RRBX
|
||
|
||
mov [I.Arg1.Type],1
|
||
mov [I.Arg1.Mem],True
|
||
|
||
call ClearSeg
|
||
.SkipATT:
|
||
ret
|
||
|
||
RtnE0: push DODISPB
|
||
mov al,[I.Arch]
|
||
cmp al,CPUX32
|
||
jz .32
|
||
.16:
|
||
.64:
|
||
BitTR I.Prefixes,P67
|
||
jnc @F
|
||
mov dword [I.Name],TLOOPNZL shl 16+TLOOPNZD
|
||
@@:
|
||
ret
|
||
.32:
|
||
BitTR I.Prefixes,P67
|
||
jnc @F
|
||
mov [I.Name],TLOOPNZW
|
||
@@:
|
||
ret
|
||
|
||
RtnE1: push DODISPB
|
||
mov al,[I.Arch]
|
||
cmp al,CPUX32
|
||
jz .32
|
||
.16:
|
||
.64:
|
||
BitTR I.Prefixes,P67
|
||
jnc @F
|
||
mov dword [I.Name],TLOOPZL shl 16+TLOOPZD
|
||
@@:
|
||
ret
|
||
.32:
|
||
BitTR I.Prefixes,P67
|
||
jnc @F
|
||
mov [I.Name],TLOOPZW
|
||
@@:
|
||
ret
|
||
|
||
RtnE2: push DODISPB
|
||
mov al,[I.Arch]
|
||
cmp al,CPUX32
|
||
jz .32
|
||
.16:
|
||
.64:
|
||
BitTR I.Prefixes,P67
|
||
jnc @F
|
||
mov dword [I.Name],TLOOPL shl 16+TLOOPD
|
||
@@:
|
||
ret
|
||
.32:
|
||
BitTR I.Prefixes,P67
|
||
jnc @F
|
||
mov [I.Name],TLOOPW
|
||
@@:
|
||
ret
|
||
|
||
RtnE3: push DODISPB
|
||
mov al,[I.Arch]
|
||
cmp al,CPUX16
|
||
jz .16
|
||
cmp al,CPUX32
|
||
jz .32
|
||
.64:
|
||
mov [I.Name],TJRCXZ
|
||
BitTR I.Prefixes,P67
|
||
jnc @F
|
||
mov [I.Name],TJECXZ
|
||
@@:
|
||
ret
|
||
.32:
|
||
mov [I.Name],TJECXZ
|
||
BitTR I.Prefixes,P67
|
||
jnc @F
|
||
mov [I.Name],TJCXZ
|
||
@@:
|
||
ret
|
||
.16:
|
||
mov [I.Name],TJCXZ
|
||
BitTR I.Prefixes,P67
|
||
jnc @F
|
||
mov [I.Name],TJECXZ
|
||
@@:
|
||
ret
|
||
|
||
RtnE4: mov [I.Arg1.Type],GPR08
|
||
RtnEXVV:
|
||
FetchB
|
||
mov [I.Arg2.Type],80h+1
|
||
mov [I.Arg2.ImmB],al
|
||
ret
|
||
|
||
RtnE516:mov [I.Arg1.Type],GPR16
|
||
jmp RtnEXVV
|
||
|
||
RtnE532:mov [I.Arg1.Type],GPR32
|
||
jmp RtnEXVV
|
||
|
||
RtnEC: mov [I.Arg1.Type],GPR08
|
||
RtnEXXX:mov [I.Arg2.Type],GPR16
|
||
mov [I.Arg2.Reg],RRDX
|
||
ret
|
||
|
||
RtnED16:mov [I.Arg1.Type],GPR16
|
||
jmp RtnEXXX
|
||
|
||
RtnED32:mov [I.Arg1.Type],GPR32
|
||
jmp RtnEXXX
|
||
|
||
RtnE6: FetchB
|
||
mov [I.Arg2.Type],GPR08
|
||
RtnEXYY:mov [I.Arg1.Type],80h+1
|
||
mov [I.Arg1.ImmB],al
|
||
ret
|
||
|
||
RtnE716:FetchB
|
||
mov [I.Arg2.Type],GPR16
|
||
jmp RtnEXYY
|
||
|
||
RtnE732:FetchB
|
||
mov [I.Arg2.Type],GPR32
|
||
jmp RtnEXYY
|
||
|
||
RtnEE: mov [I.Arg2.Type],GPR08
|
||
RtnEXZZ:
|
||
mov [I.Arg1.Type],GPR16
|
||
mov [I.Arg1.Reg],RRDX
|
||
ret
|
||
|
||
RtnEF16:mov [I.Arg2.Type],GPR16
|
||
jmp RtnEXZZ
|
||
|
||
RtnEF32:mov [I.Arg2.Type],GPR32
|
||
jmp RtnEXZZ
|
||
|
||
ESC_0_000:
|
||
ESC_0_001:
|
||
ESC_0_010:
|
||
ESC_0_011:
|
||
ESC_0_100:
|
||
ESC_0_101:
|
||
ESC_0_110:
|
||
ESC_0_111:
|
||
call FetchModRM
|
||
|
||
lea r8,[I.Arg1]
|
||
|
||
cmp [I.Mod],3
|
||
setnz [I.Arg1.Mem]
|
||
mov [I.Arg1.Type],STXRG
|
||
jnz .Exit
|
||
|
||
mov [I.RandSize],0
|
||
|
||
cmp [I.Reg],2
|
||
jz .Exit
|
||
cmp [I.Reg],3
|
||
jz .Exit
|
||
|
||
lea r8,[I.Arg2]
|
||
mov [r8+TArg.Type],STXRG
|
||
.Exit:
|
||
mov [r8+TArg.Type2nd],InRM
|
||
ret
|
||
|
||
ESC_1_000:
|
||
call FetchModRM
|
||
|
||
mov [I.Arg1.Type2nd],InRM
|
||
|
||
cmp [I.Mod],3
|
||
setnz [I.Arg1.Mem]
|
||
mov [I.Arg1.Type],STXRG
|
||
jnz .Exit
|
||
|
||
mov [I.RandSize],0
|
||
.Exit:
|
||
ret
|
||
|
||
ESC_1_001:
|
||
call FetchModRM
|
||
|
||
cmp [I.Mod],3
|
||
setnz [I.Arg1.Mem]
|
||
mov [I.Arg1.Type],STXRG
|
||
jnz ErrorDec
|
||
|
||
mov [I.RandSize],0
|
||
|
||
mov [I.Arg1.Type2nd],InRM
|
||
ret
|
||
|
||
ESC_1_010:
|
||
call FetchModRM
|
||
|
||
cmp [I.Mod],3
|
||
setnz [I.Arg1.Mem]
|
||
mov [I.Arg1.Type],STXRG
|
||
jnz .Exit
|
||
|
||
mov [I.RandSize],0
|
||
|
||
cmp byte [rsi-1],0xD0
|
||
jnz ErrorDec
|
||
mov [I.Arg1.Type],0
|
||
mov [I.Name],TFNOP
|
||
.Exit:
|
||
ret
|
||
|
||
ESC_1_011:
|
||
call FetchModRM
|
||
|
||
cmp [I.Mod],3
|
||
setnz [I.Arg1.Mem]
|
||
mov [I.Arg1.Type],STXRG
|
||
jnz .Exit
|
||
|
||
mov [I.RandSize],0
|
||
|
||
mov [I.Name],TFSTP1
|
||
|
||
mov [I.Arg1.Type2nd],InRM
|
||
.Exit:
|
||
ret
|
||
|
||
ESC_1_100:
|
||
call FetchModRM
|
||
|
||
mov [I.Name],TFLDENV
|
||
|
||
mov al,[I.Arch]
|
||
cmp al,CPUX16
|
||
jz .16
|
||
.64:
|
||
.32:
|
||
BitTR I.Prefixes,P66
|
||
jnc @F
|
||
mov dword [I.Name],TFLDENVS shl 16+TFLDENVW
|
||
@@:
|
||
jmp .XX
|
||
.16:
|
||
BitTR I.Prefixes,P66
|
||
jnc @F
|
||
mov dword [I.Name],TFLDENVS shl 16+TFLDENVD
|
||
@@:
|
||
|
||
.XX: cmp [I.Mod],3
|
||
setnz [I.Arg1.Mem]
|
||
mov [I.Arg1.Type],STXRG
|
||
jnz .Exit
|
||
|
||
mov al,[I.RM]
|
||
mov [I.Name],TFCHS
|
||
or al,al
|
||
jz .Quit
|
||
mov [I.Name],TFABS
|
||
cmp al,1
|
||
jz .Quit
|
||
mov [I.Name],TFTST
|
||
cmp al,4
|
||
jz .Quit
|
||
mov [I.Name],TFXAM
|
||
cmp al,5
|
||
jnz ErrorDec
|
||
.Quit: mov [I.Arg1.Type],0
|
||
.Exit: ret
|
||
|
||
ESC_1_101:
|
||
call FetchModRM
|
||
|
||
cmp [I.Mod],3
|
||
setnz [I.Arg1.Mem]
|
||
mov [I.Arg1.Type],STXRG
|
||
jnz .Exit
|
||
|
||
mov [I.Arg1.Type],0
|
||
movzx eax,[I.RM]
|
||
mov ax,[TFLDXTable+rax*2]
|
||
or eax,eax
|
||
jz ErrorDec
|
||
mov [I.Name],ax
|
||
.Exit:
|
||
ret
|
||
|
||
ESC_1_110:
|
||
call FetchModRM
|
||
|
||
cmp [I.Mod],3
|
||
setnz [I.Arg1.Mem]
|
||
mov [I.Arg1.Type],STXRG
|
||
jz .Mod3
|
||
if %B=64
|
||
mov rdx,(TFSTENV shl 16+TFNSTENV)shl 32+(TFSTENV shl 16+TFNSTENV)
|
||
else
|
||
mov edx,(TFSTENV shl 16+TFNSTENV)
|
||
mov edi,(TFSTENV shl 16+TFNSTENV)
|
||
end if
|
||
mov al,[I.Arch]
|
||
cmp al,CPUX16
|
||
jz .16
|
||
.64:
|
||
.32:
|
||
BitTR I.Prefixes,P66
|
||
jnc @F
|
||
if %B=64
|
||
mov rdx,(TFSTENVS shl 16+TFNSTENVS)shl 32+(TFSTENVW shl 16+TFNSTENVW)
|
||
else
|
||
mov edx,(TFSTENVW shl 16+TFNSTENVW)
|
||
mov edi,(TFSTENVS shl 16+TFNSTENVS)
|
||
end if
|
||
@@:
|
||
jmp .XX
|
||
.16:
|
||
BitTR I.Prefixes,P66
|
||
jnc @F
|
||
if %B=64
|
||
mov rdx,(TFSTENVS shl 16+TFNSTENVS)shl 32+(TFSTENVD shl 16+TFNSTENVD)
|
||
else
|
||
mov edx,(TFSTENVD shl 16+TFNSTENVD)
|
||
mov edi,(TFSTENVS shl 16+TFNSTENVS)
|
||
end if
|
||
@@:
|
||
|
||
.XX:
|
||
cmp [I.Syntax],0
|
||
jz .YY
|
||
if %B=64
|
||
rol rdx,32
|
||
else
|
||
mov edx,edi
|
||
end if
|
||
.YY:
|
||
BitTR I.Prefixes,P9B
|
||
jnc @F
|
||
rol edx,16
|
||
@@:
|
||
mov [I.Name],dx
|
||
ret
|
||
|
||
.Mod3:
|
||
mov [I.Arg1.Type],0
|
||
movzx eax,[I.RM]
|
||
mov ax,[TE110Table+rax*2]
|
||
mov [I.Name],ax
|
||
|
||
.Exit: ret
|
||
|
||
ESC_1_111:
|
||
call FetchModRM
|
||
|
||
cmp [I.Mod],3
|
||
setnz [I.Arg1.Mem]
|
||
mov [I.Arg1.Type],STXRG
|
||
jz .Mod3
|
||
|
||
mov ax,TFNSTCW
|
||
BitTR I.Prefixes,P9B
|
||
jnc @F
|
||
mov ax,TFSTCW
|
||
@@:
|
||
jmp .Name
|
||
.Mod3:
|
||
mov [I.Arg1.Type],0
|
||
movzx eax,[I.RM]
|
||
mov ax,[TE111Table+rax*2]
|
||
.Name:
|
||
mov [I.Name],ax
|
||
ret
|
||
|
||
ESC_2_000:
|
||
mov di,TFCMOVB
|
||
jmp ESC_2_XXX
|
||
ESC_2_001:
|
||
mov di,TFCMOVE
|
||
jmp ESC_2_XXX
|
||
ESC_2_010:
|
||
mov di,TFCMOVBE
|
||
jmp ESC_2_XXX
|
||
ESC_2_011:
|
||
mov di,TFCMOVU
|
||
jmp ESC_2_XXX
|
||
ESC_2_100:
|
||
ESC_2_101:
|
||
ESC_2_110:
|
||
ESC_2_111:
|
||
xor edi,edi
|
||
ESC_2_XXX:
|
||
call FetchModRM
|
||
|
||
cmp [I.Mod],3
|
||
setnz [I.Arg1.Mem]
|
||
mov [I.Arg1.Type],STXRG
|
||
jnz .Exit
|
||
|
||
mov [I.RandSize],0
|
||
|
||
mov [I.Name],TFUCOMPP
|
||
cmp byte [rsi-1],0xE9
|
||
jz .Quit
|
||
|
||
or di,di
|
||
jz ErrorDec
|
||
mov [I.Name],di
|
||
mov [I.Arg2.Type],STXRG
|
||
mov [I.Arg2.Type2nd],InRM
|
||
.Exit: ret
|
||
.Quit:
|
||
mov [I.Arg1.Type],0
|
||
ret
|
||
|
||
ESC_3_000:
|
||
mov di,TFCMOVNB
|
||
jmp ESC_3_XXX
|
||
ESC_3_001:
|
||
mov di,TFCMOVNE
|
||
jmp ESC_3_XXX
|
||
ESC_3_010:
|
||
mov di,TFCMOVNBE
|
||
jmp ESC_3_XXX
|
||
ESC_3_011:
|
||
mov di,TFCMOVNU
|
||
ESC_3_XXX:
|
||
ESC_3_YYY:
|
||
call FetchModRM
|
||
|
||
cmp [I.Mod],3
|
||
setnz [I.Arg1.Mem]
|
||
mov [I.Arg1.Type],STXRG
|
||
jnz .Exit
|
||
|
||
mov [I.RandSize],0
|
||
|
||
or di,di
|
||
jz ErrorDec
|
||
mov [I.Name],di
|
||
mov [I.Arg2.Type],STXRG
|
||
mov [I.Arg2.Type2nd],InRM
|
||
.Exit:
|
||
ret
|
||
|
||
ESC_3_100:
|
||
call FetchModRM
|
||
cmp [I.Mod],3
|
||
jnz ErrorDec
|
||
mov al,[I.RM]
|
||
mov edx,TFENI shl 16 +TFNENI
|
||
or al,al
|
||
jz .L1
|
||
mov edx,TFDISI shl 16 +TFNDISI
|
||
dec al
|
||
jz .L1
|
||
mov edx,TFCLEX shl 16 +TFNCLEX
|
||
dec al
|
||
jz .L1
|
||
mov edx,TFINIT shl 16 +TFNINIT
|
||
dec al
|
||
jz .L1
|
||
mov dx,TFSETPM
|
||
dec al
|
||
jz .L2
|
||
mov dx,TFRSTPM
|
||
dec al
|
||
jnz ErrorDec
|
||
jmp .L2
|
||
.L1: BitTR I.Prefixes,P9B
|
||
jnc .L2
|
||
rol edx,16
|
||
.L2: mov [I.Name],dx
|
||
ret
|
||
|
||
ESC_3_101:
|
||
mov di,TFUCOMI
|
||
mov [I.IsFloat],1
|
||
test [I.Sensitive],NIA
|
||
jz ESC_3_YYY
|
||
mov [I.RandSize],0
|
||
call FetchModRM
|
||
cmp [I.Mod],3
|
||
jnz ErrorDec
|
||
mov al,[I.RM]
|
||
mov dx,TFSTB0
|
||
or al,al
|
||
jz .L1
|
||
dec al
|
||
jz ErrorDec
|
||
mov dx,TFSTB2
|
||
dec al
|
||
jz .L1
|
||
mov dx,TFSTB1
|
||
dec al
|
||
jnz ErrorDec
|
||
.L1: mov [I.Name],dx
|
||
ret
|
||
|
||
ESC_3_110:
|
||
call FetchModRM
|
||
cmp [I.Mod],3
|
||
jnz ErrorDec
|
||
|
||
test [I.Sensitive],NIA
|
||
jz .YIA
|
||
|
||
cmp [I.RM],1
|
||
jnz ErrorDec
|
||
mov [I.Name],TF4X4
|
||
ret
|
||
.YIA:
|
||
mov [I.Arg1.Type],STXRG
|
||
mov [I.Arg2.Type],STXRG
|
||
mov [I.Arg2.Type2nd],InRM
|
||
ret
|
||
|
||
ESC_3_111:
|
||
call FetchModRM
|
||
test [I.Sensitive],NIA
|
||
jz .YIA
|
||
|
||
cmp [I.Mod],3
|
||
jnz ErrorDec
|
||
cmp [I.RM],4
|
||
jnz ErrorDec
|
||
mov [I.Name],TFRINT2
|
||
ret
|
||
.YIA:
|
||
cmp [I.Mod],3
|
||
jz ErrorDec
|
||
mov [I.IsFloat],1
|
||
mov [I.Arg1.Mem],True
|
||
mov [I.Arg1.Type],STXRG
|
||
mov [I.RandSize],VTWORD
|
||
ret
|
||
|
||
ESC_4_010:
|
||
mov edi,TFCOM2 shl 16+TFCOM2
|
||
jmp ESC_4_XXX
|
||
ESC_4_011:
|
||
mov edi,TFCOMP3 shl 16+TFCOMP3
|
||
jmp ESC_4_XXX
|
||
ESC_4_000:
|
||
ESC_4_001:
|
||
xor edi,edi
|
||
jmp ESC_4_XXX
|
||
ESC_4_100:
|
||
mov edi,TFSUB shl 16+TFSUBR
|
||
jmp ESC_4_XXX
|
||
ESC_4_101:
|
||
mov edi,TFSUBR shl 16+TFSUB
|
||
jmp ESC_4_XXX
|
||
ESC_4_110:
|
||
mov edi,TFDIV shl 16+TFDIVR
|
||
jmp ESC_4_XXX
|
||
ESC_4_111:
|
||
mov edi,TFDIVR shl 16+TFDIV
|
||
ESC_4_XXX:
|
||
call FetchModRM
|
||
|
||
mov [I.Arg1.Type2nd],InRM
|
||
|
||
cmp [I.Mod],3
|
||
setnz [I.Arg1.Mem]
|
||
mov [I.Arg1.Type],STXRG
|
||
jnz .Exit
|
||
|
||
or edi,edi
|
||
jz .Null
|
||
mov dword [I.Name],edi
|
||
.Null:
|
||
|
||
mov [I.RandSize],0
|
||
|
||
cmp [I.Reg],2
|
||
jz .Exit
|
||
cmp [I.Reg],3
|
||
jz .Exit
|
||
|
||
mov [I.Arg2.Type],STXRG
|
||
.Exit: ret
|
||
|
||
ESC_5_001:
|
||
mov di,TFXCH4
|
||
jmp ESC_5_XXX
|
||
ESC_5_000:
|
||
mov di,TFFREE
|
||
jmp ESC_5_XXX
|
||
ESC_5_010:
|
||
ESC_5_011:
|
||
xor edi,edi
|
||
ESC_5_XXX:
|
||
call FetchModRM
|
||
ESC_5_YYY:
|
||
|
||
mov [I.Arg1.Type2nd],InRM
|
||
|
||
cmp [I.Mod],3
|
||
setnz [I.Arg1.Mem]
|
||
mov [I.Arg1.Type],STXRG
|
||
jnz .Exit
|
||
|
||
or di,di
|
||
jz .Null
|
||
mov [I.Name],di
|
||
.Null:
|
||
|
||
mov [I.RandSize],0
|
||
.Exit: ret
|
||
|
||
|
||
ESC_5_100:
|
||
mov di,TFUCOM
|
||
call FetchModRM
|
||
cmp [I.Mod],3
|
||
jz ESC_5_YYY
|
||
|
||
mov [I.Name],TFRSTOR
|
||
|
||
mov al,[I.Arch]
|
||
cmp al,CPUX16
|
||
jz .16
|
||
.64:
|
||
.32:
|
||
BitTR I.Prefixes,P66
|
||
jnc @F
|
||
mov dword [I.Name],TFRSTORS shl 16+TFRSTORW
|
||
@@:
|
||
jmp .XX
|
||
.16:
|
||
BitTR I.Prefixes,P66
|
||
jnc @F
|
||
mov dword [I.Name],TFRSTORS shl 16+TFRSTORD
|
||
@@:
|
||
|
||
.XX:
|
||
mov [I.Arg1.Mem],True
|
||
mov [I.Arg1.Type],STXRG
|
||
ret
|
||
|
||
ESC_5_101:
|
||
call FetchModRM
|
||
cmp [I.Mod],3
|
||
jnz ErrorDec
|
||
|
||
mov [I.Name],TFUCOMP
|
||
|
||
mov [I.Arg1.Type2nd],InRM
|
||
mov [I.Arg1.Type],STXRG
|
||
ret
|
||
|
||
ESC_5_110:
|
||
call FetchModRM
|
||
cmp [I.Mod],3
|
||
jz ErrorDec
|
||
|
||
mov edi,TFSAVE shl 16+TFNSAVE
|
||
|
||
mov al,[I.Arch]
|
||
cmp al,CPUX16
|
||
jz .16
|
||
.64:
|
||
.32:
|
||
BitTR I.Prefixes,P66
|
||
jnc @F
|
||
mov edi,TFSAVEW shl 16+TFNSAVEW
|
||
@@:
|
||
jmp .XX
|
||
.16:
|
||
BitTR I.Prefixes,P66
|
||
jnc @F
|
||
mov edi,TFSAVED shl 16+TFNSAVED
|
||
@@:
|
||
.XX:
|
||
BitTR I.Prefixes,P9B
|
||
jnc .YY
|
||
rol edi,16
|
||
.YY:
|
||
mov [I.Name],di
|
||
mov [I.Arg1.Mem],True
|
||
mov [I.Arg1.Type],STXRG
|
||
ret
|
||
|
||
ESC_5_111:
|
||
call FetchModRM
|
||
|
||
test [I.Sensitive],NIA
|
||
jnz .XX
|
||
|
||
cmp [I.Mod],3
|
||
jz ErrorDec
|
||
|
||
mov edi,TFSTSW shl 16+TFNSTSW
|
||
BitTR I.Prefixes,P9B
|
||
jnc .YY
|
||
rol edi,16
|
||
.YY:
|
||
mov [I.Name],di
|
||
mov [I.Arg1.Mem],True
|
||
mov [I.Arg1.Type],STXRG
|
||
ret
|
||
.XX: cmp [I.Mod],3
|
||
jnz ErrorDec
|
||
cmp byte [rsi-1],0xFC
|
||
jnz ErrorDec
|
||
mov [I.Name],TFRICHOP
|
||
ret
|
||
|
||
ESC_6_111:
|
||
mov edi,TFDIVRP shl 16+TFDIVP
|
||
jmp ESC_6_XXX
|
||
ESC_6_110:
|
||
mov edi,TFDIVP shl 16+TFDIVRP
|
||
jmp ESC_6_XXX
|
||
ESC_6_101:
|
||
mov edi,TFSUBRP shl 16+TFSUBP
|
||
jmp ESC_6_XXX
|
||
ESC_6_100:
|
||
mov edi,TFSUBP shl 16+TFSUBRP
|
||
jmp ESC_6_XXX
|
||
ESC_6_010:
|
||
mov edi,TFCOMP5 shl 16+TFCOMP5
|
||
jmp ESC_7_XXX ;Yes = ESC_7_XXX
|
||
ESC_6_001:
|
||
mov edi,TFMULP shl 16+TFMULP
|
||
jmp ESC_6_XXX
|
||
ESC_6_000:
|
||
mov edi,TFADDP shl 16+TFADDP
|
||
jmp ESC_6_XXX
|
||
ESC_6_011:
|
||
xor edi,edi
|
||
ESC_6_XXX:
|
||
call FetchModRM
|
||
|
||
cmp [I.Mod],3
|
||
setnz [I.Arg1.Mem]
|
||
mov [I.Arg1.Type],STXRG
|
||
jnz .Exit
|
||
|
||
mov [I.Arg1.Type2nd],InRM
|
||
|
||
mov [I.RandSize],0
|
||
|
||
cmp byte [rsi-1],0xD9
|
||
jz .Quit
|
||
|
||
or edi,edi
|
||
jz .Null
|
||
mov dword [I.Name],edi
|
||
.Null:
|
||
mov [I.Arg2.Type],STXRG
|
||
.Exit:
|
||
ret
|
||
.Quit:
|
||
mov [I.Name],TFCOMPP
|
||
mov [I.Arg1.Type],0
|
||
ret
|
||
|
||
ESC_7_011:
|
||
mov di,TFSTP9
|
||
jmp ESC_7_XXX
|
||
ESC_7_010:
|
||
mov di,TFSTP8
|
||
jmp ESC_7_XXX
|
||
ESC_7_001:
|
||
mov di,TFXCH7
|
||
jmp ESC_7_XXX
|
||
ESC_7_000:
|
||
mov di,TFFREEP
|
||
ESC_7_XXX:
|
||
call FetchModRM
|
||
|
||
cmp [I.Mod],3
|
||
setnz [I.Arg1.Mem]
|
||
mov [I.Arg1.Type],STXRG
|
||
jnz .Exit
|
||
|
||
mov [I.Arg1.Type2nd],InRM
|
||
|
||
mov [I.RandSize],0
|
||
|
||
or di,di
|
||
jz .Null
|
||
mov [I.Name],di
|
||
.Null:
|
||
|
||
.Exit:
|
||
ret
|
||
|
||
ESC_7_100:
|
||
call FetchModRM
|
||
|
||
cmp [I.Syntax],0
|
||
jz .SkipATT
|
||
mov [I.RandSize],0
|
||
.SkipATT:
|
||
|
||
cmp [I.Mod],3
|
||
setnz [I.Arg1.Mem]
|
||
mov [I.Arg1.Type],STXRG
|
||
jnz .Exit
|
||
|
||
mov al,[I.Reg]
|
||
|
||
mov edx,TFSTSW shl 16 +TFNSTSW
|
||
or al,al
|
||
jz .L1
|
||
|
||
test [I.Sensitive],UND
|
||
jz .L1
|
||
|
||
mov edx,TFSTDW shl 16 +TFNSTDW
|
||
cmp al,1
|
||
jz .L1
|
||
|
||
mov edx,TFSTSG shl 16 +TFNSTSG
|
||
cmp al,2
|
||
.L1:
|
||
jnz ErrorDec
|
||
|
||
BitTR I.Prefixes,P9B
|
||
jnc .L2
|
||
rol edx,16
|
||
.L2: mov [I.Name],dx
|
||
|
||
mov [I.Arg1.Type],GPR16
|
||
mov [I.RandSize],0
|
||
.Exit:
|
||
ret
|
||
|
||
ESC_7_110:
|
||
cmp [I.Syntax],0
|
||
jz .SkipATT
|
||
mov [I.RandSize],0
|
||
.SkipATT:
|
||
|
||
mov di,TFCOMIP
|
||
jmp ESC_7_YYY
|
||
ESC_7_101:
|
||
mov [I.IsFloat],0
|
||
mov di,TFUCOMIP
|
||
ESC_7_YYY:
|
||
call FetchModRM
|
||
|
||
cmp [I.Mod],3
|
||
setnz [I.Arg1.Mem]
|
||
mov [I.Arg1.Type],STXRG
|
||
jnz .Exit
|
||
|
||
mov [I.Name],di
|
||
|
||
mov [I.Arg2.Type2nd],InRM
|
||
mov [I.Arg2.Type],STXRG
|
||
|
||
mov [I.RandSize],0
|
||
.Exit:
|
||
ret
|
||
|
||
ESC_7_111:
|
||
call FetchModRM
|
||
|
||
mov [I.IsFloat],0
|
||
|
||
cmp [I.Mod],3
|
||
setnz [I.Arg1.Mem]
|
||
mov [I.Arg1.Type],STXRG
|
||
jnz .Exit
|
||
|
||
test [I.Sensitive],NIA
|
||
jz ErrorDec
|
||
cmp byte [rsi-1],0xFC
|
||
jnz ErrorDec
|
||
|
||
mov [I.Name],TFRINEAR
|
||
mov [I.Arg1.Type],0
|
||
|
||
mov [I.RandSize],0
|
||
.Exit:
|
||
ret
|
||
|
||
DODISPBS:
|
||
mov [I.IsShort],True
|
||
DODISPB:
|
||
mov [I.IsAddress],True
|
||
if %B=64
|
||
FetchSB
|
||
add rax,[Origin]
|
||
add rax,rsi
|
||
sub rax,[I.Addr]
|
||
|
||
mov cl,[I.Arch]
|
||
or cl,cl
|
||
jnz @F
|
||
movzx eax,ax
|
||
@@:
|
||
cmp cl,CPUX32
|
||
jnz @F
|
||
mov eax,eax
|
||
@@:
|
||
|
||
mov [I.Arg1.Type],80h+8
|
||
mov [I.Arg1.Imm],rax
|
||
ret
|
||
else
|
||
FetchSB
|
||
cdq
|
||
add eax,[Origin]
|
||
adc edx,0
|
||
add eax,esi
|
||
adc edx,0
|
||
sub eax,[I.Addr]
|
||
sbb edx,0
|
||
|
||
mov cl,[I.Arch]
|
||
or cl,cl
|
||
jnz @F
|
||
xor edx,edx
|
||
movzx eax,ax
|
||
@@:
|
||
cmp cl,CPUX32
|
||
jnz @F
|
||
xor edx,edx
|
||
@@:
|
||
|
||
mov [I.Arg1.Type],80h+8
|
||
mov [I.Arg1.Imm],eax
|
||
mov [I.Arg1.Imm+4],edx
|
||
ret
|
||
end if
|
||
DODISPW:
|
||
mov [I.IsAddress],True
|
||
mov [I.RandSize],VWORD
|
||
if %B=64
|
||
FetchSW
|
||
add rax,[Origin]
|
||
add rax,rsi
|
||
sub rax,[I.Addr]
|
||
|
||
movzx eax,ax
|
||
|
||
mov [I.Arg1.Type],80h+8
|
||
mov [I.Arg1.Imm],rax
|
||
ret
|
||
else
|
||
FetchSW
|
||
cdq
|
||
add eax,[Origin]
|
||
adc edx,0
|
||
add eax,esi
|
||
adc edx,0
|
||
sub eax,[I.Addr]
|
||
sbb edx,0
|
||
|
||
xor edx,edx
|
||
movzx eax,ax
|
||
|
||
mov [I.Arg1.Type],80h+8
|
||
mov [I.Arg1.Imm],eax
|
||
mov [I.Arg1.Imm+4],edx
|
||
ret
|
||
end if
|
||
DODISPD:
|
||
mov [I.IsAddress],True
|
||
if %B=64
|
||
FetchSD
|
||
add rax,[Origin]
|
||
add rax,rsi
|
||
sub rax,[I.Addr]
|
||
|
||
cmp [I.Arch],CPUX64
|
||
jz @F
|
||
mov eax,eax
|
||
@@:
|
||
|
||
mov [I.Arg1.Type],80h+8
|
||
mov [I.Arg1.Imm],rax
|
||
ret
|
||
else
|
||
FetchSD
|
||
cdq
|
||
add eax,[Origin]
|
||
adc edx,0
|
||
add eax,esi
|
||
adc edx,0
|
||
sub eax,[I.Addr]
|
||
sbb edx,0
|
||
|
||
cmp [I.Arch],CPUX64
|
||
jz @F
|
||
xor edx,edx
|
||
@@:
|
||
|
||
mov [I.Arg1.Type],80h+8
|
||
mov [I.Arg1.Imm],eax
|
||
mov [I.Arg1.Imm+4],edx
|
||
ret
|
||
end if
|
||
RtnArgQ:
|
||
mov [I.Arg1.Type],GPR64
|
||
RtnArgX:
|
||
mov al,[I.B]
|
||
add [I.Arg1.Reg],al
|
||
call ClearB
|
||
ret
|
||
|
||
RtnArgD:
|
||
mov [I.Arg1.Type],GPR32
|
||
jmp RtnArgX
|
||
|
||
RtnArgW:
|
||
mov [I.Arg1.Type],GPR16
|
||
jmp RtnArgX
|
||
|
||
RndSizeD60:
|
||
mov [I.AltName],TPUSHA
|
||
ret
|
||
RndSizeD61:
|
||
mov [I.AltName],TPOPA
|
||
ret
|
||
|
||
AddPointD:
|
||
mov ax,TDWORD
|
||
jmp AddPointCommon
|
||
AddPointW:
|
||
mov ax,TWORD
|
||
AddPointCommon:
|
||
BitTR I.Prefixes,P66
|
||
jnc .Skip66
|
||
mov [I.Point],ax
|
||
.Skip66:
|
||
mov [I.Arg1.Type],SEGRG
|
||
ret
|
||
|
||
RtnMOVSXD:
|
||
mov dword [I.Name],TMOVSLQ shl 16+TMOVSXD
|
||
cmp [I.W],0
|
||
jnz RtnMOVZXD.Continue
|
||
RtnMOVZXD:
|
||
mov dword [I.Name],TMOVZLQ shl 16+TMOVZXD
|
||
BitTR I.Prefixes,P66
|
||
jnc .Continue
|
||
mov dword [I.Name],TMOVZWQ shl 16+TMOVZXDW
|
||
|
||
call FetchModRM
|
||
|
||
;cmp [I.Mod],3
|
||
;setnz [I.Arg2.Mem]
|
||
mov [I.Arg2.Type],GPR16
|
||
mov [I.Arg2.Type2nd],InRM
|
||
|
||
mov [I.Arg1.Type],GPR64
|
||
mov [I.Arg1.Type2nd],InReg
|
||
ret
|
||
|
||
.Continue:
|
||
call FetchModRM
|
||
|
||
cmp [I.Syntax],0
|
||
jnz @F
|
||
mov [I.RandSize],VDWORD
|
||
@@:
|
||
|
||
;cmp [I.Mod],3
|
||
;setnz [I.Arg2.Mem]
|
||
mov [I.Arg2.Type],GPR32
|
||
mov [I.Arg2.Type2nd],InRM
|
||
|
||
mov [I.Arg1.Type],GPR64
|
||
mov [I.Arg1.Type2nd],InReg
|
||
ret
|
||
|
||
PushI16:
|
||
FetchW
|
||
mov [I.Arg1.Type],80h+2
|
||
mov [I.Arg1.Imm],rax
|
||
|
||
mov [I.Point],TWORD
|
||
ret
|
||
|
||
PushI32:
|
||
FetchSD
|
||
mov [I.Arg1.Type],80h+4
|
||
mov [I.Arg1.Imm],rax
|
||
|
||
mov [I.Point],TDWORD
|
||
ret
|
||
|
||
PushI64:
|
||
FetchSD
|
||
mov [I.Arg1.Type],80h+40h+4
|
||
mov [I.Arg1.Imm],rax
|
||
|
||
mov [I.Point],TQWORD
|
||
ret
|
||
|
||
PushSI16:
|
||
FetchSB
|
||
mov [I.Arg1.Type],80h+40h+2
|
||
mov [I.Arg1.Imm],rax
|
||
|
||
mov [I.Point],TWORD
|
||
ret
|
||
|
||
PushSI32:
|
||
FetchSB
|
||
mov [I.Arg1.Type],80h+40h+4
|
||
mov [I.Arg1.Imm],rax
|
||
|
||
mov [I.Point],TDWORD
|
||
ret
|
||
|
||
PushSI64:
|
||
FetchSB
|
||
mov [I.Arg1.Type],80h+40h+4
|
||
mov [I.Arg1.Imm],rax
|
||
|
||
mov [I.Point],TQWORD
|
||
ret
|
||
|
||
include "rtn-c4c5.inc"
|
||
include "rtn-62xx.inc"
|
||
include "far-code.inc"
|
||
|
||
ClearSeg:
|
||
cmp [I.IsLEA],0
|
||
jnz .NoClear
|
||
mov ax,[I.SegmName]
|
||
cmp [I.Arch],CPUX64
|
||
jnz .Clear
|
||
cmp ax,TFS
|
||
jz .Clear
|
||
cmp ax,TGS
|
||
jz .Clear
|
||
.NoClear:
|
||
ret
|
||
.Clear: BitTR I.Prefixes,PSEG
|
||
|
||
ModRM2EA.Exit:
|
||
ret
|
||
|
||
ModRM2EA:
|
||
cmp [I.Mod],3
|
||
jz .Exit
|
||
|
||
mov [I.DefSeg],VDS
|
||
|
||
call ClearSeg
|
||
BitTR I.Prefixes,P67
|
||
|
||
mov [I.PossibleLOCK],True
|
||
|
||
cmp [I.Address],AD16
|
||
jz .Address16
|
||
.SkipJmp:
|
||
mov al,[I.RM]
|
||
add al,[I.B]
|
||
|
||
cmp al,04h
|
||
jz .J4
|
||
cmp al,0Ch
|
||
jz .JC
|
||
cmp al,05h
|
||
jz .J5
|
||
cmp al,0Dh
|
||
jz .JD
|
||
|
||
mov [I.Base],al
|
||
jmp .AddressSizeCont
|
||
|
||
.JC:
|
||
.J4: call SIBByte
|
||
jmp .AddressSizeCont
|
||
.JD:
|
||
.J5: cmp [I.Mod],0
|
||
jne .ModeX
|
||
mov [I.DispSize],4
|
||
FetchSD
|
||
mov [I.Disp],rax
|
||
cmp [I.Arch],CPUX64
|
||
jnz .No64X
|
||
mov [I.Relative],True
|
||
.No64X:
|
||
jmp .AddressSizeCont
|
||
.ModeX:
|
||
mov [I.Base],al
|
||
mov [I.DefSeg],VSS
|
||
.AddressSizeCont:
|
||
mov al,[I.Mod]
|
||
cmp al,1
|
||
jne .ModeNEQ1
|
||
mov [I.DispSize],1
|
||
FetchSB
|
||
mov [I.Disp],rax
|
||
jmp .ModeNEQ2
|
||
.ModeNEQ1:
|
||
cmp al,2
|
||
jne .ModeNEQ2
|
||
mov [I.DispSize],4
|
||
FetchSD
|
||
mov [I.Disp],rax
|
||
.ModeNEQ2:
|
||
|
||
cmp [I.Base],-1
|
||
jz .NoBase
|
||
mov al,[I.NotB]
|
||
and byte [I.Prefixes],al
|
||
.NoBase:
|
||
cmp [I.Indx],-1
|
||
jz .NoIndx
|
||
mov al,[I.NotX]
|
||
and byte [I.Prefixes],al
|
||
.NoIndx:
|
||
ret
|
||
|
||
.Jump16:dd .I0,.I1,.I2,.I3,.I4,.I5,.I6,.I7
|
||
|
||
.Address16:
|
||
movzx eax,[I.RM]
|
||
mov eax,[rax*4+.Jump16]
|
||
jmp rax
|
||
.I0:
|
||
mov [I.Base],RRBX
|
||
mov [I.Indx],RRSI
|
||
jmp .AddressSizeCont0
|
||
.I1:
|
||
mov [I.Base],RRBX
|
||
mov [I.Indx],RRDI
|
||
jmp .AddressSizeCont0
|
||
.I2:
|
||
mov [I.Base],RRBP
|
||
mov [I.Indx],RRSI
|
||
mov [I.DefSeg],VSS
|
||
jmp .AddressSizeCont0
|
||
.I3:
|
||
mov [I.Base],RRBP
|
||
mov [I.Indx],RRDI
|
||
mov [I.DefSeg],VSS
|
||
jmp .AddressSizeCont0
|
||
.I4:
|
||
mov [I.Base],RRSI
|
||
jmp .AddressSizeCont0
|
||
.I5:
|
||
mov [I.Base],RRDI
|
||
jmp .AddressSizeCont0
|
||
.I6:
|
||
cmp [I.Mod],0
|
||
jne .ModeY
|
||
mov [I.DispSize],2
|
||
FetchSW
|
||
mov [I.Disp],rax
|
||
jmp .AddressSizeCont0
|
||
.ModeY:
|
||
mov [I.Base],RRBP
|
||
mov [I.DefSeg],VSS
|
||
jmp .AddressSizeCont0
|
||
.I7:
|
||
mov [I.Base],RRBX
|
||
.AddressSizeCont0:
|
||
mov al,[I.Mod]
|
||
cmp al,1
|
||
jne .NotModeEQ1
|
||
mov [I.DispSize],1
|
||
FetchSB
|
||
mov [I.Disp],rax
|
||
ret
|
||
.NotModeEQ1:
|
||
cmp al,2
|
||
jne .NotModeEQ2
|
||
mov [I.DispSize],2
|
||
FetchSW
|
||
mov [I.Disp],rax
|
||
.NotModeEQ2:
|
||
ret
|
||
|
||
SIBByte:
|
||
FetchB
|
||
|
||
mov [I.SIB],al
|
||
shr al,6
|
||
mov [I.Scale],al
|
||
|
||
mov al,[I.SIB]
|
||
shr al,3
|
||
and al,7 ;Index
|
||
add al,[I.X]
|
||
cmp al,4
|
||
jz .NoIndx
|
||
mov [I.Indx],al
|
||
.NoIndx:
|
||
mov al,[I.SIB]
|
||
and al,7 ;Base
|
||
add al,[I.B]
|
||
|
||
cmp al,05h
|
||
jz .X5
|
||
cmp al,0Dh
|
||
jz .XD
|
||
|
||
mov [I.Base],al
|
||
|
||
cmp al,04h
|
||
jz .X4
|
||
|
||
ret
|
||
.XD:
|
||
cmp [I.Mod],0
|
||
jne .ModeNX
|
||
.LD: mov [I.DispSize],4
|
||
FetchSD
|
||
mov [I.Disp],rax
|
||
ret
|
||
.ModeNX:
|
||
mov [I.Base],al
|
||
ret
|
||
.X5:
|
||
cmp [I.Mod],0
|
||
jz .LD
|
||
mov [I.Base],RRBP
|
||
.X4: mov [I.DefSeg],VSS
|
||
ret
|
||
|
||
Hex16: mov cl,16
|
||
jmp Hex
|
||
Hex8: mov cl,8
|
||
Hex: movzx ecx,cl
|
||
jrcxz .L2
|
||
if ~OS
|
||
push rdi
|
||
call FindEAX
|
||
pop rdi
|
||
jc .No
|
||
add rdi,rcx
|
||
ret
|
||
.No:
|
||
end if
|
||
push rcx
|
||
push rdx
|
||
xchg rdx,rax
|
||
.L1: movzx eax,dl
|
||
shr rdx,8
|
||
mov ax,[rax*2+HexString]
|
||
sub cl,2
|
||
mov [rdi+rcx],ax
|
||
ja .L1
|
||
pop rdx
|
||
pop rcx
|
||
add rdi,rcx
|
||
.L2: ret
|
||
|
||
if %B=32
|
||
Bin2Hex32:
|
||
or eax,eax
|
||
jnz Bin2Hex
|
||
mov cl,0
|
||
jmp Bin2Hex
|
||
end if
|
||
|
||
Bin2Hex16:
|
||
mov cl,16
|
||
jmp Bin2Hex
|
||
Bin2Hex8:
|
||
mov cl,8
|
||
jmp Bin2Hex
|
||
;
|
||
Bin2Hex4:
|
||
mov cl,4
|
||
jmp Bin2Hex
|
||
;
|
||
Bin2Hex2:
|
||
mov cl,2
|
||
;
|
||
Bin2Hex:
|
||
if ~OS
|
||
call FindEAX
|
||
jc .No
|
||
ret
|
||
.No:
|
||
end if
|
||
push rcx
|
||
cmp cl,16
|
||
ja .L0
|
||
push rdx
|
||
cmp [I.FullHex],True
|
||
je .L3
|
||
cmp rax,$FF
|
||
ja .SB
|
||
cmp cl,2
|
||
jb .L3
|
||
mov cl,2
|
||
jmp .L3
|
||
.SB:
|
||
cmp rax,$FFFF
|
||
ja .SW
|
||
cmp cl,4
|
||
jb .L3
|
||
mov cl,4
|
||
jmp .L3
|
||
.SW:
|
||
cmp rax,$FFFFFF
|
||
ja .SF
|
||
cmp cl,6
|
||
jb .L3
|
||
mov cl,6
|
||
jmp .L3
|
||
.SF:
|
||
or edx,$FFFFFFFF
|
||
cmp rax,rdx
|
||
ja .SD
|
||
cmp cl,8
|
||
jb .L3
|
||
mov cl,8
|
||
jmp .L3
|
||
.SD:
|
||
|
||
.L3:
|
||
if 1
|
||
cmp cl,16
|
||
jnz .L4
|
||
or edx,$FFFFFFFF
|
||
cmp rax,rdx
|
||
ja .L4
|
||
mov cl,8
|
||
.L4:
|
||
end if
|
||
movzx ecx,cl
|
||
push rdi rcx
|
||
|
||
cmp [I.HexPrefix],0
|
||
je @F
|
||
if 1
|
||
cmp byte [rdi-1],'L'
|
||
jz .L2
|
||
end if
|
||
mov word [rdi],'0x'
|
||
scasw
|
||
jmp .L2
|
||
@@:
|
||
cmp [I.Dollar],0
|
||
jne .L2
|
||
if 1
|
||
cmp byte [rdi-1],'L'
|
||
jz .L2
|
||
end if
|
||
mov byte [rdi],'$'
|
||
scasb
|
||
.L2: xchg rdx,rax
|
||
.L1: movzx eax,dl
|
||
shr rdx,8
|
||
mov ax,[rax*2+HexString]
|
||
sub cl,2
|
||
mov [rdi+rcx],ax
|
||
ja .L1
|
||
pop rcx rdi rdx
|
||
add rdi,rcx
|
||
|
||
cmp [I.HexPrefix],0
|
||
je @F
|
||
if 1
|
||
neg rcx
|
||
cmp byte [rdi+rcx-1],'L'
|
||
jz .L0
|
||
end if
|
||
scasw
|
||
jmp .L0
|
||
@@:
|
||
cmp [I.Dollar],0
|
||
jne .L0
|
||
if 1
|
||
neg rcx
|
||
cmp byte [rdi+rcx-1],'L'
|
||
jz .L0
|
||
end if
|
||
scasb
|
||
.L0: pop rcx
|
||
ret
|
||
|
||
Start66F2F3:
|
||
FetchB
|
||
dec rsi
|
||
|
||
xor ebx,ebx
|
||
test [I.Flags],_3
|
||
jz @F
|
||
mov bl,2*4
|
||
@@:
|
||
mov ecx,[rdx+rbx+4*2]
|
||
|
||
cmp al,0xC0
|
||
jb @F
|
||
test [I.Flags],_3
|
||
jz @F
|
||
add edx,ebx
|
||
xor ebx,ebx
|
||
@@:
|
||
mov al,[I.PrefixByte]
|
||
or al,al
|
||
jz .L1
|
||
shr ecx,8
|
||
add edx,2
|
||
cmp al,bit P66
|
||
setz [I.Mandatory66]
|
||
jz .L1
|
||
shr ecx,8
|
||
add edx,2
|
||
cmp al,bit PF2
|
||
jz .L1
|
||
shr ecx,8
|
||
add edx,2
|
||
cmp al,bit PF3
|
||
jz .L1
|
||
jmp ErrorDec
|
||
.L1: mov [I.RandSize],cl
|
||
ret
|
||
|
||
include "selbat.inc"
|
||
include "tables.inc"
|
||
|
||
CpyElements NextTab
|
||
|
||
vglobal
|
||
Params rd ParamSize/4 ;Parameters buffer
|
||
BufferI rb BufferSizeI
|
||
Buffer rb BufferSizeO
|
||
endg
|
||
|
||
if %B=32
|
||
r9v dd ?
|
||
r5v dd ?
|
||
r1v dd ?
|
||
end if
|
||
LastHex db ?
|
||
|
||
rept 16
|
||
{
|
||
restore r8b,r8w,r8d,r8
|
||
restore r9b,r9w,r9d,r9
|
||
restore r10b,r10w,r10d,r10
|
||
restore r11b,r11w,r11d,r11
|
||
restore r12b,r12w,r12d,r12
|
||
restore r13b,r13w,r13d,r13
|
||
restore r14b,r14w,r14d,r14
|
||
restore r15b,r15w,r15d,r15
|
||
} |