kolibrios-fun/programs/develop/koldbg/disasm/disasm.asm
Kirill Lipatov (Leency) b34f9856cb upload koldbg by CandyMan
git-svn-id: svn://kolibrios.org@9353 a494cfbc-eb01-0410-851d-a64ba20cac60
2021-12-02 17:13:25 +00:00

8191 lines
197 KiB
NASM
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

;-----------------------------------------------------------------------------
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
}