Subversion Repositories Kolibri OS

Compare Revisions

No changes between revisions

Regard whitespace Rev 9352 → Rev 9353

/programs/develop/koldbg/Tupfile.lua
0,0 → 1,2
if tup.getconfig("NO_FASM") ~= "" then return end
tup.rule({"koldbg.asm"}, "fasm %f %o " .. tup.getconfig("KPACK_CMD"), "koldbg")
/programs/develop/koldbg/assemble.inc
0,0 → 1,50
;-----------------------------------------------------------------------------
; Assemble instruction event
OnAsm: mov esi,[CurArg]
mov edi,esi
mov ecx,255
xor eax,eax
repnz scasb
stc
sbb edi,esi
jz .Exit
;
mov eax,[CPUYPos]
mov rax,[AddrBuffer+(rax-1)*sizeof.dq]
mov [OriginPtr],rax
mov al,[CodeType]
mov [code_type],al
;
call Assemble
or esi,esi
jz .Move
;
if 1
mov ecx,MSG_WIDTH-1
mov edi,ErrorLine
push rdi
.Loop: lodsb
stosb
or al,al
loopnz .Loop
mov [rdi-1],word 10
pop rsi
and byte [rsi],0xDF
end if
;
call PutMessageNoDraw
jmp .Exit
.Move: mov eax,[CPUYPos]
mov rsi,[AddrBuffer+(rax-1)*sizeof.dq]
lea edi,[output_data]
mcall 69,7,[DebuggeePID],[output_size]
.Exit: call PrintCmdLine
mov [AfterKey],1
call ShowImage
ret
;-----------------------------------------------------------------------------
uglobal
if used ErrorLine
ErrorLine rb MSG_WIDTH
end if
endg
/programs/develop/koldbg/cmdhist.inc
0,0 → 1,564
InitCmdHistBuffer:
;-------------------------------------------------------------------------------
push eax ebx ecx
 
mcall 68,12,4096 ;allocate 4KB block
mov [CmdHistBuffer.Ptr],eax
mov [CmdHistBuffer.Size],ecx
 
mov edi,eax
xor eax,eax
stosd
stosd
mov [CmdHistBuffer.NewNodeOffset],eax
mov [CmdHistBuffer.LastNodeOffset],eax
mov [CmdHistBuffer.CurNodeOffset],eax
mov [CmdHistBuffer.TmpLineFlag],al
mov [CmdHistBuffer.NFlag],al
 
pop ecx ebx eax
ret
;-------------------------------------------------------------------------------
 
EnlargeCmdHistBuffer:
;-------------------------------------------------------------------------------
pusha
 
mov ecx,[CmdHistBuffer.Size]
add ecx,4096
mov edx,[CmdHistBuffer.Ptr]
mcall 68,20 ;reallocate the buffer (prev. size + 4KB)
test eax,eax
jz .Err
mov [CmdHistBuffer.Ptr],eax
mov [CmdHistBuffer.Size],ecx
.OK:
clc
popa
ret
.Err:
stc
popa
ret
;-------------------------------------------------------------------------------
 
AddCmdHistLine:
;-------------------------------------------------------------------------------
;in:
;eax = ptr to ASCIIZ string of line
;-------------------------------------------------------------------------------
pusha
 
mov esi,eax
mov edx,eax
xor ecx,ecx
@@:
inc ecx
lodsb
test al,al
jz @F
jmp @B
@@:
dec ecx
jz .OK
 
inc ecx
 
mov eax,[CmdHistBuffer.NewNodeOffset]
lea eax,[eax+ecx+2*4]
cmp [CmdHistBuffer.Size],eax
jae @F
call EnlargeCmdHistBuffer
jc .Err
@@:
mov edi,[CmdHistBuffer.NewNodeOffset]
mov eax,[CmdHistBuffer.Ptr]
add edi,eax
cmp eax,edi ;if eax = edi, then it's the first node
jne @F
xor eax,eax
dec eax
stosd ;save previous node link = -1 for the first node
stosd ;save next node link = -1 for the first node
jmp .CPStr
@@:
mov ebx,[CmdHistBuffer.LastNodeOffset]
mov [edi],ebx ;save previous node link for a new node
add ebx,eax
mov eax,[CmdHistBuffer.NewNodeOffset]
mov [ebx+4],eax ;update next node link for a last node
mov [CmdHistBuffer.LastNodeOffset],eax
mov [CmdHistBuffer.CurNodeOffset],eax
add edi,4
xor eax,eax
dec eax
stosd
.CPStr:
mov esi,edx
 
push ecx
rep movsb
pop ecx
 
add ecx,2*4
add [CmdHistBuffer.NewNodeOffset],ecx
.OK:
clc
.Err:
mov [CmdHistBuffer.TmpLineFlag],0
popa
ret
;-------------------------------------------------------------------------------
 
AddCmdHistTmpLine:
;-------------------------------------------------------------------------------
;in:
;eax = ptr to ASCIIZ string of line
;-------------------------------------------------------------------------------
pusha
 
mov esi,eax
mov edx,eax
xor ecx,ecx
@@:
inc ecx
lodsb
test al,al
jz @F
jmp @b
@@:
mov eax,[CmdHistBuffer.NewNodeOffset]
lea eax,[eax+ecx+2*4]
cmp [CmdHistBuffer.Size],eax
jae @F
call EnlargeCmdHistBuffer
jc .Err
@@:
mov edi,[CmdHistBuffer.NewNodeOffset]
mov [CmdHistBuffer.TmpLineFlag],1
mov eax,[CmdHistBuffer.Ptr]
add edi,eax
xor eax,eax
stosd
stosd ;two zeroes - marker (prefix) of tmp line
.CPStr:
mov esi,edx
rep movsb
.OK:
clc
.Err:
popa
ret
;-------------------------------------------------------------------------------
 
GetCmdHistLine:
;-------------------------------------------------------------------------------
;out:
;eax = ptr to ASCIIZ string of current line
;-------------------------------------------------------------------------------
push ebx
 
mov eax,[CmdHistBuffer.Ptr]
mov ebx,[CmdHistBuffer.CurNodeOffset]
 
lea eax,[eax+ebx+2*4]
 
pop ebx
ret
;-------------------------------------------------------------------------------
 
GetCmdHistTmpLine:
;-------------------------------------------------------------------------------
;out:
;eax = ptr to ASCIIZ string of current line or 0 (no tmp line)
;-------------------------------------------------------------------------------
cmp [CmdHistBuffer.TmpLineFlag],0
je @F
 
mov eax,[CmdHistBuffer.NewNodeOffset]
add eax,[CmdHistBuffer.Ptr]
add eax,2*4
@@:
ret
;-------------------------------------------------------------------------------
 
PrevCmdHistLine:
;-------------------------------------------------------------------------------
;out:
;CF = 0 - OK, CF = 1 (no previous lines)
;-------------------------------------------------------------------------------
push eax ebx
 
mov eax,[CmdHistBuffer.Ptr]
mov ebx,[CmdHistBuffer.CurNodeOffset]
 
lea eax,[eax+ebx]
mov eax,[eax]
inc eax
jz .RetCF
dec eax
mov [CmdHistBuffer.CurNodeOffset],eax
 
clc
pop ebx eax
ret
.RetCF:
stc
pop ebx eax
ret
;-------------------------------------------------------------------------------
 
NextCmdHistLine:
;-------------------------------------------------------------------------------
;out:
;CF = 0 - OK, CF = 1 (no next lines)
;-------------------------------------------------------------------------------
push eax ebx
 
mov eax,[CmdHistBuffer.Ptr]
mov ebx,[CmdHistBuffer.CurNodeOffset]
 
lea eax,[eax+ebx]
mov eax,[eax+4]
inc eax
jz .RetCF
dec eax
mov [CmdHistBuffer.CurNodeOffset],eax
 
clc
pop ebx eax
ret
.RetCF:
stc
pop ebx eax
ClearCmdLineEnd:
ret
;-------------------------------------------------------------------------------
 
DrawCmdLine:
pushad
xor ebx,ebx
jmp @F
 
DrawCmdLineEnd:
pushad
mov ebx,[CmdLinePos]
@@:
call ClearCmdLine
 
mov [XPos],1
mov [YPos],MinHeight-1
mov [Color],15
mov al,'>'
call PrintC
mov ecx,[CmdLineLen]
sub ecx,ebx
jbe .Skip
lea esi,[CmdLine+ebx]
.Loop:
lodsb
call PrintC
loop .Loop
.Skip:
popad
ret
 
DrawCursor:
pushad
mov eax,[CmdLinePos]
times 2 inc eax
mov [CursorX],eax
mov [CursorY],MinHeight-1
mov [AfterKey],1
call ShowImage
popad
ret
 
HideCursor:
pushad
or [CursorX],-1
or [CursorY],-1
mov [AfterKey],1
call ShowImage
popad
ret
 
;-----------------------------------------------------------------------------
; Find command in list
FindCmd:
; all commands are case-insensitive
push edi
.X4:
mov al,[edi]
cmp al,0
jz .X5
cmp al,'A'
jb @F
cmp al,'Z'
ja @F
or al,20h
@@:
stosb
jmp .X4
 
; find command
.X5:
pop edi
.X6:
cmp dword [esi],0
jz .X7
push esi
mov esi,[esi]
lodsb
movzx ecx,al
push edi
repz cmpsb
pop edi
pop esi
jz .X8
add esi,17
jmp .X6
.X7:
stc
.X8:
ret
 
HelpGroups:
dd aControl,0,0,HelpControlMsg
db 0
dd aData,0,0,HelpDataMsg
db 0
dd aBreakpoints,0,0,HelpBreaksMsg
db 0
; flags field:
; &1: command may be called without parameters
; &2: command may be called with parameters
; &4: command may be called without loaded program
; &8: command may be called with loaded program
Commands:
dd aHlp,OnHelp,HelpSyntax,HelpHelp
db 0Fh
dd aHelp,OnHelp,HelpSyntax,HelpHelp
db 0Fh
dd aQuit,OnQuit,QuitSyntax,QuitHelp
db 0Dh
dd aExit,OnQuit,ExitSyntax,ExitHelp
db 0Dh
dd aLoad,OnLoad,LoadSyntax,LoadHelp
db 6
dd aReload,OnReLoad,ReloadSyntax,ReloadHelp
db 0Dh
dd aTerminate,OnTerminate,TerminateSyntax,TerminateHelp
db 9
dd aDetach,OnDetach,DetachSyntax,DetachHelp
db 9
dd aSuspend,OnSuspend,SuspendSyntax,SuspendHelp
db 9
dd aResume,OnResume,ResumeSyntax,ResumeHelp
db 0Bh
dd aStep,OnStepMultiple,StepSyntax,StepHelp
db 0Bh
dd aProceed,OnProceedMultiple,ProceedSyntax,ProceedHelp
db 0Bh
dd aCalc,OnCalc,CalcSyntax,CalcHelp
db 0Eh
dd aDump,OnDump,DumpSyntax,DumpHelp
db 0Bh
;dd aUnassemble,OnUnassemble,UnassembleSyntax,UnassembleHelp
;db 0Bh
dd aBp,OnBp,BpSyntax,BpHelp
db 0Ah
dd aBpm,OnBpmb,BpmSyntax,BpmHelp
db 0Ah
dd aBpmb,OnBpmb,BpmSyntax,BpmHelp
db 0Ah
dd aBpmw,OnBpmw,BpmSyntax,BpmHelp
db 0Ah
dd aBpmd,OnBpmd,BpmSyntax,BpmHelp
db 0Ah
dd aBl,OnBl,BlSyntax,BlHelp
db 0Bh
dd aBc,OnBc,BcSyntax,BcHelp
db 0Ah
dd aBd,OnBd,BdSyntax,BdHelp
db 0Ah
dd aBe,OnBe,BeSyntax,BeHelp
db 0Ah
dd aReg,OnReg,RSyntax,RHelp
db 0Ah
dd aUnpack,OnUnpack,UnpackSyntax,UnpackHelp
db 9
dd aLoadSymbols,OnLoadSymbols,LoadSymbolsSyntax,LoadSymbolsHelp
db 0Ah
;
dd aAsm,OnAsm,AsmSyntax,AsmHelp
db 2+8
dd aJump,OnJump,JumpSyntax,JumpHelp
db 2+8
dd aDoLoad,DoLoad,DoLoadSyntax,DoLoadHelp
db 1+4
;
dd 0
 
aHelp db 5,'help',0
aHlp db 2,'h',0
HelpHelp db 'Help on specified function',10
HelpSyntax db 'Usage: h or help [group | command]',10,0
 
HelpMsg db 'List of known command groups:',10
db '"help control" - display list of control commands',10
db '"help data" - display list of commands concerning data',10
db '"help breakpoints" - display list of commands concerning breakpoints',10,0
 
aAsm db 2,'a',0
AsmHelp db 'Assemble instruction at current position',10
AsmSyntax db 'Usage: a instruction (',8,8Ah,'mov al,[ebx+12h]',8,8Fh,')',10,0
 
aJump db 2,'j',0
JumpHelp db 'Sets current window or current register new address',10
JumpSyntax db 'Usage: Jump <expression>',10,0
 
aDetach db 7,'detach',0
DetachHelp db 'Detach from debugged program',10
DetachSyntax db 'Usage: detach',10,0
 
aSuspend db 5,'stop',0
SuspendHelp db 'Suspend execution of debugged program',10
SuspendSyntax db 'Usage: stop',10,0
 
aQuit db 5,'quit',0
QuitHelp db 'Quit from debugger',10
QuitSyntax db 'Usage: quit',10,0
 
aExit db 5,'exit',0
ExitHelp db 'Exit from debugger',10
ExitSyntax db 'Usage: exit',10,0
 
aLoad db 5,'load',0
LoadHelp db 'Load program for debugging',10
LoadSyntax db 'Usage: load <program-name> [parameters]',10,0
 
aDoLoad db 7,'doload',0
DoLoadHelp db 'Load test program for debugging',10
DoLoadSyntax db 'Usage: doload',10,0
 
aReload db 7,'reload',0
ReloadHelp db 'Reload debugging program (restart debug session)',10
ReloadSyntax db 'Usage: reload',10,0
 
aTerminate db 10,'terminate',0
TerminateHelp db 'Terminate debugged program',10
TerminateSyntax db 'Usage: terminate',10,0
 
aResume db 2,'g',0
ResumeHelp db 'Go (resume execution of debugged program)',10
ResumeSyntax db 'Usage: g',10
db ' or: g <expression> - wait until specified address is reached',10,0
 
aStep db 2,'s',0
StepHelp db 'Make step in debugged program',10
StepSyntax db 'Usage: s [<number>]',10,0
 
aProceed db 2,'p',0
ProceedHelp db 'Make wide step in debugged program (step over CALL, REPxx, LOOP)',10
ProceedSyntax db 'Usage: p [<number>]',10,0
 
aDump db 2,'d',0
DumpHelp db 'Dump data of debugged program',10
DumpSyntax db 'Usage: d <expression> - dump data at specified address',10
db ' or: d - continue current dump',10,0
 
aCalc db 2,'?',0
CalcHelp db 'Calculate value of expression',10
CalcSyntax db 'Usage: ? <expression>',10,0
 
aReg db 2,'r',0
RHelp db 'Set register value',10
RSyntax db 'Usage: r <register> <expression>',10
db ' or: r <register>=<expression> - set value of <register> to <expression>',10,0
 
aBp db 3,'bp',0
BpHelp db 'set BreakPoint on execution',10
BpSyntax db 'Usage: bp <expression>',10,0
 
aBpm db 4,'bpm',0
aBpmb db 5,'bpmb',0
aBpmw db 5,'bpmw',0
aBpmd db 5,'bpmd',0
BpmHelp db 'set BreakPoint on Memory access',10
db 'Maximum 4 breakpoints of this type are allowed',10
db 'Note that for this breaks debugger is activated after access',10
BpmSyntax db 'Usage: bpmb [w] <expression>',10
db ' bpmw [w] <expression>',10
db ' bpmd [w] <expression>',10
db ' bpm is synonym for bpmd',10
db '"w" means break only on writes (default is on read/write)',10,0
 
aBl db 3,'bl',0
BlHelp db 'Breakpoint List',10
BlSyntax db 'Usage: bl - list all breakpoints',10
db ' bl <number> - display info on particular breakpoint',10,0
 
aBc db 3,'bc',0
BcHelp db 'Breakpoint Clear',10
BcSyntax db 'Usage: bc <number-list>',10
db 'Examples: bc 2',10
db ' bc 1 3 4 A',10,0
 
aBd db 3,'bd',0
BdHelp db 'Breakpoint Disable',10
BdSyntax db 'Usage: bd <number-list>',10
db 'Examples: bd 2',10
db ' bd 1 3 4 A',10,0
 
aBe db 3,'be',0
BeHelp db 'Breakpoint Enable',10
BeSyntax db 'Usage: be <number-list>',10
db 'Examples: be 2',10
db ' be 1 3 4 A',10,0
 
aUnpack db 7,'unpack',0
UnpackHelp db 'Try to bypass unpacker code',10
UnpackSyntax db 'Usage: unpack',10,0
 
aLoadSymbols db 13,'load-symbols',0
LoadSymbolsHelp db 'Load symbolic information for executable',10
LoadSymbolsSyntax db 'Usage: load-symbols <symbols-file-name>',10,0
 
; Control commands group
aControl db 8,'control',0
HelpControlMsg db 'List of control commands:',10
db 'h = help - help',10
db 'exit/quit - exit from debugger',10
db 'load <name> [params] - load program for debugging',10
db 'reload - reload debugging program',10
db 'load-symbols <name> - load information on symbols for program',10
db 'terminate - terminate loaded program',10
db 'detach - detach from debugging program',10
db 'stop - suspend execution of debugging program',10
db 'a <instruction> - assemble instruction at current position',10
db 'g [<expression>] - go on (resume execution of debugging program)',10
db 's [<num>] - program step, also <F7>',10
db 'p [<num>] - program wide step, also <F8>',10
db 'unpack - try to bypass unpacker code (heuristic)',10,0
 
; Data commands group
aData db 5,'data',0
HelpDataMsg db 'List of data commands:',10
db '? <expression> - calculate value of expression',10
db 'd [<expression>] - dump data at given address',10
db 'j <expression> - jump, current window or current register new address',10
;db 'u [<expression>] - unassemble instructions at given address',10
db 'r <register> <expression> or',10
db 'r <register>=<expression> - set register value',10,0
 
; Breakpoints commands group
aBreakpoints db 12,'breakpoints',0
HelpBreaksMsg db 'List of breakpoints commands:',10
db 'bp <expression> - set breakpoint on execution',10
db 'bpm[b|w|d] <type> <expression> - set breakpoint on memory access',10
db 'bl [<number>] - breakpoint(s) info',10
db 'bc <number>... - clear breakpoint',10
db 'bd <number>... - disable breakpoint',10
db 'be <number>... - enable breakpoint',10,0
;
/programs/develop/koldbg/compress.bat
0,0 → 1,0
uharc a -m3 -mx -md32768 -r koldbg !old\*.* !*.dbg
/programs/develop/koldbg/disasm/disasm.asm
0,0 → 1,8191
 
;-----------------------------------------------------------------------------
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˜† 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
}
/programs/develop/koldbg/disasm/disasm32.asm
0,0 → 1,187
 
BufferSizeI = 1*1024
BufferSizeO = 1*1024
 
use32
 
rax equ eax
rbx equ ebx
rcx equ ecx
rdx equ edx
rsi equ esi
rdi equ edi
rbp equ ebp
rsp equ esp
 
dq equ dd
 
macro dv A,B
{
db A
dw B
}
 
macro dy A,B,C
{
db A,B
dw C
}
 
macro cmova Dst,Src
{
local ..L
jna ..L
mov Dst,Src
..L:
}
 
macro cmovae Dst,Src
{
local ..L
jnae ..L
mov Dst,Src
..L:
}
 
macro cmovb Dst,Src
{
local ..L
jnb ..L
mov Dst,Src
..L:
}
 
macro cmovbe Dst,Src
{
local ..L
jnbe ..L
mov Dst,Src
..L:
}
 
macro cmovg Dst,Src
{
local ..L
jng ..L
mov Dst,Src
..L:
}
 
macro cmovge Dst,Src
{
local ..L
jnge ..L
mov Dst,Src
..L:
}
 
macro cmovl Dst,Src
{
local ..L
jnl ..L
mov Dst,Src
..L:
}
 
macro cmovle Dst,Src
{
local ..L
jnle ..L
mov Dst,Src
..L:
}
 
macro cmovno Dst,Src
{
local ..L
jo ..L
mov Dst,Src
..L:
}
 
macro cmovnp Dst,Src
{
local ..L
jp ..L
mov Dst,Src
..L:
}
 
macro cmovns Dst,Src
{
local ..L
js ..L
mov Dst,Src
..L:
}
 
macro cmovnz Dst,Src
{
local ..L
jz ..L
mov Dst,Src
..L:
}
 
macro cmovo Dst,Src
{
local ..L
jno ..L
mov Dst,Src
..L:
}
 
macro cmovp Dst,Src
{
local ..L
jnp ..L
mov Dst,Src
..L:
}
 
macro cmovs Dst,Src
{
local ..L
jns ..L
mov Dst,Src
..L:
}
 
macro cmovz Dst,Src
{
local ..L
jnz ..L
mov Dst,Src
..L:
}
 
macro jrcxz Dst
{
jecxz Dst
}
 
use32
InitDefault:
mov [DefInst.Arch],CPUX32
mov [DefInst.Size],15
mov [DefInst.Negate],True
 
mov [DefInst.Base],-1
mov [DefInst.Indx],-1
mov [DefInst.Scale],-1
ret
 
include "disasm.asm"
 
CrLf db 0
TheL db 0
LastByte db 0
IgnoreInvalid db 0 ;Ignore invalid VEX/XOP
SpaceSize dd 8
Origin dd 0
TheBufferO dd 0
 
_r8_ dd ?
_r9_ dd ?
_r10_ dq ?
_r15_ dq ?
/programs/develop/koldbg/disasm/disasm64.asm
0,0 → 1,26
 
BufferSizeI = 1k
BufferSizeO = 1k
 
use64
InitDefault:
mov [DefInst.Arch],CPUX64
mov [DefInst.Size],15
mov [DefInst.Negate],True
 
mov [DefInst.HideRIP],True
 
mov [DefInst.Base],-1
mov [DefInst.Indx],-1
mov [DefInst.Scale],-1
ret
 
include "disasm.asm"
 
CrLf db 0
TheL db 0
LastByte db 0
IgnoreInvalid db 0 ;Ignore invalid VEX/XOP
SpaceSize dd 8
Origin dq 0
TheBufferO dq 0
/programs/develop/koldbg/disasm/far-code.inc
0,0 → 1,693
ClrMagicBytes:
xor al,al
 
SetMagicBytes:
 
test al,4
setnz dl
shl dl,3
mov [I.R],dl
 
mov bl,-1
cmovnz ebx,[NotP4X]
mov [I.NotR],bl
 
test al,2
setnz dl
shl dl,3
mov [I.X],dl
 
mov bl,-1
cmovnz ebx,[NotP4X]
mov [I.NotX],bl
 
test al,1
setnz dl
shl dl,3
mov [I.B],dl
 
mov bl,-1
cmovnz ebx,[NotP4X]
mov [I.NotB],bl
 
test al,8
setnz [I.W]
 
mov bl,-1
cmovnz ebx,[NotP4X]
mov [I.NotW],bl
 
test al,40h
setnz [I.P]
 
mov bl,-1
cmovnz ebx,[NotP4X]
mov [I.NotP],bl
 
ret
 
FetchModRM:
FetchB
mov [I.ModRM],al
 
mov cl,al
mov bl,al
mov dl,al
shr cl,6 ;cl = mod
and bl,7 ;bl = r/m
shr dl,3
and dl,7 ;dl = reg
 
mov [I.Mod],cl
mov [I.Reg],dl
mov [I.RM],bl
 
call ModRM2EA
 
mov al,[I.ModRM]
ret
 
TWorFW: cmp [I.Syntax],0
jnz .Exit
mov [I.RandSize],VTWORD
cmp [I.Arch],CPUX64
jz .Exit
mov [I.RandSize],VFWORD
.Exit:
ret
 
SetArg2W:
cmp [I.Fasm],0
jz .Exit
mov [I.Arg2.Type],GPR16
.Exit: ret
 
SetArg12X:
mov [I.Arg1.Type],XMMRG
mov [I.Arg2.Type],XMMRG
ret
 
RM32R32C:
call RM32R32M
 
mov [I.Arg1.Type],GPR64
mov [I.Arg2.Type],CTRRG
 
cmp [I.Arch],CPUX64
je .L1
mov [I.Arg1.Type],GPR32
;lock mov reg,cr0 = mov reg,cr8
;lock mov cr0,reg = mov cr8,reg
cmp [I.Reg],0
jne .L1
BitTR I.Prefixes,PF0
jnc .L1
mov [I.Reg],8
.L1: ret
;-----------------------------------------------------------------------------
CheckPrevSSE4:
mov ecx,(EndSSE4-TabSSE4)/3
mov edx,TabSSE4
.L1: cmp al,[rdx]
je .L2
add edx,3
loop .L1
stc
ret
.L2: mov edx,[rdx+1]
mov [I.Name],dx
call rbx
mov [I.RandSize],VQWORD+80h
clc
ret
;-----------------------------------------------------------------------------
CheckNextSSE4:
mov ecx,(EndNxtSSE4-NxtSSE4)/4
mov edx,NxtSSE4
.L1: cmp al,[rdx]
je .L2
add edx,4
loop .L1
stc
ret
.L2: mov ecx,[rdx+1]
mov [I.RandSize],cl
shr ecx,8
mov [I.Name],cx
 
cmp al,2Ah
jne .2A
cmp byte [rsi],0xC0
jae ErrorDec
.2A:
cmp al,15h
ja .L3
mov [I.Arg3.Type],XMMRG
.L3: call R32RM32X
clc
ret
;-----------------------------------------------------------------------------
R32RM32C:
call R32RM32M
 
mov [I.Arg2.Type],GPR64
mov [I.Arg1.Type],CTRRG
 
cmp [I.Arch],CPUX64
je .L1
mov [I.Arg2.Type],GPR32
;lock mov reg,cr0 = mov reg,cr8
;lock mov cr0,reg = mov cr8,reg
cmp [I.Reg],0
jne .L1
BitTR I.Prefixes,PF0
jnc .L1
mov [I.Reg],8
.L1: ret
 
RM32R32D:
call RM32R32M
 
mov [I.Arg1.Type],GPR64
mov [I.Arg2.Type],DBGRG
 
cmp [I.Arch],CPUX64
je .L1
mov [I.Arg1.Type],GPR32
.L1: ret
 
R32RM32D:
call R32RM32M
 
mov [I.Arg2.Type],GPR64
mov [I.Arg1.Type],DBGRG
 
cmp [I.Arch],CPUX64
je .L1
mov [I.Arg2.Type],GPR32
.L1: ret
 
RM32R32T:
call RM32R32M
 
mov [I.Arg1.Type],GPR64
mov [I.Arg2.Type],TRXRG
 
cmp [I.Arch],CPUX64
je .L1
mov [I.Arg1.Type],GPR32
.L1: ret
 
R32RM32T:
call R32RM32M
 
mov [I.Arg2.Type],GPR64
mov [I.Arg1.Type],TRXRG
 
cmp [I.Arch],CPUX64
je .L1
mov [I.Arg2.Type],GPR32
.L1: ret
;-----------------------------------------------------------------------------
BNDX4: mov [I.Arg2.Type],GPR64
mov [I.RandSize],VQWORD+80h
cmp [I.Arch],CPUX64
jz .Next
mov [I.RandSize],VDWORD+80h
mov [I.Arg2.Type],GPR32
.Next: ;jmp BNDX1
;-----------------------------------------------------------------------------
BNDX1: mov [I.Arg1.Type],BNDRG
ret
;-----------------------------------------------------------------------------
BNDX3: mov [I.Arg1.Type],BNDRG
BNDX2: mov [I.Arg2.Type],BNDRG
ret
;-----------------------------------------------------------------------------
Rtn0F3A14:
mov [I.RandSize],VBYTE+80h
mov dx,TPEXTRB
.L0: BitTR I.Prefixes,P66
jnc ErrorDec
mov [I.Name],dx
call RM32R32X
mov [I.Arg1.Type],GPR32
cmp [I.W],0
jz .L1
mov [I.Arg1.Type],GPR64
.L1: call ClearW
FetchB
mov [I.Arg3.Type],80h+1
mov [I.Arg3.ImmB],al
ret
Rtn0F3A15:
mov [I.RandSize],VWORD+80h
mov dx,TPEXTRW
jmp Rtn0F3A14.L0
Rtn0F3A16:
mov [I.RandSize],VDWORD+80h
mov dx,TPEXTRD
test [I.W],0
jz .L1
mov [I.RandSize],VQWORD+80h
mov dx,TPEXTRQ
.L1: jmp Rtn0F3A14.L0
Rtn0F3A17:
mov [I.RandSize],VDWORD+80h
mov dx,TEXTRACTPS
jmp Rtn0F3A14.L0
Rtn0F3A20:
mov [I.RandSize],VBYTE+80h
BitTR I.Prefixes,P66
jnc ErrorDec
mov [I.Name],TPINSRB
call R32RM32X
FetchB
mov [I.Arg2.Type],GPR32
mov [I.Arg3.Type],80h+1
mov [I.Arg3.ImmB],al
ret
Rtn0F3A21:
mov [I.RandSize],VDWORD+80h
BitTR I.Prefixes,P66
jnc ErrorDec
mov [I.Name],TINSERTPS
call R32RM32X
FetchB
mov [I.Arg3.Type],80h+1
mov [I.Arg3.ImmB],al
ret
Rtn0F3A22:
call R32RM32X
mov [I.RandSize],VDWORD+80h
BitTR I.Prefixes,P66
jnc ErrorDec
mov dx,TPINSRD
mov [I.Arg2.Type],GPR32
cmp [I.W],0
jz .L1
mov dx,TPINSRQ
mov [I.Arg2.Type],GPR64
.L1: mov [I.Name],dx
call ClearW
FetchB
.L2: mov [I.Arg3.Type],80h+1
mov [I.Arg3.ImmB],al
ret
Rtn0F3A44:
mov [I.RandSize],VXWORD+80h
mov [I.Name],TPCLMULQDQ
BitTR I.Prefixes,P66
jnc ErrorDec
call R32RM32X
xor eax,eax
FetchB
cmp al,18
ja Rtn0F3A22.L2
mov edx,[rax*2+TabCLMUL]
or dx,dx
jz Rtn0F3A22.L2
mov [I.Name],dx
ret
 
SetArg3Imm:
FetchB
mov [I.Arg3.Type],80h+1
mov [I.Arg3.ImmB],al
ret
 
SetArg3CL:
mov [I.Arg3.Type],GPR08
mov [I.Arg3.Reg],RRCX
ret
 
RtnXOP: mov ebx,R32RM32X
test [I.FlagsXOP],XOPO
jnz .Z1
mov ebx,RM32R32X
.Z1: call rbx
cmp [I.MMMMM],8
jnz .Z2
test [I.FlagsXOP],XOPI
jz .Z2
FetchB
mov [I.Arg3.Type],80h+1
mov [I.Arg3.ImmB],al
.Z2: ret
;-----------------------------------------------------------------------------
SetVT3: push CheckVT3
SetVT: mov [I.Base],-1
mov [I.Indx],-1
mov [I.Scale],-1
mov [I.DispSize],0
 
cmp [I.Arch],CPUX64
jz .L1
mov [I.Address],AD32
.L1:
mov rsi,[I.SaveRSI]
push rax
sub al,XMMRG-ADXX
mov [I.VT],al
call FetchModRM
pop rax
 
cmp [I.Arch],CPUX64
jz .L2
BitT I.PrefixesCpy,P67
jnc .L2
BitTS I.Prefixes,P67
.L2:
cmp [I.Relative],0
jnz ErrorDec
ret
;-----------------------------------------------------------------------------
CheckVT3:
cmp [I.Mod],3
jz ErrorDec
ret
;-----------------------------------------------------------------------------
RtnPINSR?:
test [I.VEX],VEXW
jz .L1
cmp [I.Arch],CPUX64
jnz ErrorDec
mov [I.RandSize],VQWORD+80h
mov [I.LastByte],'q'
mov [I.Arg3.Type],GPR64
.L1: ret
;-----------------------------------------------------------------------------
MoveKandZ:
test byte [I.FlagsEVEX],EVEXS
jnz .L1
mov al,[I.AAAA]
or al,al
jz .L1
mov al,'{'
stosb
cmp [I.Syntax],0
jz .L0
mov al,'%'
stosb
.L0:
mov al,'k'
stosb
mov al,[I.AAAA]
add al,'0'
stosb
mov al,'}'
stosb
.L1:
mov al,[I.Z]
or al,al
jz .L2
mov al,'{'
stosb
mov al,'z'
stosb
mov al,'}'
stosb
.L2:
ret
;-----------------------------------------------------------------------------
GetP0P1P2:
;P0
lodsb
cmp rsi,r9
ja .Error
test al,1100b
jnz .Error
mov ah,al
and al,11b
mov [I.MMMMM],al
mov al,ah
 
test al,10000000b
setz [I.R]
test al,00010000b
setz dl
shl dl,1
or [I.R],dl
shl [I.R],3
 
test al,01000000b
setz [I.X]
shl [I.X],3
 
test al,00100000b
setz [I.B]
shl [I.B],3
 
mov al,[I.X]
shl al,1
mov [I.XX],al
 
mov [I.P],1
 
;P1
lodsb
cmp rsi,r9
ja .Error
test al,100b
jz .Error
mov ah,al
and al,11b
mov [I.PP],al
mov al,ah
shr al,3
and al,1111b
xor al,1111b
mov [I.VVVV],al
mov al,ah
rol al,1
and al,1b
mov [I.W],al
;P2
lodsb
cmp rsi,r9
ja .Error
mov ah,al
and al,111b
mov [I.AAAA],al
mov al,ah
xor dl,dl
shl al,1
rcl dl,1
mov [I.Z],dl
mov al,ah
and al,1000b
xor al,1000b
jz .L1
add [I.V],16
.L1:
shl al,1
or [I.VVVV],al
mov al,ah
and al,1100000b
cmp al,1100000b
shr al,5
mov [I.LL],al
test ah,10000b
setnz [I.BB]
;
movzx eax,[I.PP]
mov edx,[rax*4+T6200Tab]
mov ebx,[rax*4+T6238Tab]
mov ecx,[rax*4+T623ATab]
;
mov al,[I.MMMMM]
or al,al
jz .Error
cmp al,00011b
jne .L2
mov edx,ecx
.L2:
cmp al,00010b
jne .L3
mov edx,ebx
.L3:
lodsb
cmp rsi,r9
ja .Error
mov ebx,edx
;
mov [I.SaveRSI],rsi
ret
;
.Error: pop rax
jmp BNDEVEX62.Error
;-----------------------------------------------------------------------------
DetectMULT:
cmp [I.Is62],0
jz .L2
mov al,[I.RandSize]
mov ah,1
cmp al,xW
jz .L1
mov ah,2
cmp al,xD
jz .L1
mov ah,3
cmp al,xQ
jz .L1
mov ah,4
cmp al,xO
jz .L1
mov ah,5
cmp al,xY
jz .L1
mov ah,6
cmp al,xZ
jz .L1
xor ah,ah
.L1:
mov [I.MULT],ah
.L2:
ret
;-----------------------------------------------------------------------------
MoveXtoX:
cmp [I.Mod],3
jz .V1
cmp [I.BB],0
jz .V1
movzx eax,[I.LL]
test byte [I.FlagsEVEX+2],EVEXAA shr 16
jnz .V0
cmp [I.RandSize],xQ
jz .V0
inc eax
.V0: mov esi,dword [rax*2+T1TO]
call MoveStringData
.V1: ret
;-----------------------------------------------------------------------------
MoveSAE1:
cmp [I.Mod],3
jnz .E1
test byte [I.FlagsEVEX],EVEXO
jz .L1
cmp [I.W],0
jz .E1
.L1:
test byte [I.FlagsEVEX],EVEXR
jz .E2
cmp [I.BB],0
jz .E1
mov al,','
stosb
movzx eax,[I.LL]
mov esi,dword [rax*2+TSAE]
call MoveStringData
.E1: ret
.E2: cmp [I.BB],0
jz .E3
cmp [I.LL],00b
jnz .E3
if %B=64
mov rax,',{sae}'
stosq
sub rdi,2
else
mov ax,',{'
stosw
mov eax,'sae}'
stosd
end if
.E3: ret
;-----------------------------------------------------------------------------
MoveSAE2:
cmp [I.Mod],3
jnz .E1
test byte [I.FlagsEVEX],EVEXO
jz .L1
cmp [I.W],0
jz .E1
.L1:
test byte [I.FlagsEVEX],EVEXR
jz .E2
cmp [I.BB],0
jz .E1
movzx eax,[I.LL]
mov esi,dword [rax*2+TSAE]
call MoveStringData
mov al,','
stosb
.E1: ret
.E2: cmp [I.BB],0
jz .E3
cmp [I.LL],00b
jnz .E3
if %B=64
mov rax,'{sae},'
stosq
sub rdi,2
else
mov eax,'{sae'
stosd
mov ax,'},'
stosw
end if
.E3: ret
;-----------------------------------------------------------------------------
GetVectorAL:
test byte [I.FlagsEVEX],EVEXX
jnz .L1
mov al,ZMMRG
cmp [I.BB],0
jnz .L0
test [I.LL],10b
jnz .L0
mov al,YMMRG
test [I.LL],01b
jnz .L0
.L1: mov al,XMMRG
.L0: ret
;-----------------------------------------------------------------------------
GetVectorAndMUL:
test byte [I.FlagsEVEX],EVEXX
jnz .L4
;
mov ah,[I.LL]
 
mov al,ZMMRG
;
cmp [I.Mod],3
jnz .LX
cmp [I.BB],0
jnz .L0
.LX: ;
test ah,10b
jnz .L0
mov al,YMMRG
test ah,01b
jnz .L0
mov al,XMMRG
;
.L0: mov ah,al
;
cmp [I.BB],0
jnz .L3
cmp al,YMMRG
jz .L2
ja .L1
ret
;
.L1: call .L2
.L2: inc [I.RandSize]
.L3: ret
.L4: mov al,XMMRG
mov ah,al
ret
;-----------------------------------------------------------------------------
GetRDRQAH:
mov ah,GPR32
cmp [I.W],1
jnz .L1
mov ah,GPR64
.L1: ret
;-----------------------------------------------------------------------------
GetRDRQAL:
mov al,GPR32
cmp [I.W],1
jnz .L1
mov al,GPR64
.L1: ret
/programs/develop/koldbg/disasm/qopcodes.bin
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/programs/develop/koldbg/disasm/qopcodes.inc
0,0 → 1,1640
;SubStrings
T? equ 326
TADD equ 2473
TADDPD equ 2761
TADDPS equ 9
TADDSD equ 2769
TADDSS equ 18
TADDSUBPD equ 2855
TADDSUBPS equ 2866
TAL equ 4952
TAND equ 5735
TANDN equ 5740
TANDPD equ 2089
TANDPS equ 2098
TAX equ 2013
TBL equ 5312
TBP equ 3781
TBX equ 2017
TCALL equ 4714
TCH equ 3846
TCL equ 349
TCMOVB equ 2292
TCMOVBE equ 2299
TCMPEQ equ 6613
TCMPGE equ 6621
TCMPGT equ 6629
TCOMISD equ 9922
TCOMISS equ 9930
TCS equ 221
TCX equ 70
TDB equ 4514
TDEC equ 87
TDI equ 2025
TDIV equ 2424
TDS equ 4734
TDX equ 368
TEBP equ 4188
TEMMS equ 2448
TENTER equ 9807
TES equ 4748
TEXTRQ equ 6574
TFADD equ 6606
TFMADDPS equ 7
TFMADDSS equ 16
TFMUL equ 6648
TFNMADDPS equ 25
TFNMADDSS equ 35
TFS equ 4759
TFSUB equ 6726
TFSUBR equ 6732
TGS equ 4768
TIDIV equ 2491
TIMUL equ 2509
TIN equ 3661
TINS equ 4944
TINSB equ 7204
TINSD equ 7211
TINSW equ 7218
TINT equ 1921
TINVD equ 10136
TJMP equ 4777
TKMOVD equ 7154
TLSS equ 5524
TMAXSD equ 7168
TMINSD equ 7210
TMM0 equ 10302
TMM1 equ 10307
TMM2 equ 10372
TMM3 equ 10437
TMM4 equ 10454
TMM5 equ 10459
TMM6 equ 10464
TMM7 equ 10469
TMONITOR equ 9950
TMOV equ 380
TMOVBE equ 2300
TMOVD equ 7155
TMOVDQU equ 4965
TMOVQ equ 4996
TMOVS equ 831
TMUL equ 2510
TMWAIT equ 9964
TNOP equ 3392
TOR equ 3591
TORPD equ 10484
TORPS equ 10490
TPANDD equ 6539
TPAUSE equ 9864
TPORD equ 1049
TPSADBW equ 1878
TR10 equ 1243
TR11 equ 1248
TR12 equ 1253
TR13 equ 1258
TR14 equ 1263
TR15 equ 1268
TR8 equ 1297
TR9 equ 1301
TRET equ 4401
TSHLD equ 7934
TSHR equ 8780
TSI equ 277
TSLDT equ 8961
TSP equ 2076
TSQRTPS equ 9015
TSQRTSS equ 9023
TSS equ 21
TST2 equ 9845
TSTD equ 5850
TSUB equ 2548
TSUBPD equ 2858
TSUBPS equ 2869
TSUBSD equ 3086
TSUBSS equ 3094
TTEST equ 8271
TWORD equ 2006
TXCHG equ 1152
TXOR equ 8448
TXRSTOR equ 3862
TXRSTOR64 equ 3870
TXSAVE equ 3880
TXSAVE64 equ 3887
;Strings
T?BYTE equ 0
T4FMADDPS equ 6
T4FMADDSS equ 15
T4FNMADDPS equ 24
T4FNMADDSS equ 34
TA? equ 44
TAAA equ 48
TAAD equ 52
TAAM equ 56
TAAS equ 60
TADC equ 64
TADCX equ 68
TADDR equ 73
TADOX equ 79
TAESDEC equ 84
TAESDECLAST equ 91
TAESENC equ 102
TAESENCLAST equ 109
TAESIMC equ 120
TAESKEYGENASSIST equ 127
TAH equ 143
TALIGND equ 146
TANDNPD equ 153
TANDNPS equ 160
TARPL equ 167
TBB0?RESET equ 172
TBB1?RESET equ 182
TBEXTR equ 192
TBH equ 198
TBLCI equ 201
TBLCIC equ 206
TBLCMSK equ 212
TBLCS equ 219
TBLENDMPS equ 224
TBLENDPD equ 233
TBLENDPS equ 241
TBLENDVPD equ 249
TBLENDVPS equ 258
TBLSFILL equ 267
TBLSI equ 275
TBLSIC equ 280
TBLSMSK equ 286
TBLSR equ 293
TBND equ 298
TBND0 equ 302
TBND1 equ 307
TBND2 equ 312
TBND3 equ 317
TBND4? equ 322
TBND5? equ 328
TBND6? equ 334
TBND7? equ 340
TBNDCL equ 346
TBNDCN equ 352
TBNDCU equ 358
TBNDLDX equ 364
TBNDMK equ 371
TBNDMOV equ 377
TBNDSTX equ 384
TBOUND equ 391
TBPL equ 397
TBROADCASTF128 equ 401
TBROADCASTF32X2 equ 415
TBROADCASTF32X4 equ 430
TBROADCASTF32X8 equ 445
TBROADCASTF64X2 equ 460
TBROADCASTF64X4 equ 475
TBROADCASTI128 equ 490
TBROADCASTI32X2 equ 504
TBROADCASTI32X4 equ 519
TBROADCASTI32X8 equ 534
TBROADCASTI64X2 equ 549
TBROADCASTI64X4 equ 564
TBROADCASTSD equ 579
TBROADCASTSS equ 591
TBSF equ 603
TBSR equ 607
TBSWAP equ 611
TBT equ 617
TBTC equ 620
TBTR equ 624
TBTS equ 628
TBYTE equ 632
TBZHI equ 638
TCBTW equ 643
TCBW equ 648
TCDQ equ 652
TCDQE equ 656
TCLAC equ 661
TCLC equ 666
TCLD equ 670
TCLDEMOTE equ 674
TCLFLUSH equ 683
TCLFLUSHOPT equ 691
TCLGI equ 702
TCLI equ 707
TCLRSSBSY equ 711
TCLTD equ 720
TCLTQ equ 725
TCLTS equ 730
TCLWB equ 735
TCLZERO equ 740
TCMC equ 747
TCMOVA equ 751
TCMOVAE equ 757
TCMOVG equ 764
TCMOVGE equ 770
TCMOVL equ 777
TCMOVLE equ 783
TCMOVNO equ 790
TCMOVNP equ 797
TCMOVNS equ 804
TCMOVNZ equ 811
TCMOVO equ 818
TCMOVP equ 824
TCMOVS equ 830
TCMOVZ equ 836
TCMP equ 842
TCMPEQ?OS equ 846
TCMPEQ?UQ equ 855
TCMPEQ?US equ 864
TCMPFALSE equ 873
TCMPFALSE?OS equ 882
TCMPGE?OQ equ 894
TCMPGT?OQ equ 903
TCMPLE equ 912
TCMPLE?OQ equ 918
TCMPLT equ 927
TCMPLT?OQ equ 933
TCMPNEQ equ 942
TCMPNEQ?OQ equ 949
TCMPNEQ?OS equ 959
TCMPNEQ?US equ 969
TCMPNGE equ 979
TCMPNGE?UQ equ 986
TCMPNGT equ 996
TCMPNGT?UQ equ 1003
TCMPNLE equ 1013
TCMPNLE?UQ equ 1020
TCMPNLT equ 1030
TCMPNLT?UQ equ 1037
TCMPORD equ 1047
TCMPORD?S equ 1054
TCMPPD equ 1063
TCMPPS equ 1069
TCMPS equ 1075
TCMPSB equ 1080
TCMPSD equ 1086
TCMPSQ equ 1092
TCMPSS equ 1098
TCMPSW equ 1104
TCMPTRUE equ 1110
TCMPTRUE?US equ 1118
TCMPUNORD equ 1129
TCMPUNORD?S equ 1138
TCMPXCHG equ 1149
TCMPXCHG16B equ 1157
TCMPXCHG486 equ 1168
TCMPXCHG8B equ 1179
TCOMPRESSPS equ 1189
TCPU?READ equ 1200
TCPU?WRITE equ 1209
TCPUID equ 1219
TCQO equ 1225
TCQTO equ 1229
TCR0 equ 1234
TCR1 equ 1238
TCR10 equ 1242
TCR11 equ 1247
TCR12 equ 1252
TCR13 equ 1257
TCR14 equ 1262
TCR15 equ 1267
TCR2 equ 1272
TCR3 equ 1276
TCR4 equ 1280
TCR5 equ 1284
TCR6 equ 1288
TCR7 equ 1292
TCR8 equ 1296
TCR9 equ 1300
TCRC32 equ 1304
TCVTDQ2PD equ 1310
TCVTDQ2PS equ 1319
TCVTPD2DQ equ 1328
TCVTPD2PI equ 1337
TCVTPD2PS equ 1346
TCVTPD2QQ equ 1355
TCVTPD2UDQ equ 1364
TCVTPD2UQQ equ 1374
TCVTPH2PS equ 1384
TCVTPI2PD equ 1393
TCVTPI2PS equ 1402
TCVTPS2DQ equ 1411
TCVTPS2PD equ 1420
TCVTPS2PH equ 1429
TCVTPS2PI equ 1438
TCVTPS2QQ equ 1447
TCVTPS2UDQ equ 1456
TCVTPS2UQQ equ 1466
TCVTQQ2PD equ 1476
TCVTQQ2PS equ 1485
TCVTSD2SI equ 1494
TCVTSD2SS equ 1503
TCVTSD2USI equ 1512
TCVTSI2SD equ 1522
TCVTSI2SS equ 1531
TCVTSS2SD equ 1540
TCVTSS2SI equ 1549
TCVTSS2USI equ 1558
TCVTTPD2DQ equ 1568
TCVTTPD2PI equ 1578
TCVTTPD2QQ equ 1588
TCVTTPD2UDQ equ 1598
TCVTTPD2UQQ equ 1609
TCVTTPS2DQ equ 1620
TCVTTPS2PI equ 1630
TCVTTPS2QQ equ 1640
TCVTTPS2UDQ equ 1650
TCVTTPS2UQQ equ 1661
TCVTTSD2SI equ 1672
TCVTTSD2USI equ 1682
TCVTTSS2SI equ 1693
TCVTTSS2USI equ 1703
TCVTUDQ2PD equ 1714
TCVTUDQ2PS equ 1724
TCVTUQQ2PD equ 1734
TCVTUQQ2PS equ 1744
TCVTUSI2SD equ 1754
TCVTUSI2SS equ 1764
TCWD equ 1774
TCWDE equ 1778
TCWTD equ 1783
TCWTL equ 1788
TDAA equ 1793
TDAS equ 1797
TDATA equ 1801
TDB0 equ 1806
TDB1 equ 1810
TDB10 equ 1814
TDB11 equ 1819
TDB12 equ 1824
TDB13 equ 1829
TDB14 equ 1834
TDB15 equ 1839
TDB2 equ 1844
TDB3 equ 1848
TDB4 equ 1852
TDB5 equ 1856
TDB6 equ 1860
TDB7 equ 1864
TDB8 equ 1868
TDB9 equ 1872
TDBPSADBW equ 1876
TDH equ 1885
TDIL equ 1888
TDIVPD equ 1892
TDIVPS equ 1898
TDIVSD equ 1904
TDIVSS equ 1910
TDL equ 1916
TDMINT equ 1919
TDPPD equ 1925
TDPPS equ 1930
TDR0 equ 1935
TDR1 equ 1939
TDR10 equ 1943
TDR11 equ 1948
TDR12 equ 1953
TDR13 equ 1958
TDR14 equ 1963
TDR15 equ 1968
TDR2 equ 1973
TDR3 equ 1977
TDR4 equ 1981
TDR5 equ 1985
TDR6 equ 1989
TDR7 equ 1993
TDR8 equ 1997
TDR9 equ 2001
TDWORD equ 2005
TEAX equ 2012
TEBX equ 2016
TECX equ 2020
TEDI equ 2024
TEDX equ 2028
TEIP? equ 2032
TENCLS equ 2037
TENCLU equ 2043
TENCLV equ 2049
TENDBR32 equ 2055
TENDBR64 equ 2063
TESI equ 2071
TESP equ 2075
TEXP2PS equ 2079
TEXPANDPD equ 2086
TEXPANDPS equ 2095
TEXTRACTF128 equ 2104
TEXTRACTF32X4 equ 2116
TEXTRACTF32X8 equ 2129
TEXTRACTF64X2 equ 2142
TEXTRACTF64X4 equ 2155
TEXTRACTI128 equ 2168
TEXTRACTI32X4 equ 2180
TEXTRACTI32X8 equ 2193
TEXTRACTI64X2 equ 2206
TEXTRACTI64X4 equ 2219
TEXTRACTPS equ 2232
TF2XM1 equ 2242
TF4X4 equ 2248
TFABS equ 2253
TFADDP equ 2258
TFAR equ 2264
TFBLD equ 2269
TFBSTP equ 2274
TFCHS equ 2280
TFCLEX equ 2285
TFCMOVB equ 2291
TFCMOVBE equ 2298
TFCMOVE equ 2306
TFCMOVNB equ 2313
TFCMOVNBE equ 2321
TFCMOVNE equ 2330
TFCMOVNU equ 2338
TFCMOVU equ 2346
TFCOM equ 2353
TFCOM2 equ 2358
TFCOMI equ 2364
TFCOMIP equ 2370
TFCOMP equ 2377
TFCOMP3 equ 2383
TFCOMP5 equ 2390
TFCOMPP equ 2397
TFCOS equ 2404
TFDECSTP equ 2409
TFDISI equ 2417
TFDIV equ 2423
TFDIVP equ 2428
TFDIVR equ 2434
TFDIVRP equ 2440
TFEMMS equ 2447
TFENI equ 2453
TFFREE equ 2458
TFFREEP equ 2464
TFIADD equ 2471
TFICOM equ 2477
TFICOMP equ 2483
TFIDIV equ 2490
TFIDIVR equ 2496
TFILD equ 2503
TFIMUL equ 2508
TFINCSTP equ 2514
TFINIT equ 2522
TFIST equ 2528
TFISTP equ 2533
TFISTTP equ 2539
TFISUB equ 2546
TFISUBR equ 2552
TFIXUPIMMPS equ 2559
TFIXUPIMMSS equ 2570
TFLD equ 2581
TFLD1 equ 2585
TFLDCW equ 2590
TFLDENV equ 2596
TFLDENVD equ 2603
TFLDENVS equ 2611
TFLDENVW equ 2619
TFLDL2E equ 2627
TFLDL2T equ 2634
TFLDLG2 equ 2641
TFLDLN2 equ 2648
TFLDPI equ 2655
TFLDZ equ 2661
TFMADD132 equ 2666
TFMADD132PS equ 2675
TFMADD132SS equ 2686
TFMADD213 equ 2697
TFMADD213PS equ 2706
TFMADD213SS equ 2717
TFMADD231 equ 2728
TFMADD231PS equ 2737
TFMADD231SS equ 2748
TFMADDPD equ 2759
TFMADDSD equ 2767
TFMADDSUB132 equ 2775
TFMADDSUB132PS equ 2787
TFMADDSUB213 equ 2801
TFMADDSUB213PS equ 2813
TFMADDSUB231 equ 2827
TFMADDSUB231PS equ 2839
TFMADDSUBPD equ 2853
TFMADDSUBPS equ 2864
TFMSUB132 equ 2875
TFMSUB132PS equ 2884
TFMSUB132SS equ 2895
TFMSUB213 equ 2906
TFMSUB213PS equ 2915
TFMSUB213SS equ 2926
TFMSUB231 equ 2937
TFMSUB231PS equ 2946
TFMSUB231SS equ 2957
TFMSUBADD132 equ 2968
TFMSUBADD132PS equ 2980
TFMSUBADD213 equ 2994
TFMSUBADD213PS equ 3006
TFMSUBADD231 equ 3020
TFMSUBADD231PS equ 3032
TFMSUBADDPD equ 3046
TFMSUBADDPS equ 3057
TFMSUBPD equ 3068
TFMSUBPS equ 3076
TFMSUBSD equ 3084
TFMSUBSS equ 3092
TFMULP equ 3100
TFNCLEX equ 3106
TFNDISI equ 3113
TFNENI equ 3120
TFNINIT equ 3126
TFNMADD132 equ 3133
TFNMADD132PS equ 3143
TFNMADD132SS equ 3155
TFNMADD213 equ 3167
TFNMADD213PS equ 3177
TFNMADD213SS equ 3189
TFNMADD231 equ 3201
TFNMADD231PS equ 3211
TFNMADD231SS equ 3223
TFNMADDPD equ 3235
TFNMADDSD equ 3244
TFNMSUB132 equ 3253
TFNMSUB132PS equ 3263
TFNMSUB132SS equ 3275
TFNMSUB213 equ 3287
TFNMSUB213PS equ 3297
TFNMSUB213SS equ 3309
TFNMSUB231 equ 3321
TFNMSUB231PS equ 3331
TFNMSUB231SS equ 3343
TFNMSUBPD equ 3355
TFNMSUBPS equ 3364
TFNMSUBSD equ 3373
TFNMSUBSS equ 3382
TFNOP equ 3391
TFNSAVE equ 3396
TFNSAVED equ 3403
TFNSAVEW equ 3411
TFNSTCW equ 3419
TFNSTDW equ 3426
TFNSTENV equ 3433
TFNSTENVD equ 3441
TFNSTENVS equ 3450
TFNSTENVW equ 3459
TFNSTSG equ 3468
TFNSTSW equ 3475
TFPATAN equ 3482
TFPCLASSPS equ 3489
TFPCLASSSS equ 3499
TFPREM equ 3509
TFPREM1 equ 3515
TFPTAN equ 3522
TFRCZPD equ 3528
TFRCZPS equ 3535
TFRCZSD equ 3542
TFRCZSS equ 3549
TFRICHOP equ 3556
TFRINEAR equ 3564
TFRINT2 equ 3572
TFRNDINT equ 3579
TFRSTOR equ 3587
TFRSTORD equ 3594
TFRSTORS equ 3602
TFRSTORW equ 3610
TFRSTPM equ 3618
TFSAVE equ 3625
TFSAVED equ 3631
TFSAVEW equ 3638
TFSCALE equ 3645
TFSETPM equ 3652
TFSIN equ 3659
TFSINCOS equ 3664
TFSQRT equ 3672
TFST equ 3678
TFSTB0 equ 3682
TFSTB1 equ 3688
TFSTB2 equ 3694
TFSTCW equ 3700
TFSTDW equ 3706
TFSTENV equ 3712
TFSTENVD equ 3719
TFSTENVS equ 3727
TFSTENVW equ 3735
TFSTP equ 3743
TFSTP1 equ 3748
TFSTP8 equ 3754
TFSTP9 equ 3760
TFSTSG equ 3766
TFSTSW equ 3772
TFSUBP equ 3778
TFSUBRP equ 3784
TFTST equ 3791
TFUCOM equ 3796
TFUCOMI equ 3802
TFUCOMIP equ 3809
TFUCOMP equ 3817
TFUCOMPP equ 3824
TFWORD equ 3832
TFXAM equ 3839
TFXCH equ 3844
TFXCH4 equ 3849
TFXCH7 equ 3855
TFXRSTOR equ 3861
TFXRSTOR64 equ 3869
TFXSAVE equ 3879
TFXSAVE64 equ 3886
TFXTRACT equ 3895
TFYL2X equ 3903
TFYL2XP1 equ 3909
TGATHERD equ 3917
TGATHERDPS equ 3925
TGATHERPF0DPD equ 3935
TGATHERPF0DPS equ 3948
TGATHERPF0QPD equ 3961
TGATHERPF0QPS equ 3974
TGATHERPF1DPD equ 3987
TGATHERPF1DPS equ 4000
TGATHERPF1QPD equ 4013
TGATHERPF1QPS equ 4026
TGATHERQ equ 4039
TGATHERQPS equ 4047
TGETEXPPS equ 4057
TGETEXPSS equ 4066
TGETMANTPS equ 4075
TGETMANTSS equ 4085
TGETSEC equ 4095
TGF2P8AFFINEINVQB equ 4102
TGF2P8AFFINEQB equ 4119
TGF2P8MULB equ 4133
THADDPD equ 4143
THADDPS equ 4150
THINT?NOPXX equ 4157
THLT equ 4168
THSUBPD equ 4172
THSUBPS equ 4179
TICEBP equ 4186
TINC equ 4192
TINCSSPD equ 4196
TINCSSPQ equ 4204
TINSERTF128 equ 4212
TINSERTF32X4 equ 4223
TINSERTF32X8 equ 4235
TINSERTF64X2 equ 4247
TINSERTF64X4 equ 4259
TINSERTI128 equ 4271
TINSERTI32X4 equ 4282
TINSERTI32X8 equ 4294
TINSERTI64X2 equ 4306
TINSERTI64X4 equ 4318
TINSERTPS equ 4330
TINSERTQ equ 4339
TINT1 equ 4347
TINT3 equ 4352
TINTO equ 4357
TINVEPT equ 4362
TINVLPG equ 4369
TINVLPGA equ 4376
TINVPCID equ 4384
TINVVPID equ 4392
TIRET equ 4400
TJ? equ 4405
TJA equ 4409
TJAE equ 4412
TJB equ 4416
TJBE equ 4419
TJCXZ equ 4423
TJECXZ equ 4428
TJG equ 4434
TJGE equ 4437
TJL equ 4441
TJLE equ 4444
TJMPE equ 4448
TJNO equ 4453
TJNP equ 4457
TJNS equ 4461
TJNZ equ 4465
TJO equ 4469
TJP equ 4472
TJRCXZ equ 4475
TJS equ 4481
TJZ equ 4484
TK0 equ 4487
TK1 equ 4490
TK2 equ 4493
TK3 equ 4496
TK4 equ 4499
TK5 equ 4502
TK6 equ 4505
TK7 equ 4508
TKADDB equ 4511
TKADDW equ 4517
TKANDB equ 4523
TKANDNB equ 4529
TKANDNW equ 4536
TKANDW equ 4543
TKMOVB equ 4549
TKMOVW equ 4555
TKNOTB equ 4561
TKNOTW equ 4567
TKORB equ 4573
TKORTESTB equ 4578
TKORTESTW equ 4587
TKORW equ 4596
TKSHIFTLB equ 4601
TKSHIFTLD equ 4610
TKSHIFTRB equ 4619
TKSHIFTRD equ 4628
TKTESTB equ 4637
TKTESTW equ 4644
TKUNPCKBW equ 4651
TKUNPCKDQ equ 4660
TKUNPCKWD equ 4669
TKXNORB equ 4678
TKXNORW equ 4685
TKXORB equ 4692
TKXORW equ 4698
TLAHF equ 4704
TLAR equ 4709
TLCALL equ 4713
TLDDQU equ 4719
TLDMXCSR equ 4725
TLDS equ 4733
TLEA equ 4737
TLEAVE equ 4741
TLES equ 4747
TLFENCE equ 4751
TLFS equ 4758
TLGDT equ 4762
TLGS equ 4767
TLIDT equ 4771
TLJMP equ 4776
TLLDT equ 4781
TLLWPCB equ 4786
TLMSW equ 4793
TLOADALL equ 4798
TLOADALL286 equ 4806
TLOCK equ 4817
TLODS equ 4823
TLODSB equ 4828
TLODSD equ 4834
TLODSQ equ 4840
TLODSW equ 4846
TLOOP equ 4852
TLOOPD equ 4857
TLOOPL equ 4863
TLOOPNZ equ 4869
TLOOPNZD equ 4876
TLOOPNZL equ 4884
TLOOPNZW equ 4892
TLOOPW equ 4900
TLOOPZ equ 4906
TLOOPZD equ 4912
TLOOPZL equ 4919
TLOOPZW equ 4926
TLSL equ 4933
TLTR equ 4937
TLWPINS equ 4941
TLWPVAL equ 4948
TLZCNT equ 4955
TMASKMOVDQU equ 4961
TMASKMOVPD equ 4972
TMASKMOVPS equ 4982
TMASKMOVQ equ 4992
TMAXPD equ 5001
TMAXPS equ 5007
TMAXSS equ 5013
TMFENCE equ 5019
TMINPD equ 5026
TMINPS equ 5032
TMINSS equ 5038
TMONITORX equ 5044
TMONTMUL equ 5053
TMOVAPD equ 5061
TMOVAPS equ 5068
TMOVDDUP equ 5075
TMOVDIR64B equ 5083
TMOVDIRI equ 5093
TMOVDQ2Q equ 5101
TMOVDQA equ 5109
TMOVDQA32 equ 5116
TMOVDQA64 equ 5125
TMOVDQU16 equ 5134
TMOVDQU32 equ 5143
TMOVDQU64 equ 5152
TMOVDQU8 equ 5161
TMOVHLPS equ 5169
TMOVHPD equ 5177
TMOVHPS equ 5184
TMOVLHPS equ 5191
TMOVLPD equ 5199
TMOVLPS equ 5206
TMOVMSKPD equ 5213
TMOVMSKPS equ 5222
TMOVNTDQ equ 5231
TMOVNTDQA equ 5239
TMOVNTI equ 5248
TMOVNTPD equ 5255
TMOVNTPS equ 5263
TMOVNTQ equ 5271
TMOVNTSD equ 5278
TMOVNTSS equ 5286
TMOVQ2DQ equ 5294
TMOVSB equ 5302
TMOVSBL equ 5308
TMOVSBQ equ 5315
TMOVSBW equ 5322
TMOVSD equ 5329
TMOVSHDUP equ 5335
TMOVSLDUP equ 5344
TMOVSLQ equ 5353
TMOVSQ equ 5360
TMOVSS equ 5366
TMOVSW equ 5372
TMOVSWL equ 5378
TMOVSWQ equ 5385
TMOVSWW equ 5392
TMOVSX equ 5399
TMOVSXD equ 5405
TMOVUPD equ 5412
TMOVUPS equ 5419
TMOVZBL equ 5426
TMOVZBQ equ 5433
TMOVZBW equ 5440
TMOVZLQ equ 5447
TMOVZWL equ 5454
TMOVZWQ equ 5461
TMOVZWW equ 5468
TMOVZX equ 5475
TMOVZXD equ 5481
TMOVZXDW equ 5488
TMPSADBW equ 5496
TMULPD equ 5504
TMULPS equ 5510
TMULSD equ 5516
TMULSS equ 5522
TMULX equ 5528
TMWAITX equ 5533
TN? equ 5540
TNEAR equ 5544
TNEG equ 5550
TNOT equ 5554
TOUT equ 5558
TOUTS equ 5562
TOUTSB equ 5567
TOUTSD equ 5573
TOUTSW equ 5579
TP4DPWSSD equ 5585
TP4DPWSSDS equ 5594
TPABSB equ 5604
TPABSD equ 5610
TPABSQ equ 5616
TPABSW equ 5622
TPACKSSDW equ 5628
TPACKSSWB equ 5637
TPACKUSDW equ 5646
TPACKUSWB equ 5655
TPADDB equ 5664
TPADDD equ 5670
TPADDQ equ 5676
TPADDSB equ 5682
TPADDSIW equ 5689
TPADDSW equ 5697
TPADDUSB equ 5704
TPADDUSW equ 5712
TPADDW equ 5720
TPALIGNR equ 5726
TPAND equ 5734
TPANDN equ 5739
TPANDND equ 5745
TPAVEB equ 5752
TPAVGB equ 5758
TPAVGUSB equ 5764
TPAVGW equ 5772
TPBLENDD equ 5778
TPBLENDMB equ 5786
TPBLENDMD equ 5795
TPBLENDMW equ 5804
TPBLENDVB equ 5813
TPBLENDW equ 5822
TPBROADCASTB equ 5830
TPBROADCASTD equ 5842
TPBROADCASTMB2Q equ 5854
TPBROADCASTMW2D equ 5869
TPBROADCASTQ equ 5884
TPBROADCASTW equ 5896
TPCLMULHQHQDQ equ 5908
TPCLMULHQLQDQ equ 5921
TPCLMULLQHQDQ equ 5934
TPCLMULLQLQDQ equ 5947
TPCLMULQDQ equ 5960
TPCMOV equ 5970
TPCMPB equ 5976
TPCMPD equ 5982
TPCMPEQB equ 5988
TPCMPEQD equ 5996
TPCMPEQQ equ 6004
TPCMPEQW equ 6012
TPCMPESTRI equ 6020
TPCMPESTRM equ 6030
TPCMPGTB equ 6040
TPCMPGTD equ 6048
TPCMPGTQ equ 6056
TPCMPGTW equ 6064
TPCMPISTRI equ 6072
TPCMPISTRM equ 6082
TPCMPUB equ 6092
TPCMPUD equ 6099
TPCMPUW equ 6106
TPCMPW equ 6113
TPCOM equ 6119
TPCOMEQ equ 6124
TPCOMFALSE equ 6131
TPCOMGE equ 6141
TPCOMGT equ 6148
TPCOMLE equ 6155
TPCOMLT equ 6162
TPCOMMIT equ 6169
TPCOMNEQ equ 6177
TPCOMPRESSB equ 6185
TPCOMPRESSD equ 6196
TPCOMPRESSW equ 6207
TPCOMTRUE equ 6218
TPCONFIG equ 6227
TPCONFLICTD equ 6235
TPDEP equ 6246
TPDISTIB equ 6251
TPDPBUSD equ 6259
TPDPBUSDS equ 6267
TPDPWSSD equ 6276
TPDPWSSDS equ 6284
TPERM2F128 equ 6293
TPERM2I128 equ 6303
TPERMB equ 6313
TPERMD equ 6319
TPERMI2B equ 6325
TPERMI2D equ 6333
TPERMI2PS equ 6341
TPERMI2W equ 6350
TPERMIL2PD equ 6358
TPERMIL2PS equ 6368
TPERMILMO2PD equ 6378
TPERMILMO2PS equ 6390
TPERMILMZ2PD equ 6402
TPERMILMZ2PS equ 6414
TPERMILPD equ 6426
TPERMILPS equ 6435
TPERMILTD2PD equ 6444
TPERMILTD2PS equ 6456
TPERMPD equ 6468
TPERMPS equ 6475
TPERMQ equ 6482
TPERMT2B equ 6488
TPERMT2D equ 6496
TPERMT2PS equ 6504
TPERMT2W equ 6513
TPERMW equ 6521
TPEXPANDB equ 6527
TPEXPANDD equ 6536
TPEXPANDW equ 6545
TPEXT equ 6554
TPEXTRB equ 6559
TPEXTRD equ 6566
TPEXTRQ equ 6573
TPEXTRW equ 6580
TPF2ID equ 6587
TPF2IW equ 6593
TPFACC equ 6599
TPFADD equ 6605
TPFCMPEQ equ 6611
TPFCMPGE equ 6619
TPFCMPGT equ 6627
TPFMAX equ 6635
TPFMIN equ 6641
TPFMUL equ 6647
TPFNACC equ 6653
TPFPNACC equ 6660
TPFRCP equ 6668
TPFRCPIT1 equ 6674
TPFRCPIT2 equ 6683
TPFRCPV equ 6692
TPFRSQIT1 equ 6699
TPFRSQRT equ 6708
TPFRSQRTV equ 6716
TPFSUB equ 6725
TPFSUBR equ 6731
TPGATHERDD equ 6738
TPGATHERQD equ 6748
TPHADDBD equ 6758
TPHADDBQ equ 6766
TPHADDBW equ 6774
TPHADDD equ 6782
TPHADDDQ equ 6789
TPHADDSW equ 6797
TPHADDUBD equ 6805
TPHADDUBQ equ 6814
TPHADDUBW equ 6823
TPHADDUDQ equ 6832
TPHADDUWD equ 6841
TPHADDUWQ equ 6850
TPHADDW equ 6859
TPHADDWD equ 6866
TPHADDWQ equ 6874
TPHMINPOSUW equ 6882
TPHSUBBW equ 6893
TPHSUBD equ 6901
TPHSUBDQ equ 6908
TPHSUBSW equ 6916
TPHSUBW equ 6924
TPHSUBWD equ 6931
TPI2FD equ 6939
TPI2FW equ 6945
TPINSRB equ 6951
TPINSRD equ 6958
TPINSRQ equ 6965
TPINSRW equ 6972
TPLZCNTD equ 6979
TPMACHRIW equ 6987
TPMACSDD equ 6996
TPMACSDQH equ 7004
TPMACSDQL equ 7013
TPMACSSDD equ 7022
TPMACSSDQH equ 7031
TPMACSSDQL equ 7041
TPMACSSWD equ 7051
TPMACSSWW equ 7060
TPMACSWD equ 7069
TPMACSWW equ 7077
TPMADCSSWD equ 7085
TPMADCSWD equ 7095
TPMADD52HUQ equ 7104
TPMADD52LUQ equ 7115
TPMADDUBSW equ 7126
TPMADDWD equ 7136
TPMAGW equ 7144
TPMASKMOVD equ 7150
TPMAXSB equ 7160
TPMAXSD equ 7167
TPMAXSW equ 7174
TPMAXUB equ 7181
TPMAXUD equ 7188
TPMAXUW equ 7195
TPMINSB equ 7202
TPMINSD equ 7209
TPMINSW equ 7216
TPMINUB equ 7223
TPMINUD equ 7230
TPMINUW equ 7237
TPMOVB2M equ 7244
TPMOVD2M equ 7252
TPMOVDB equ 7260
TPMOVDW equ 7267
TPMOVM2B equ 7274
TPMOVM2D equ 7282
TPMOVM2W equ 7290
TPMOVMSKB equ 7298
TPMOVQ2M equ 7307
TPMOVQB equ 7315
TPMOVQD equ 7322
TPMOVQW equ 7329
TPMOVSDB equ 7336
TPMOVSDW equ 7344
TPMOVSQB equ 7352
TPMOVSQD equ 7360
TPMOVSQW equ 7368
TPMOVSWB equ 7376
TPMOVSXBD equ 7384
TPMOVSXBQ equ 7393
TPMOVSXBW equ 7402
TPMOVSXDQ equ 7411
TPMOVSXWD equ 7420
TPMOVSXWQ equ 7429
TPMOVUSDB equ 7438
TPMOVUSDW equ 7447
TPMOVUSQB equ 7456
TPMOVUSQD equ 7465
TPMOVUSQW equ 7474
TPMOVUSWB equ 7483
TPMOVW2M equ 7492
TPMOVWB equ 7500
TPMOVZXBD equ 7507
TPMOVZXBQ equ 7516
TPMOVZXBW equ 7525
TPMOVZXDQ equ 7534
TPMOVZXWD equ 7543
TPMOVZXWQ equ 7552
TPMULDQ equ 7561
TPMULHRIW equ 7568
TPMULHRSW equ 7577
TPMULHRW equ 7586
TPMULHRWC equ 7594
TPMULHUW equ 7603
TPMULHW equ 7611
TPMULLD equ 7618
TPMULLW equ 7625
TPMULTISHIFTQB equ 7632
TPMULUDQ equ 7646
TPMVGEZB equ 7654
TPMVLZB equ 7662
TPMVNZB equ 7669
TPMVZB equ 7676
TPOP equ 7682
TPOPA equ 7686
TPOPAD equ 7691
TPOPCNT equ 7697
TPOPCNTB equ 7704
TPOPCNTD equ 7712
TPOPCNTW equ 7720
TPOPF equ 7728
TPOR equ 7733
TPPERM equ 7737
TPREFETCH equ 7743
TPREFETCHNTA equ 7752
TPREFETCHT0 equ 7764
TPREFETCHT1 equ 7775
TPREFETCHT2 equ 7786
TPREFETCHW equ 7797
TPREFETCHWT1 equ 7807
TPROLD equ 7819
TPROLQ equ 7825
TPROLVD equ 7831
TPRORD equ 7838
TPRORQ equ 7844
TPRORVD equ 7850
TPROTB equ 7857
TPROTD equ 7863
TPROTQ equ 7869
TPROTW equ 7875
TPSCATTERDD equ 7881
TPSCATTERQD equ 7892
TPSHAB equ 7903
TPSHAD equ 7909
TPSHAQ equ 7915
TPSHAW equ 7921
TPSHLB equ 7927
TPSHLD equ 7933
TPSHLDD equ 7939
TPSHLDVD equ 7946
TPSHLDVW equ 7954
TPSHLDW equ 7962
TPSHLQ equ 7969
TPSHLW equ 7975
TPSHRDD equ 7981
TPSHRDVD equ 7988
TPSHRDVW equ 7996
TPSHRDW equ 8004
TPSHUFB equ 8011
TPSHUFBITQMB equ 8018
TPSHUFD equ 8030
TPSHUFHW equ 8037
TPSHUFLW equ 8045
TPSHUFW equ 8053
TPSIGNB equ 8060
TPSIGND equ 8067
TPSIGNW equ 8074
TPSLLD equ 8081
TPSLLDQ equ 8087
TPSLLQ equ 8094
TPSLLVD equ 8100
TPSLLVW equ 8107
TPSLLW equ 8114
TPSRAD equ 8120
TPSRAQ equ 8126
TPSRAVD equ 8132
TPSRAVW equ 8139
TPSRAW equ 8146
TPSRLD equ 8152
TPSRLDQ equ 8158
TPSRLQ equ 8165
TPSRLVD equ 8171
TPSRLVW equ 8178
TPSRLW equ 8185
TPSUBB equ 8191
TPSUBD equ 8197
TPSUBQ equ 8203
TPSUBSB equ 8209
TPSUBSIW equ 8216
TPSUBSW equ 8224
TPSUBUSB equ 8231
TPSUBUSW equ 8239
TPSUBW equ 8247
TPSWAPD equ 8253
TPTERNLOGD equ 8260
TPTEST equ 8270
TPTESTMB equ 8276
TPTESTMD equ 8284
TPTESTMW equ 8292
TPTESTNMB equ 8300
TPTESTNMD equ 8309
TPTESTNMW equ 8318
TPTWRITE equ 8327
TPUNPCKHBW equ 8335
TPUNPCKHDQ equ 8345
TPUNPCKHQDQ equ 8355
TPUNPCKHWD equ 8366
TPUNPCKLBW equ 8376
TPUNPCKLDQ equ 8386
TPUNPCKLQDQ equ 8396
TPUNPCKLWD equ 8407
TPUSH equ 8417
TPUSHA equ 8422
TPUSHAD equ 8428
TPUSHD equ 8435
TPUSHF equ 8441
TPXOR equ 8447
TPXORD equ 8452
TQWORD equ 8458
TR10B equ 8465
TR10D equ 8470
TR10L equ 8475
TR10W equ 8480
TR11B equ 8485
TR11D equ 8490
TR11L equ 8495
TR11W equ 8500
TR12B equ 8505
TR12D equ 8510
TR12L equ 8515
TR12W equ 8520
TR13B equ 8525
TR13D equ 8530
TR13L equ 8535
TR13W equ 8540
TR14B equ 8545
TR14D equ 8550
TR14L equ 8555
TR14W equ 8560
TR15B equ 8565
TR15D equ 8570
TR15L equ 8575
TR15W equ 8580
TR8B equ 8585
TR8D equ 8589
TR8L equ 8593
TR8W equ 8597
TR9B equ 8601
TR9D equ 8605
TR9L equ 8609
TR9W equ 8613
TRAND equ 8617
TRANGEPS equ 8623
TRANGESS equ 8631
TRAX equ 8639
TRBP equ 8643
TRBX equ 8647
TRCL equ 8651
TRCP14PS equ 8655
TRCP14SS equ 8663
TRCP28PS equ 8671
TRCP28SS equ 8679
TRCPPS equ 8687
TRCPSS equ 8693
TRCR equ 8699
TRCX equ 8703
TRDFSBASE equ 8707
TRDGSBASE equ 8716
TRDI equ 8725
TRDM equ 8729
TRDMSR equ 8733
TRDPID equ 8739
TRDPKRU equ 8745
TRDPMC equ 8752
TRDPRU equ 8758
TRDRAND equ 8764
TRDSEED equ 8771
TRDSHR equ 8778
TRDSSPD equ 8784
TRDSSPQ equ 8791
TRDTSC equ 8798
TRDTSCP equ 8804
TRDX equ 8811
TREDUCEPS equ 8815
TREDUCESS equ 8824
TREP equ 8833
TREPNE equ 8838
TRETF equ 8845
TREX?? equ 8850
TRIP? equ 8857
TRNDSCALEPD equ 8862
TRNDSCALEPS equ 8873
TRNDSCALESD equ 8884
TRNDSCALESS equ 8895
TROL equ 8906
TROR equ 8910
TRORX equ 8914
TROUNDPD equ 8919
TROUNDPS equ 8927
TROUNDSD equ 8935
TROUNDSS equ 8943
TRSDC equ 8951
TRSI equ 8956
TRSLDT equ 8960
TRSM equ 8966
TRSP equ 8970
TRSQRT14PS equ 8974
TRSQRT14SS equ 8984
TRSQRT28PS equ 8994
TRSQRT28SS equ 9004
TRSQRTPS equ 9014
TRSQRTSS equ 9022
TRSTORSSP equ 9030
TRSTS equ 9039
TS6 equ 9044
TS7 equ 9047
TSAHF equ 9050
TSAL equ 9055
TSALC equ 9059
TSAR equ 9064
TSARX equ 9068
TSAVEPREVSSP equ 9073
TSBB equ 9085
TSCALEFPS equ 9089
TSCALEFSS equ 9098
TSCAS equ 9107
TSCASB equ 9112
TSCASD equ 9118
TSCASQ equ 9124
TSCASW equ 9130
TSCATTERDPS equ 9136
TSCATTERPF0DPD equ 9147
TSCATTERPF0DPS equ 9161
TSCATTERPF0QPD equ 9175
TSCATTERPF0QPS equ 9189
TSCATTERPF1DPD equ 9203
TSCATTERPF1DPS equ 9217
TSCATTERPF1QPD equ 9231
TSCATTERPF1QPS equ 9245
TSCATTERQPS equ 9259
TSEGCS equ 9270
TSEGDS equ 9277
TSEGES equ 9284
TSEGFS equ 9291
TSEGGS equ 9298
TSEGSS equ 9305
TSETA equ 9312
TSETB equ 9317
TSETBE equ 9322
TSETG equ 9328
TSETGE equ 9333
TSETL equ 9339
TSETLE equ 9344
TSETNB equ 9350
TSETNO equ 9356
TSETNP equ 9362
TSETNS equ 9368
TSETNZ equ 9374
TSETO equ 9380
TSETP equ 9385
TSETS equ 9390
TSETSSBSY equ 9395
TSETZ equ 9404
TSFENCE equ 9409
TSGDT equ 9416
TSHA1MSG1 equ 9421
TSHA1MSG2 equ 9430
TSHA1NEXTE equ 9439
TSHA1RNDS4 equ 9449
TSHA256MSG1 equ 9459
TSHA256MSG2 equ 9470
TSHA256RNDS2 equ 9481
TSHL equ 9493
TSHLX equ 9497
TSHORT equ 9502
TSHRD equ 9509
TSHRX equ 9514
TSHUFF32X4 equ 9519
TSHUFF64X2 equ 9529
TSHUFI32X4 equ 9539
TSHUFI64X2 equ 9549
TSHUFPD equ 9559
TSHUFPS equ 9566
TSIDT equ 9573
TSIL equ 9578
TSKINIT equ 9582
TSLWPCB equ 9589
TSMI equ 9596
TSMINT equ 9600
TSMINTOLD equ 9606
TSMSW equ 9615
TSPL equ 9620
TSQRTPD equ 9624
TSQRTSD equ 9631
TST?0? equ 9638
TST?1? equ 9644
TST?2? equ 9650
TST?3? equ 9656
TST?4? equ 9662
TST?5? equ 9668
TST?6? equ 9674
TST?7? equ 9680
TST0 equ 9686
TST1 equ 9690
TST3 equ 9694
TST4 equ 9698
TST5 equ 9702
TST6 equ 9706
TST7 equ 9710
TSTAC equ 9714
TSTC equ 9719
TSTGI equ 9723
TSTI equ 9728
TSTMXCSR equ 9732
TSTOS equ 9740
TSTOSB equ 9745
TSTOSD equ 9751
TSTOSQ equ 9757
TSTOSW equ 9763
TSTR equ 9769
TSVDC equ 9773
TSVLDT equ 9778
TSVTS equ 9784
TSWAPGS equ 9789
TSYSCALL equ 9796
TSYSENTER equ 9804
TSYSEXIT equ 9813
TSYSRET equ 9821
TSYSRETQ equ 9828
TT1MSKC equ 9836
TTEST2 equ 9843
TTESTPD equ 9849
TTESTPS equ 9856
TTPAUSE equ 9863
TTR0 equ 9870
TTR1 equ 9874
TTR2 equ 9878
TTR3 equ 9882
TTR4 equ 9886
TTR5 equ 9890
TTR6 equ 9894
TTR7 equ 9898
TTWORD equ 9902
TTZCNT equ 9909
TTZMSK equ 9915
TUCOMISD equ 9921
TUCOMISS equ 9929
TUD0 equ 9937
TUD1 equ 9941
TUD2 equ 9945
TUMONITOR equ 9949
TUMOV equ 9958
TUMWAIT equ 9963
TUNPCKHPD equ 9970
TUNPCKHPS equ 9979
TUNPCKLPD equ 9988
TUNPCKLPS equ 9997
TVERR equ 10006
TVERW equ 10011
TVMCALL equ 10016
TVMCLEAR equ 10023
TVMFUNC equ 10031
TVMLAUNCH equ 10038
TVMLOAD equ 10047
TVMMCALL equ 10054
TVMPTRLD equ 10062
TVMPTRST equ 10070
TVMREAD equ 10078
TVMRESUME equ 10085
TVMRUN equ 10094
TVMSAVE equ 10100
TVMWRITE equ 10107
TVMXOFF equ 10115
TVMXON equ 10122
TWAIT equ 10128
TWBINVD equ 10134
TWBNOINVD equ 10141
TWRFSBASE equ 10150
TWRGSBASE equ 10159
TWRMSR equ 10168
TWRPKRU equ 10174
TWRSHR equ 10181
TWRSSD equ 10187
TWRSSQ equ 10193
TXABORT equ 10199
TXACQUIRE equ 10206
TXADD equ 10216
TXBEGIN equ 10221
TXCRYPTCBC equ 10228
TXCRYPTCFB equ 10238
TXCRYPTCTR equ 10248
TXCRYPTECB equ 10258
TXCRYPTOFB equ 10268
TXEND equ 10278
TXGETBV equ 10283
TXLAT equ 10290
TXLATB equ 10295
TXMM0 equ 10301
TXMM1 equ 10306
TXMM10 equ 10311
TXMM11 equ 10317
TXMM12 equ 10323
TXMM13 equ 10329
TXMM14 equ 10335
TXMM15 equ 10341
TXMM16 equ 10347
TXMM17 equ 10353
TXMM18 equ 10359
TXMM19 equ 10365
TXMM2 equ 10371
TXMM20 equ 10376
TXMM21 equ 10382
TXMM22 equ 10388
TXMM23 equ 10394
TXMM24 equ 10400
TXMM25 equ 10406
TXMM26 equ 10412
TXMM27 equ 10418
TXMM28 equ 10424
TXMM29 equ 10430
TXMM3 equ 10436
TXMM30 equ 10441
TXMM31 equ 10447
TXMM4 equ 10453
TXMM5 equ 10458
TXMM6 equ 10463
TXMM7 equ 10468
TXMM8 equ 10473
TXMM9 equ 10478
TXORPD equ 10483
TXORPS equ 10489
TXRELEASE equ 10495
TXRSTORS equ 10505
TXRSTORS64 equ 10513
TXSAVEC equ 10523
TXSAVEC64 equ 10530
TXSAVEOPT equ 10539
TXSAVEOPT64 equ 10548
TXSAVES equ 10559
TXSAVES64 equ 10566
TXSETBV equ 10575
TXSHA1 equ 10582
TXSHA256 equ 10588
TXSTORE equ 10596
TXTEST equ 10603
TXWORD equ 10609
TYMM0 equ 10616
TYMM1 equ 10621
TYMM10 equ 10626
TYMM11 equ 10632
TYMM12 equ 10638
TYMM13 equ 10644
TYMM14 equ 10650
TYMM15 equ 10656
TYMM16 equ 10662
TYMM17 equ 10668
TYMM18 equ 10674
TYMM19 equ 10680
TYMM2 equ 10686
TYMM20 equ 10691
TYMM21 equ 10697
TYMM22 equ 10703
TYMM23 equ 10709
TYMM24 equ 10715
TYMM25 equ 10721
TYMM26 equ 10727
TYMM27 equ 10733
TYMM28 equ 10739
TYMM29 equ 10745
TYMM3 equ 10751
TYMM30 equ 10756
TYMM31 equ 10762
TYMM4 equ 10768
TYMM5 equ 10773
TYMM6 equ 10778
TYMM7 equ 10783
TYMM8 equ 10788
TYMM9 equ 10793
TYWORD equ 10798
TZEROALL equ 10805
TZEROUPPER equ 10813
TZMM0 equ 10823
TZMM1 equ 10828
TZMM10 equ 10833
TZMM11 equ 10839
TZMM12 equ 10845
TZMM13 equ 10851
TZMM14 equ 10857
TZMM15 equ 10863
TZMM16 equ 10869
TZMM17 equ 10875
TZMM18 equ 10881
TZMM19 equ 10887
TZMM2 equ 10893
TZMM20 equ 10898
TZMM21 equ 10904
TZMM22 equ 10910
TZMM23 equ 10916
TZMM24 equ 10922
TZMM25 equ 10928
TZMM26 equ 10934
TZMM27 equ 10940
TZMM28 equ 10946
TZMM29 equ 10952
TZMM3 equ 10958
TZMM30 equ 10963
TZMM31 equ 10969
TZMM4 equ 10975
TZMM5 equ 10980
TZMM6 equ 10985
TZMM7 equ 10990
TZMM8 equ 10995
TZMM9 equ 11000
TZWORD equ 11005
T?1TO16? equ 11012
T?1TO2? equ 11020
T?1TO4? equ 11027
T?1TO8? equ 11034
T?RD?SAE? equ 11041
T?RN?SAE? equ 11050
T?RU?SAE? equ 11059
T?RZ?SAE? equ 11068
/programs/develop/koldbg/disasm/rtn-62xx.inc
0,0 → 1,556
;-----------------------------------------------------------------------------
BNDEVEX62:
cmp byte [rsi],0xC0
jae EVEX62
;
call GetP0P1P2
jmp EVEX62.Loop
;
.Error: cmp [I.Arch],CPUX64
jz ErrorDec
;
xor al,al
;
mov [I.R],al
mov [I.X],al
mov [I.B],al
mov [I.W],al
mov [I.V],al
mov [I.Z],al
mov [I.BB],al
mov [I.XX],al
mov [I.VVVV],al
mov [I.AAAA],al
;
mov rsi,[I.SaveRSI]
;
BitTR I.Prefixes,P66
cmp [I.Operand],0
mov [I.RandSize],VQWORD+80h ;32:32
jnz R32RM32
mov [I.RandSize],VDWORD+80h ;16:16
jmp R16RM16
;-----------------------------------------------------------------------------
EVEX62: cmp [I.PreREX],0
jnz ErrorDec
call GetP0P1P2
.Loop:
mov [I.Is62],1
 
cmp dword [rbx],-1
jz ErrorDec
cmp al,[rbx+X62.Imm]
je .Found
add ebx,X62.Size
jmp .Loop
.Found:
mov al,[rbx+X62.MOS]
cmp [I.BB],0
jnz .L1
shr al,4
.L1:
and al,0Fh
mov [I.RandSize],al
;
mov eax,dword [rbx+X62.Flags]
mov word [I.FlagsEVEX],ax
;
and ah,EVEXLX shr 8
cmp ah,EVEXLX shr 8
jnz .L2
cmp [I.LL],00b
jnz ErrorDec
jmp .SkipLX
.L2: ;
test ah,EVEXL0 shr 8
jz .L3
cmp [I.LL],00b
jz ErrorDec
.L3: ;
test ah,EVEXLL shr 8
jz .L4
cmp [I.LL],10b
jb ErrorDec
.L4:
;
.SkipLX:
;
mov ah,al
and ah,EVEXW0
cmp ah,EVEXW0
jnz .L5
cmp [I.Arch],CPUX64
jz .SkipWNW
mov [I.W],0
jmp .SkipWNW
.L5: ;
test al,EVEXYW
jz .L6
cmp [I.W],1
jz ErrorDec
.L6: ;
test al,EVEXNW
jz .L7
cmp [I.W],0
jz ErrorDec
.L7:
;
.SkipWNW:
;
test al,EVEXV
jz .L8
mov al,[I.VVVV]
and al,1111b
or al,al
jnz ErrorDec
.L8: ;
mov edx,dword [rbx+X62.Name]
mov al,byte [rbx+X62.Flags+1]
and al,EVEXE shr 8
cmp al,EVEXE shr 8
jnz .L9
movzx eax,[I.W]
movzx edx,dx
add edx,T62Names
mov edx,[rdx+rax*2]
.L9:
mov [I.Prefix],'v'
mov [I.Name],dx
 
cmp [I.W],1
jnz .LA
mov al,byte [rbx+X62.Flags+1]
and al,EVEXE shr 8
cmp al,EVEXE shr 8
jz .LA
test al,EVEXD1 shr 8
ifnz mov [I.LastByte],'d'
test al,EVEXQ1 shr 8
ifnz mov [I.LastByte],'q'
.LA: ;
movzx r8d,word [rbx+X62.Rtn]
add r8d,RtnXX
test [rbx+X62.Flags],EVEX2
jz .LB
movzx eax,[I.W]
movzx r8d,word [r8+rax*2]
add r8d,RtnXX
.LB: ;
call FetchModRM
test byte [I.FlagsEVEX+1],EVEXM shr 8
jz .LC
call GetVectorAndMUL
.LC:
test byte [I.FlagsEVEX+1],EVEXU shr 8
jnz .SkipBB
test byte [I.FlagsEVEX+1],EVEXB shr 8
jz .LD
;
cmp [I.BB],0
jz .LD
.SkipBB:
cmp [I.W],1
jnz .LD
;inc [I.MULT]
inc [I.RandSize]
.LD:
call r8
;
test byte [I.FlagsEVEX+1],EVEXI shr 8
jz .LG
lea r8,[I.Arg1]
mov ecx,5
.LE:
cmp [r8+TArg.Type],0
jz .LF
add r8,sizeof.TArg
loop .LE
ret
.LF:
FetchB
mov [r8+TArg.Type],80h+1
mov [r8+TArg.ImmB],al
.LG: ret
;-----------------------------------------------------------------------------
T6244:
cmp [I.ModRM],3
jz ErrorDec
cmp [I.BB],1
jz ErrorDec
mov [I.RandSize],VOWORD
mov [I.Arg1.Type2nd],InReg
mov [I.Arg2.Type2nd],InVVVV
mov [I.Arg3.Type2nd],InRM or 80h
mov [I.Arg1.Type],al
mov [I.Arg2.Type],al
mov [I.Arg3.Type],ah
ret
;-----------------------------------------------------------------------------
T6214:
call GetRDRQAH
;jmp T6201
;-----------------------------------------------------------------------------
T6201:
mov [I.Arg1.Type2nd],InReg
mov [I.Arg2.Type2nd],InVVVV
mov [I.Arg3.Type2nd],InRM
mov [I.Arg1.Type],al
mov [I.Arg2.Type],al
mov [I.Arg3.Type],ah
ret
;-----------------------------------------------------------------------------
T6215:
mov [I.RandSize],xO
mov ah,XMMRG
jmp T6201
;-----------------------------------------------------------------------------
T6200:
mov [I.RandSize],xD
 
mov [I.Arg1.Type],al
mov [I.Arg1.Type2nd],InReg
mov [I.Arg2.Type],ah
mov [I.Arg2.Type2nd],InRM
 
cmp [I.W],0
jz .L1
 
inc [I.RandSize]
 
dec al
cmp al,XMMRG
jae .L1
mov al,XMMRG
.L1: jmp SetVT3
;-----------------------------------------------------------------------------
T621B:
mov [I.RandSize],xQ
;
cmp [I.W],0
jnz .L1
;
dec [I.RandSize]
;
dec al
cmp al,XMMRG
jae .L1
mov al,XMMRG
;
.L1:
;
mov [I.Arg1.Type],al
mov [I.Arg1.Type2nd],InReg
mov [I.Arg2.Type],ah
mov [I.Arg2.Type2nd],InRM
;
mov al,ah
jmp SetVT3
;-----------------------------------------------------------------------------
T6202:
mov [I.Arg1.Type2nd],InReg
mov [I.Arg2.Type2nd],InVVVV
mov [I.Arg3.Type2nd],InRM
mov [I.Arg1.Type],KXXRG
mov [I.Arg2.Type],al
mov [I.Arg3.Type],ah
ret
;-----------------------------------------------------------------------------
T6219:
cmp [I.Mod],3
jz ErrorDec
;jmp T6203
;-----------------------------------------------------------------------------
T6203:
mov ah,XMMRG
call GetVectorAL
T6204:
mov [I.Arg1.Type2nd],InReg
mov [I.Arg2.Type2nd],InRM
mov [I.Arg1.Type],al
mov [I.Arg2.Type],ah
ret
;-----------------------------------------------------------------------------
T621A:
cmp [I.Mod],3
jz ErrorDec
mov al,ZMMRG
mov ah,XMMRG
jmp T6204
;-----------------------------------------------------------------------------
T6208:
cmp [I.BB],0
jz .L1
dec [I.RandSize]
.L1:
jmp T6204
;-----------------------------------------------------------------------------
T6209:
or byte [I.FlagsEVEX+2],EVEXAA shr 16
;
cmp [I.BB],0
jnz .L1
dec [I.RandSize]
.L1:
T6207:
dec ah
cmp ah,XMMRG
jae .L1
mov ah,XMMRG
.L1: jmp T6204
;-----------------------------------------------------------------------------
T6205:
dec al
cmp al,XMMRG
jae .L1
mov al,XMMRG
.L1:
jmp T6204
;-----------------------------------------------------------------------------
T6206:
cmp [I.W],0
jnz T6204
;
dec [I.RandSize]
;
or byte [I.FlagsEVEX+2],EVEXAA shr 16
;
jmp T6207
;-----------------------------------------------------------------------------
T620A:
dec ah
cmp ah,XMMRG
jae .L1
mov ah,XMMRG
.L1:
T620B:
mov [I.Arg2.Type2nd],InReg
mov [I.Arg1.Type2nd],InRM
mov [I.Arg2.Type],al
mov [I.Arg1.Type],ah
ret
;-----------------------------------------------------------------------------
T6223:
mov al,XMMRG
mov ah,GPR32
jmp T620B
;-----------------------------------------------------------------------------
T6221: mov [I.RandSize],xO
;call DetectMULT
;jmp T6220
;-----------------------------------------------------------------------------
T6220:
mov ah,XMMRG
jmp T620B
;-----------------------------------------------------------------------------
T6222:
mov [I.RandSize],xY
;call DetectMULT
mov ah,YMMRG
jmp T620B
;-----------------------------------------------------------------------------
T620C:
cmp [I.Mod],3
jnz T6201
mov [I.Name],TMOVHLPS
jmp T6201
;-----------------------------------------------------------------------------
T620D:
cmp [I.Mod],3
jz ErrorDec
jmp T6201
;-----------------------------------------------------------------------------
T620E:
cmp [I.Mod],3
jnz .L1
mov [I.Name],TMOVLHPS
.L1: jmp T6201
;-----------------------------------------------------------------------------
T620F:
cmp [I.Mod],3
jz ErrorDec
jmp T620B
;-----------------------------------------------------------------------------
T6210:
cmp [I.Mod],3
jz ErrorDec
jmp T620B
;-----------------------------------------------------------------------------
T621C:
cmp [I.Mod],3
jz ErrorDec
jmp T6204
;-----------------------------------------------------------------------------
T6211:
call GetRDRQAH
jmp T6204
;-----------------------------------------------------------------------------
T6212:
call GetRDRQAH
jmp T620B
;-----------------------------------------------------------------------------
T6213:
call GetRDRQAL
jmp T6204
;-----------------------------------------------------------------------------
T6271:
mov ebx,T0F71N
movzx edx,[I.Reg]
.L0: mov dx,[rdx*2+rbx]
or dx,dx
jz ErrorDec
mov [I.Name],dx
mov [I.Arg1.Type2nd],InVVVV
mov [I.Arg2.Type2nd],InRM
mov [I.Arg1.Type],al
mov [I.Arg2.Type],ah
ret
;-----------------------------------------------------------------------------
T6272:
mov ebx,T0F72N
.L0: movzx edx,[I.Reg]
cmp [I.W],1
jnz .L1
add dl,8
.L1: jmp T6271.L0
;-----------------------------------------------------------------------------
T6273:
mov ebx,T0F73N
jmp T6272.L0
;-----------------------------------------------------------------------------
T6216:
cmp [I.VVVV],00000b
jnz T6201
jmp T6203
;-----------------------------------------------------------------------------
T6217:
cmp [I.VVVV],00000b
jnz T6201
jmp T620B
;-----------------------------------------------------------------------------
T6218:
cmp al,XMMRG
jz .L1
inc [I.RandSize]
.L1: jmp T6204
;-----------------------------------------------------------------------------
T62RD: call GetRDRQAH
jmp T62RB.L0
;-----------------------------------------------------------------------------
T62RW: mov ah,GPR16
jmp T62RB.L0
;-----------------------------------------------------------------------------
T62RB: mov ah,GPR08
.L0: cmp [I.Mod],3
jnz ErrorDec
call GetVectorAL
mov [I.XX],0
jmp T6204
;-----------------------------------------------------------------------------
T62V1XYZ:
mov [I.RandSize],xD
;
cmp [I.W],0
jz .L1
;
inc [I.RandSize]
;
dec al
cmp al,XMMRG
jae .L1
mov al,XMMRG
.L1: ;
call SetVT3
;
mov [I.Arg1.Type2nd],InRM
mov [I.Arg2.Type2nd],InReg
mov [I.Arg1.Type],ah
;
mov dl,[I.RandSize]
call GetVectorAndMUL
mov [I.RandSize],dl
mov [I.Arg2.Type],al
ret
;-----------------------------------------------------------------------------
T62V2XYZ:
mov [I.RandSize],xQ
;
cmp [I.W],0
jnz .L1
;
dec [I.RandSize]
;
dec al
cmp al,XMMRG
jae .L1
mov al,XMMRG
;
.L1: push rax
mov al,ah
call SetVT3
pop rax
;
mov [I.Arg1.Type2nd],InRM
mov [I.Arg2.Type2nd],InReg
mov [I.Arg1.Type],ah
mov [I.Arg2.Type],al
ret
;-----------------------------------------------------------------------------
T62XYZVV1:
movzx edx,[I.Reg]
cmp [I.W],0
jz .L1
add dl,8
.L1:
mov edx,[rdx*2+T??C6N]
or dx,dx
jz ErrorDec
mov [I.Name],dx
 
mov al,ZMMRG
cmp [I.W],0
jz .L2
mov al,YMMRG
.L2:
mov [I.Arg1.Type],ah
mov [I.Arg1.Type2nd],InRM
jmp SetVT3
;-----------------------------------------------------------------------------
T62XYZVV2:
movzx edx,[I.Reg]
cmp [I.W],0
jz .L1
add dl,8
.L1:
mov edx,[rdx*2+T??C7N]
or dx,dx
jz ErrorDec
mov [I.Name],dx
mov al,ZMMRG
 
mov [I.Arg1.Type],ah
mov [I.Arg1.Type2nd],InRM
jmp SetVT3
;-----------------------------------------------------------------------------
T621D:
cmp [I.Mod],3
jnz ErrorDec
mov ah,KXXRG
jmp T6204
;-----------------------------------------------------------------------------
T621E:
cmp [I.Mod],3
jnz ErrorDec
T621F:
mov al,KXXRG
jmp T6204
;-----------------------------------------------------------------------------
T6224:
mov [I.RandSize],xO
mov ah,XMMRG
jmp T6225.L0
;-----------------------------------------------------------------------------
T6225:
mov [I.RandSize],xY
mov ah,YMMRG
.L0: jmp T6201
;-----------------------------------------------------------------------------
/programs/develop/koldbg/disasm/rtn-c4c5.inc
0,0 → 1,975
r8d equ edi
r8 equ rdi
;-----------------------------------------------------------------------------
R32RM32C5:
mov eax,R32RM32
jmp R16RM16C5.1
R16RM16C5:
mov eax,R16RM16
.1: cmp byte [rsi],0xC0
jae RtnAVX2C5
or byte [I.Flags],_O
and byte [I.Prefixes],not (bit P66)
jmp rax
 
RtnAVX2C5:
;F0/66/F2/F3/REX then #UD
test byte [I.Prefixes],bit PF0+bit P66+bit PF2+bit PF3+bit P4X
jnz ErrorDec
 
FetchB
mov [I.VEX],al
and [I.VEX],7Fh ;clear VEX.R
 
mov ah,al
and al,10000000b
xor al,10000000b
shr al,5 ;REX.R
jz .L1
 
cmp [IgnoreInvalid],True
je .L1
cmp [I.Arch],CPUX64
jne ErrorDec
.L1:
mov [I.PreREX],al
call SetMagicBytes
 
mov [I.P],1
 
mov al,ah
and al,01111000b ;vvvv
xor al,01111000b
shr al,3
 
cmp [IgnoreInvalid],True
je .L2
cmp al,7
jbe .L2
cmp [I.Arch],CPUX64
jne ErrorDec
.L2:
mov [I.VVVV],al
mov al,ah
and eax,11b ;pp
;mov [PP],al
mov edx,[rax*4+C4C5Tab]
mov edi,[rax*3+CMPSuffixesX]
jmp C4C5XX
;-----------------------------------------------------------------------------
R32RM32C4:
mov eax,R32RM32
jmp R16RM16C4.1
R16RM16C4:
mov eax,R16RM16
.1: cmp byte [rsi],0xC0
jae RtnAVX2C4
or byte [I.Flags],_O
and byte [I.Prefixes],not (bit P66)
jmp rax
RtnAVX2C4:
mov [I.RandSize],0
;F0/66/F2/F3/REX then #UD
test byte [I.Prefixes],bit PF0+bit P66+bit PF2+bit PF3+bit P4X
jnz ErrorDec
 
FetchB
mov ah,al
;and al,11100000b
xor al,11100000b
shr al,5 ;REX.RXB
jz .L1
 
cmp [IgnoreInvalid],True
je .L1
cmp [I.Arch],CPUX64
jne ErrorDec
.L1:
mov [I.PreREX],al
call SetMagicBytes
 
mov [I.P],1
 
mov al,ah
and al,11111b
mov [I.MMMMM],al ;mmmmm
 
FetchB
mov ah,al
mov [I.VEX],al
and al,01111000b ;vvvv
xor al,01111000b
shr al,3
 
cmp [IgnoreInvalid],True
je .L2
cmp al,7
jbe .L2
cmp [I.Arch],CPUX64
jne ErrorDec
.L2:
mov [I.VVVV],al
mov al,ah
and eax,11b ;pp
;mov [PP],al
 
mov edx,[rax*4+C4C5Tab]
mov ebx,[rax*4+C438Tab]
mov ecx,[rax*4+C43ATab]
mov edi,[rax*3+CMPSuffixesX]
 
mov al,[I.MMMMM]
or al,al
jz ErrorDec
cmp al,00011b
ja ErrorDec
;cmp al,00011b
jne .L3
mov edx,ecx
.L3:
cmp al,00010b
jne .L4
mov edx,ebx
.L4:
 
C4C5XX:
mov word [I.Suffix3rd],di
FetchB
mov [I.AfterVEX],al
 
mov [I.SaveRSI],rsi
.L1:
cmp dword [rdx],-1
jz ErrorDec
cmp al,[rdx+CXX.Imm]
jz .L2
add edx,CXX.Size
jmp .L1
.L2:
mov eax,dword [rdx+CXX.Flags]
mov word [I.FlagsVEX],ax
 
mov cl,VEXL
 
and al,cl
mov ah,[I.VEX]
and ah,al
jnz ErrorDec
 
test [I.FlagsVEX],VEXN
jz .L3
mov ah,[I.VEX]
and ah,cl
jz ErrorDec
.L3:
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
test [I.FlagsVEX+1],VEXG shr 8
jz .L4
xor cl,cl
cmp [I.Arch],CPUX64
jne .L4
mov cl,VEXW
.L4:
mov al,[rdx+CXX.MOS]
test [I.VEX],cl
jz .L5
shr al,4
.L5: and al,0Fh
mov [I.RandSize],al
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
mov al,byte [rdx+CXX.Flags]
and al,VEXW
mov ah,[I.VEX]
 
cmp [I.Arch],CPUX64
je .L6
test [I.FlagsVEX+1],VEXC shr 8
jnz .L6
test ah,VEXW
jnz ErrorDec
.L6:
and ah,al
jnz ErrorDec
 
mov al,byte [rdx+CXX.Flags]
and al,VEXV
jz .L7
cmp [I.VVVV],0 ;!1111b=0000b
jnz ErrorDec
.L7:
movzx r8d,[rdx+CXX.Rtn]
add r8d,RtnXX
 
mov edx,dword [rdx+CXX.Name]
test [I.FlagsVEX+1],VEXH shr 8
jnz .L8
mov [I.Prefix],'v'
.L8: mov [I.Name],dx
 
test [I.FlagsVEX+1],VEXF shr 8
jnz .L9
call FetchModRM
.L9:
test [I.FlagsVEX+1],VEXR shr 8
jz .LA
cmp [I.Mod],3
jnz ErrorDec
.LA:
cmp [I.Mod],3
jnz .LB
test [I.FlagsVEX],VEXM
jnz ErrorDec
.LB: jmp r8
 
RtnC4C5:
lea r8,[I.Arg1]
 
mov al,XMMRG
test [I.VEX],VEXL
jz .L1
mov al,YMMRG
.L1: mov ah,al
 
test [I.FlagsVEX+1],VEX2 shr 8
jz .L2
mov ah,XMMRG
.L2:
test [I.FlagsVEX+1],VEX1 shr 8
jz .L3
mov al,XMMRG
.L3:
test [I.FlagsVEX+1],VEXG shr 8
jz .L4
mov ax,GPR32 by GPR32
cmp [I.Arch],CPUX64
jne .L4
test [I.VEX],VEXW
jz .L4
mov ax,GPR64 by GPR64
.L4:
push rax
test [I.FlagsVEX+1],VEXS shr 8
jnz .NDD
mov [r8+TArg.Type],al
mov [r8+TArg.Type2nd],InReg
add r8d,sizeof.TArg
.NDD:
mov al,XMMRG
test [I.VEX],VEXL
jz .L5
mov al,YMMRG
.L5:
test [I.FlagsVEX+1],VEXG shr 8
jz .L6
mov al,GPR32
cmp [I.Arch],CPUX64
jne .L6
test [I.VEX],VEXW
jz .L6
mov al,GPR64
.L6:
test [I.FlagsVEX],VEXV
jnz .L7
mov [r8+TArg.Type],al
mov [r8+TArg.Type2nd],InVVVV
add r8d,sizeof.TArg
.L7: pop rax
 
;cmp [I.Mod],3
;setnz [r8+TArg.Mem]
mov dl,ah
mov [r8+TArg.Type],dl
mov [r8+TArg.Type2nd],InRM
add r8d,sizeof.TArg
 
test [I.FlagsVEX],VEXI
jnz .Imm
 
test [I.FlagsVEX],VEX8
jz .L8
movzx eax,byte [rsi]
cmp al,1Fh
ja .Imm
FetchB
 
cmp [I.AfterVEX],0xC2
jne .L8
mov edx,[rax*2+CMPxxNames]
mov [I.Name],dx
mov eax,dword [I.Suffix3rd]
mov dword [I.Suffix2nd],eax
ret
 
.Imm: FetchB
mov [r8+TArg.Type],80h+1
mov [r8+TArg.ImmB],al
ret
.L8:
test [I.FlagsVEX],VEX4
jnz .L9
ret
.L9:
FetchB
shr al,4
 
cmp [IgnoreInvalid],True
je .LA
cmp [I.Arch],CPUX64
je .LA
and al,111b
.LA: mov [r8+TArg.Reg],al
mov [r8+TArg.Type],XMMRG
test [I.VEX],VEXL
jz .LB
mov [r8+TArg.Type],YMMRG
.LB: ret
;-----------------------------------------------------------------------------
RtnC401:
;cmp [I.Mod],3
;setnz [I.Arg2.Mem]
mov [I.Arg2.Type],XMMRG
mov [I.Arg2.Type2nd],InRM
 
mov [I.Arg1.Type],XMMRG
mov [I.Arg1.Type2nd],InReg
 
test [I.VEX],VEXL
jz .L1
mov [I.Arg1.Type],YMMRG
.L1: ret
;-----------------------------------------------------------------------------
RtnC404:test [I.VEX],VEXW
jz .L1
mov [I.LastByte],'q'
.L1: ;jmp RtnC402
;-----------------------------------------------------------------------------
RtnC402:mov al,XMMRG
test [I.VEX],VEXL
jz .L1
mov al,YMMRG
.L1:
;cmp [I.Mod],3
;setnz [I.Arg1.Mem]
mov [I.Arg1.Type],al
mov [I.Arg1.Type2nd],InRM
mov [I.Arg2.Type],al
mov [I.Arg2.Type2nd],InVVVV
mov [I.Arg3.Type],al
mov [I.Arg3.Type2nd],InReg
ret
;-----------------------------------------------------------------------------
RtnC403:test [I.VEX],VEXW
jz .L1
mov [I.LastByte],'q'
.L1: jmp RtnC4C5
;-----------------------------------------------------------------------------
;-----------------------------------------------------------------------------
RtnC405:test [I.VEX],VEXW
jz .L1
mov [I.LastByte],'q'
.L1: ;jmp RtnC4VT
;-----------------------------------------------------------------------------
RtnC4VT:mov al,XMMRG
test [I.VEX],VEXL
jz .L1
mov al,YMMRG
.L1: call SetVT
 
;cmp [I.Mod],3
;setnz [I.Arg2.Mem]
mov [I.Arg2.Type],al
mov [I.Arg2.Type2nd],InRM
mov [I.Arg1.Type],al
mov [I.Arg1.Type2nd],InReg
mov [I.Arg3.Type],al
mov [I.Arg3.Type2nd],InVVVV
ret
;-----------------------------------------------------------------------------
RtnC406:call RtnC4VT
mov ax,'ps'
test [I.VEX],VEXW
jz .L1
mov ah,'d' ;'pd'
.L1: mov word [I.Suffix2nd],ax
ret
;-----------------------------------------------------------------------------
RtnC407:call RtnC4C5
mov ax,'ps'
test [I.VEX],VEXW
jz .L1
mov ah,'d' ;'pd'
.L1: mov word [I.Suffix2nd],ax
ret
;-----------------------------------------------------------------------------
RtnC408:test [I.VEX],VEXW
jz .L1
mov [I.RandSize],xQ
.L1: call RtnC4C5
mov ax,'ss'
test [I.VEX],VEXW
jz .L2
mov ah,'d' ;'sd'
.L2: mov word [I.Suffix2nd],ax
ret
;-----------------------------------------------------------------------------
RtnC409:
mov al,GPR32
cmp [I.Arch],CPUX64
jne .L1
test [I.VEX],VEXW
jz .L1
mov al,GPR64
.L1:
mov [I.Arg1.Type],al
mov [I.Arg1.Type2nd],InReg
;cmp [I.Mod],3
;setnz [I.Arg2.Mem]
mov [I.Arg2.Type],al
mov [I.Arg2.Type2nd],InRM
mov [I.Arg3.Type],al
mov [I.Arg3.Type2nd],InVVVV
ret
;-----------------------------------------------------------------------------
RtnC40A:
test [I.VEX],VEXW
jz .L0
mov [I.LastByte],'w'
.L0:
mov al,KXXRG
mov [I.Arg1.Type],al
mov [I.Arg1.Type2nd],InReg
mov [I.Arg2.Type],al
mov [I.Arg2.Type2nd],InRM
FetchB
mov [I.Arg3.Type],80h+1
mov [I.Arg3.ImmB],al
ret
;-----------------------------------------------------------------------------
RtnC40B:
test [I.VEX],VEXW
jz .L0
mov [I.LastByte],'q'
.L0: jmp RtnC40A.L0
;-----------------------------------------------------------------------------
RtnC40C:
;cmp [I.Mod],3
;setnz [I.Arg1.Mem]
mov [I.Arg1.Type],XMMRG
mov [I.Arg1.Type2nd],InRM
 
mov [I.Arg2.Type],YMMRG
mov [I.Arg2.Type2nd],InReg
.L1:
FetchB
mov [I.Arg3.Type],80h+1
mov [I.Arg3.ImmB],al
ret
;-----------------------------------------------------------------------------
RtnC40D:
;cmp [I.Mod],3
;setnz [I.Arg1.Mem]
mov [I.Arg1.Type],XMMRG
mov [I.Arg1.Type2nd],InRM
 
mov al,XMMRG
test [I.XOP],XOPL
jz .L1
mov al,YMMRG
.L1:
mov [I.Arg2.Type],al
mov [I.Arg2.Type2nd],InReg
jmp RtnC40C.L1
;-----------------------------------------------------------------------------
RtnC40F:
mov al,GPR64
cmp [I.Arch],CPUX64
jne RtnC40E.L1
test [I.VEX],VEXW
jnz RtnC40E.L2
RtnC40E:
.L1: mov al,GPR32
.L2:
mov [I.Arg1.Type],al
mov [I.Arg1.Type2nd],InRM
mov [I.Arg2.Type],XMMRG
mov [I.Arg2.Type2nd],InReg
jmp RtnC40C.L1
;-----------------------------------------------------------------------------
RtnC410:
mov [I.Arg1.Type],YMMRG
mov [I.Arg1.Type2nd],InReg
mov [I.Arg2.Type],YMMRG
mov [I.Arg2.Type2nd],InVVVV
;cmp [I.Mod],3
;setnz [I.Arg3.Mem]
mov [I.Arg3.Type],XMMRG
mov [I.Arg3.Type2nd],InRM
FetchB
mov [I.Arg4.Type],80h+1
mov [I.Arg4.ImmB],al
ret
;-----------------------------------------------------------------------------
RtnCLMUL:
call RtnC4C5
movzx eax,byte [rsi-1]
cmp al,18
ja .L1
mov edx,[rax*2+TabCLMUL]
or dx,dx
jz .L1
mov [I.Name],dx
mov [I.Arg4.Type],0 ;Delete
.L1: ret
;-----------------------------------------------------------------------------
C40F3A48:
mov ebx,TPERMIL2PSX
jmp C40F3A49.L1
;-----------------------------------------------------------------------------
C40F3A49:
mov ebx,TPERMIL2PDX
.L1:
mov al,XMMRG
test [I.VEX],VEXL
jz .L2
mov al,YMMRG
.L2:
mov [I.Arg1.Type],al
mov [I.Arg1.Type2nd],InReg
mov [I.Arg2.Type],al
mov [I.Arg2.Type2nd],InVVVV
mov [I.Arg3.Type],al
mov [I.Arg4.Type],al
FetchB
mov dl,al
shr dl,4
 
cmp [IgnoreInvalid],True
je .L3
cmp [I.Arch],CPUX64
je .L3
and dl,111b
.L3:
lea r8,[I.Arg3]
test [I.VEX],VEXW
jnz .L7
lea r8,[I.Arg4]
.L7: mov [r8+TArg.Reg],dl
 
and eax,1111b
 
cmp al,0011b
ja .L4
mov edx,[rax*2+rbx]
mov [I.Name],dx
jmp .L5
.L4:
mov [I.Arg5.Type],80h+1
mov [I.Arg5.ImmB],al
.L5:
lea r8,[I.Arg4]
test [I.VEX],VEXW
jnz .L6
lea r8,[I.Arg3]
.L6:
mov [r8+TArg.Type2nd],InRM
;cmp [I.Mod],3
;setnz [r8+TArg.Mem]
ret
;-----------------------------------------------------------------------------
RtnC411:
call RM32R32M
mov [I.Arg2.Type],XMMRG
test [I.VEX],VEXW
jz .L1
cmp [I.Arch],CPUX64
jnz ErrorDec
mov [I.Arg1.Type],GPR64
mov [I.RandSize],VQWORD+80h
mov [I.LastByte],'q'
.L1: jmp RtnC40C.L1
;-----------------------------------------------------------------------------
RtnC413:
push RtnPINSR?
RtnC412:
mov [I.Arg1.Type],XMMRG
mov [I.Arg1.Type2nd],InReg
mov [I.Arg2.Type],XMMRG
mov [I.Arg2.Type2nd],InVVVV
;cmp [I.Mod],3
;setnz [I.Arg3.Mem]
mov [I.Arg3.Type],GPR32
mov [I.Arg3.Type2nd],InRM
FetchB
mov [I.Arg4.Type],80h+1
mov [I.Arg4.ImmB],al
ret
;-----------------------------------------------------------------------------
RtnC414:
;cmp [I.Mod],3
;setnz [I.Arg1.Mem]
mov [I.Arg2.Type],YMMRG
mov [I.Arg2.Type2nd],InRM
 
mov [I.Arg1.Type],YMMRG
mov [I.Arg1.Type2nd],InReg
jmp RtnC40C.L1
;-----------------------------------------------------------------------------
C4FMA: mov al,XMMRG
test [I.VEX],VEXL
jz .L1
mov al,YMMRG
.L1:
mov [I.Arg1.Type],al
mov [I.Arg2.Type],al
mov [I.Arg3.Type],al
mov [I.Arg4.Type],al
FetchB
shr al,4
 
mov [I.Arg1.Type2nd],InReg
mov [I.Arg2.Type2nd],InVVVV
 
lea r8,[I.Arg3]
test [I.VEX],VEXW
jnz .L2
lea r8,[I.Arg4]
.L2:
mov [r8+TArg.Reg],al
 
lea r8,[I.Arg4]
test [I.VEX],VEXW
jnz .L3
lea r8,[I.Arg3]
.L3:
;cmp [I.Mod],3
;setnz [r8+TArg.Mem]
mov [r8+TArg.Type2nd],InRM
ret
;-----------------------------------------------------------------------------
RtnC415:
movzx eax,[I.Reg]
mov edx,[rax*2+BMI1]
or dx,dx
jz ErrorDec
mov [I.Name],dx
mov [I.Prefix],0
 
mov al,GPR32
cmp [I.Arch],CPUX64
jne .L1
test [I.VEX],VEXW
jz .L1
mov al,GPR64
.L1:
mov [I.Arg2.Type],al
mov [I.Arg1.Type],al
 
;cmp [I.Mod],3
;setnz [I.Arg2.Mem]
mov [I.Arg2.Type2nd],InRM
mov [I.Arg1.Type2nd],InVVVV
ret
;-----------------------------------------------------------------------------
RtnC416:
call R32RM32M
 
cmp [I.Arch],CPUX64
jne .L1
test [I.VEX],VEXW
jz .L1
mov [I.Arg1.Type],GPR64
mov [I.Arg2.Type],GPR64
.L1: jmp RtnC40C.L1
;-----------------------------------------------------------------------------
RtnC4C508:
test [I.VEX],VEXW
jz .L1
mov [I.Name],TKUNPCKDQ
.L1: jmp RtnC4C502.L0
;-----------------------------------------------------------------------------
RtnC4C501:
test [I.VEX],VEXW
jz .L0
mov [I.LastByte],'q'
.L0: jmp RtnC4C502.L0
;-----------------------------------------------------------------------------
RtnC4C502:
test [I.VEX],VEXW
jz .L0
mov [I.LastByte],'d'
.L0: ;
cmp [I.Mod],3
jnz ErrorDec
;
mov al,KXXRG
mov [I.Arg1.Type],al
mov [I.Arg2.Type],al
mov [I.Arg3.Type],al
 
mov [I.Arg1.Type2nd],InReg
mov [I.Arg2.Type2nd],InVVVV
;cmp [I.Mod],3
;setnz [I.Arg3.Mem]
mov [I.Arg3.Type2nd],InRM
ret
;-----------------------------------------------------------------------------
RtnC4C503:
test [I.VEX],VEXW
jz .L0
mov [I.LastByte],'d'
.L0: jmp RtnC4C505.L0
;-----------------------------------------------------------------------------
RtnC4C504:
cmp [I.Mod],3
jnz ErrorDec
RtnC4C505:
test [I.VEX],VEXW
jz .L0
mov [I.LastByte],'q'
.L0:
mov al,KXXRG
mov [I.Arg1.Type],al
mov [I.Arg2.Type],al
 
mov [I.Arg1.Type2nd],InReg
;cmp [I.Mod],3
;setnz [I.Arg2.Mem]
mov [I.Arg2.Type2nd],InRM
ret
;-----------------------------------------------------------------------------
RtnC4C506:
cmp [I.Mod],3
jz ErrorDec
test [I.VEX],VEXW
jz .L0
mov [I.LastByte],'d'
.L0:
mov al,KXXRG
mov [I.Arg1.Type],al
mov [I.Arg2.Type],al
 
mov [I.Arg2.Type2nd],InReg
;cmp [I.Mod],3
;setnz [I.Arg1.Mem]
mov [I.Arg1.Type2nd],InRM
ret
;-----------------------------------------------------------------------------
RtnC4C507:
cmp [I.Mod],3
jz ErrorDec
test [I.VEX],VEXW
jz .L0
mov [I.LastByte],'q'
.L0:
jmp RtnC4C506.L0
;-----------------------------------------------------------------------------
RtnC4C509:
cmp [I.Mod],3
jnz ErrorDec
mov al,GPR32
test [I.VEX],VEXW
jz .L0
mov [I.LastByte],'q'
mov al,GPR64
.L0:
mov [I.Arg1.Type],KXXRG
mov [I.Arg1.Type2nd],InReg
mov [I.Arg2.Type],al
mov [I.Arg2.Type2nd],InRM
ret
;-----------------------------------------------------------------------------
RtnC4C50A:
cmp [I.Mod],3
jnz ErrorDec
mov al,GPR32
test [I.VEX],VEXW
jz .L0
mov [I.LastByte],'q'
mov al,GPR64
.L0:
mov [I.Arg2.Type],KXXRG
mov [I.Arg2.Type2nd],InRM
mov [I.Arg1.Type2nd],InReg
mov [I.Arg1.Type],al
ret
;-----------------------------------------------------------------------------
RtnC4C50B:
cmp [I.Reg],2 ;/2
jb ErrorDec
cmp [I.Reg],3 ;/3
ja ErrorDec
jne .L1
mov [I.Name],TSTMXCSR
.L1:
;cmp [I.Mod],3
;setnz [I.Arg1.Mem]
mov [I.Arg1.Type2nd],InRM
mov [I.Arg1.Type],GPR32
ret
;-----------------------------------------------------------------------------
RtnC4C50C:
mov al,XMMRG
test [I.VEX],VEXL
jz .L1
mov al,YMMRG
.L1:
;cmp [I.Mod],3
;setnz [I.Arg1.Mem]
mov [I.Arg1.Type2nd],InRM
mov [I.Arg2.Type2nd],InReg
mov [I.Arg1.Type],al
mov [I.Arg2.Type],al
ret
;-----------------------------------------------------------------------------
C4C5NB2:
mov dx,TMOVLHPS
jmp C4C5NB1.L1
;-----------------------------------------------------------------------------
C4C5NB1:mov dx,TMOVHLPS
.L1: cmp [I.Mod],3
jne .L2
mov [I.Name],dx
.L2: jmp RtnC4C5
;-----------------------------------------------------------------------------
RtnC4C50D:
mov ah,XMMRG
test [I.VEX],VEXL
jz .L1
mov ah,YMMRG
.L1:
mov al,GPR32
cmp [I.Arch],CPUX64
jnz .L2
mov al,GPR64
.L2:
mov [I.Arg1.Type2nd],InReg
mov [I.Arg2.Type2nd],InRM
mov [I.Arg1.Type],al
mov [I.Arg2.Type],ah
ret
;-----------------------------------------------------------------------------
RtnC4C50E:
test [I.VEX],VEXL
jnz .L1
mov [I.Name],TZEROUPPER
.L1: ret
;-----------------------------------------------------------------------------
RtnC4C5XRM:
mov al,XMMRG
mov ah,GPR32
test [I.VEX],VEXW
jz .L1
cmp [I.Arch],CPUX64
jnz ErrorDec
mov [I.LastByte],'q'
mov ah,GPR64
.L1:
mov [I.Arg1.Type2nd],InReg
mov [I.Arg2.Type2nd],InRM
mov [I.Arg1.Type],al
mov [I.Arg2.Type],ah
ret
;-----------------------------------------------------------------------------
RtnC4C5RMX:
mov al,XMMRG
mov ah,GPR32
test [I.VEX],VEXW
jz .L1
cmp [I.Arch],CPUX64
jnz ErrorDec
mov [I.LastByte],'q'
mov ah,GPR64
.L1:
mov [I.Arg2.Type2nd],InReg
mov [I.Arg1.Type2nd],InRM
mov [I.Arg2.Type],al
mov [I.Arg1.Type],ah
ret
;-----------------------------------------------------------------------------
RtnC4C50F:
mov al,GPR64
cmp [I.Arch],CPUX64
jz .L1
mov al,GPR32
.L1:
mov [I.Arg1.Type],al
mov [I.Arg2.Type],XMMRG
mov [I.Arg1.Type2nd],InReg
mov [I.Arg2.Type2nd],InRM
jmp RtnC40C.L1
;-----------------------------------------------------------------------------
C4C50F71:
mov edx,T0F71Names
jmp C4C5NDSX
;-----------------------------------------------------------------------------
C4C50F72:
mov edx,T0F72Names
jmp C4C5NDSX
;-----------------------------------------------------------------------------
C4C50F73:
mov edx,T0F73Names
C4C5NDSX:
movzx eax,[I.Reg]
mov edx,[rdx+rax*2]
or dx,dx
jz ErrorDec
mov [I.Name],dx
jmp RtnC4C5
;-----------------------------------------------------------------------------
RtnC4C510:
mov al,YMMRG
test [I.VEX],VEXL
jnz .L1
mov al,XMMRG
.L1:
mov [I.Arg1.Type],al
mov [I.Arg1.Type2nd],InReg
mov [I.Arg2.Type],al
mov [I.Arg2.Type2nd],InVVVV
mov [I.Arg3.Type],XMMRG
mov [I.Arg3.Type2nd],InRM
ret
;-----------------------------------------------------------------------------
RtnC4C511:
mov al,GPR32
test [I.VEX],VEXW
jz .L1
cmp [I.Arch],CPUX64
jnz ErrorDec
mov al,GPR64
.L1:
mov [I.Arg1.Type],al
mov [I.Arg1.Type2nd],InReg
mov [I.Arg2.Type],XMMRG
mov [I.Arg2.Type2nd],InRM
ret
;-----------------------------------------------------------------------------
RtnC4C512:
mov al,GPR32
test [I.VEX],VEXW
jz .L1
cmp [I.Arch],CPUX64
jnz ErrorDec
mov [I.RandSize],VQWORD
mov al,GPR64
.L1:
mov [I.Arg1.Type],XMMRG
mov [I.Arg1.Type2nd],InReg
mov [I.Arg2.Type],XMMRG
mov [I.Arg2.Type2nd],InVVVV
mov [I.Arg3.Type],al
mov [I.Arg3.Type2nd],InRM
ret
;-----------------------------------------------------------------------------
C4C5MXJ:cmp [I.Mod],3
jz RtnC4C5
cmp [I.VVVV],0 ;!1111b=0000b
jnz ErrorDec
jmp RtnC4C50C
;-----------------------------------------------------------------------------
C4C5XMJ:cmp [I.Mod],3
jz .L1
or [I.FlagsVEX],VEXV
cmp [I.VVVV],0 ;!1111b=0000b
jnz ErrorDec
.L1: jmp RtnC4C5
/programs/develop/koldbg/disasm/scanitem.inc
0,0 → 1,50
 
CntItems = 0
 
ScanItems = 1 ;must be >0, temporary equal 0
 
EleSize = 6 ;xxh.Size
 
virtual at 0
Vals::
rb 64*1024
end virtual
 
macro AddElement Source
{
local A,B,C,Index,Found
C = 0
Index = 0
Found = 0
if ScanItems
repeat CntItems
Found = 0
load B fword from Vals:+(%-1)*EleSize+C
load A fword from Source+C
if A=B
Found = %
Break
else
Found = 0
end if
end repeat
end if
if ~Found
load A fword from Source+C
store fword A at Vals:+CntItems*EleSize+C
dw (CntItems)*EleSize
CntItems = CntItems+1
else
dw (Found-1)*EleSize
end if
}
 
macro CpyElements Dst
{
local A
Dst rb CntItems*EleSize
repeat CntItems
load A fword from Vals:(%-1)*EleSize
store fword A at Dst+(%-1)*EleSize
end repeat
}
/programs/develop/koldbg/disasm/selbat.inc
0,0 → 1,2375
InstTab:
;00
xx TADD,RM8R8,VBYTE,,_S+_O+_XA+_XR
xx TADD,RM8R8,VBYTE,,_S+_O+_XA+_XR
xx TADD,RM8R8,VBYTE,,_S+_O+_XA+_XR
;01
xx TADD,RM16R16, VWORD,,_S+_O+_R+_R64+_XA+_XR
xx TADD,RM32R32,VDWORD,,_S+_O+_R+_R64+_XA+_XR
xx TADD,RM64R64,VQWORD,,_S+_R48+_O+_R+_R64+_XA+_XR
;02
xx TADD,R8RM8,VBYTE,,_S+_O
xx TADD,R8RM8,VBYTE,,_S+_O
xx TADD,R8RM8,VBYTE,,_S+_O
;03
xx TADD,R16RM16, VWORD,,_S+_O+_R+_R64
xx TADD,R32RM32,VDWORD,,_S+_O+_R+_R64
xx TADD,R64RM64,VQWORD,,_S+_R48+_O+_R+_R64
;04
xx TADD,R8I08,VBYTE,RACC,_S
xx TADD,R8I08,VBYTE,RACC,_S
xx TADD,R8I08,VBYTE,RACC,_S
;05
xx TADD,R16I16, VWORD,RACC,_S+_R+_R64
xx TADD,R32I32,VDWORD,RACC,_S+_R+_R64
xx TADD,R64I32,VQWORD,RACC,_S+_R48+_R+_R64
;06
xx TPUSH,AddPointW, VWORD,RES,_S+_A+_R
xx TPUSH,AddPointD,VDWORD,RES,_S+_A+_R
xx TNULL,ErrorDec ,,,
;07
xx TPOP,AddPointW, VWORD,RES,_S+_A+_R
xx TPOP,AddPointD,VDWORD,RES,_S+_A+_R
xx TNULL,ErrorDec,,,
;08
xx TOR,RM8R8,VBYTE,,_S+_O+_XA+_XR
xx TOR,RM8R8,VBYTE,,_S+_O+_XA+_XR
xx TOR,RM8R8,VBYTE,,_S+_O+_XA+_XR
;09
xx TOR,RM16R16, VWORD,,_S+_O+_R+_R64+_XA+_XR
xx TOR,RM32R32,VDWORD,,_S+_O+_R+_R64+_XA+_XR
xx TOR,RM64R64,VQWORD,,_S+_R48+_O+_R+_R64+_XA+_XR
;0A
xx TOR,R8RM8,VBYTE,,_S+_O
xx TOR,R8RM8,VBYTE,,_S+_O
xx TOR,R8RM8,VBYTE,,_S+_O
;0B
xx TOR,R16RM16, VWORD,,_S+_O+_R+_R64
xx TOR,R32RM32,VDWORD,,_S+_O+_R+_R64
xx TOR,R64RM64,VQWORD,,_S+_R48+_O+_R+_R64
;0C
xx TOR,R8I08,VBYTE,RACC,_S
xx TOR,R8I08,VBYTE,RACC,_S
xx TOR,R8I08,VBYTE,RACC,_S
;0D
xx TOR,R16I16, VWORD,RACC,_S+_R+_R64
xx TOR,R32I32,VDWORD,RACC,_S+_R+_R64
xx TOR,R64I32,VQWORD,RACC,_S+_R48+_R+_R64
;0E
xx TPUSH,AddPointW, VWORD,RCS,_S+_A+_R
xx TPUSH,AddPointD,VDWORD,RCS,_S+_A+_R
xx TNULL,ErrorDec ,,,
;0F
xx TNULL,Rtn0F,
xx TNULL,Rtn0F,
xx TNULL,Rtn0F,
;10
xx TADC,RM8R8,VBYTE,,_S+_O+_XA+_XR
xx TADC,RM8R8,VBYTE,,_S+_O+_XA+_XR
xx TADC,RM8R8,VBYTE,,_S+_O+_XA+_XR
;11
xx TADC,RM16R16, VWORD,,_S+_O+_R+_R64+_XA+_XR
xx TADC,RM32R32,VDWORD,,_S+_O+_R+_R64+_XA+_XR
xx TADC,RM64R64,VQWORD,,_S+_R48+_O+_R+_R64+_XA+_XR
;12
xx TADC,R8RM8,VBYTE,,_S+_O
xx TADC,R8RM8,VBYTE,,_S+_O
xx TADC,R8RM8,VBYTE,,_S+_O
;13
xx TADC,R16RM16, VWORD,,_S+_O+_R+_R64
xx TADC,R32RM32,VDWORD,,_S+_O+_R+_R64
xx TADC,R64RM64,VQWORD,,_S+_R48+_O+_R+_R64
;14
xx TADC,R8I08,VBYTE,RACC,_S
xx TADC,R8I08,VBYTE,RACC,_S
xx TADC,R8I08,VBYTE,RACC,_S
;15
xx TADC,R16I16, VWORD,RACC,_S+_R+_R64
xx TADC,R32I32,VDWORD,RACC,_S+_R+_R64
xx TADC,R64I32,VQWORD,RACC,_S+_R48+_R+_R64
;16
xx TPUSH,AddPointW, VWORD,RSS,_S+_A+_R
xx TPUSH,AddPointD,VDWORD,RSS,_S+_A+_R
xx TNULL,ErrorDec ,,,
;17
xx TPOP,AddPointW, VWORD,RSS,_S+_A+_R
xx TPOP,AddPointD,VDWORD,RSS,_S+_A+_R
xx TNULL,ErrorDec,,,
;18
xx TSBB,RM8R8,VBYTE,,_S+_O+_XA+_XR
xx TSBB,RM8R8,VBYTE,,_S+_O+_XA+_XR
xx TSBB,RM8R8,VBYTE,,_S+_O+_XA+_XR
;19
xx TSBB,RM16R16, VWORD,,_S+_O+_R+_R64+_XA+_XR
xx TSBB,RM32R32,VDWORD,,_S+_O+_R+_R64+_XA+_XR
xx TSBB,RM64R64,VQWORD,,_S+_R48+_O+_R+_R64+_XA+_XR
;1A
xx TSBB,R8RM8,VBYTE,,_S+_O
xx TSBB,R8RM8,VBYTE,,_S+_O
xx TSBB,R8RM8,VBYTE,,_S+_O
;1B
xx TSBB,R16RM16, VWORD,,_S+_O+_R+_R64
xx TSBB,R32RM32,VDWORD,,_S+_O+_R+_R64
xx TSBB,R64RM64,VQWORD,,_S+_R48+_O+_R+_R64
;1C
xx TSBB,R8I08,VBYTE,RACC,_S
xx TSBB,R8I08,VBYTE,RACC,_S
xx TSBB,R8I08,VBYTE,RACC,_S
;1D
xx TSBB,R16I16, VWORD,RACC,_S+_R+_R64
xx TSBB,R32I32,VDWORD,RACC,_S+_R+_R64
xx TSBB,R64I32,VQWORD,RACC,_S+_R48+_R+_R64
;1E
xx TPUSH,AddPointW, VWORD,RDS,_S+_A+_R
xx TPUSH,AddPointD,VDWORD,RDS,_S+_A+_R
xx TNULL,ErrorDec ,,,
;1F
xx TPOP,AddPointW, VWORD,RDS,_S+_A+_R
xx TPOP,AddPointD,VDWORD,RDS,_S+_A+_R
xx TNULL,ErrorDec,,,
;20
xx TAND,RM8R8,VBYTE,,_S+_O+_XA+_XR
xx TAND,RM8R8,VBYTE,,_S+_O+_XA+_XR
xx TAND,RM8R8,VBYTE,,_S+_O+_XA+_XR
;21
xx TAND,RM16R16, VWORD,,_S+_O+_R+_R64+_XA+_XR
xx TAND,RM32R32,VDWORD,,_S+_O+_R+_R64+_XA+_XR
xx TAND,RM64R64,VQWORD,,_S+_R48+_O+_R+_R64+_XA+_XR
;22
xx TAND,R8RM8,VBYTE,,_S+_O
xx TAND,R8RM8,VBYTE,,_S+_O
xx TAND,R8RM8,VBYTE,,_S+_O
;23
xx TAND,R16RM16, VWORD,,_S+_O+_R+_R64
xx TAND,R32RM32,VDWORD,,_S+_O+_R+_R64
xx TAND,R64RM64,VQWORD,,_S+_R48+_O+_R+_R64
;24
xx TAND,R8I08,VBYTE,RACC,_S
xx TAND,R8I08,VBYTE,RACC,_S
xx TAND,R8I08,VBYTE,RACC,_S
;25
xx TAND,R16I16, VWORD,RACC,_S+_R+_R64
xx TAND,R32I32,VDWORD,RACC,_S+_R+_R64
xx TAND,R64I32,VQWORD,RACC,_S+_R48+_R+_R64
;26
xx TNULL,Rtn262E363E,,,_A
xx TNULL,Rtn262E363E,,,_A
xx TNULL,Rtn262E363E64,,,
;27
xx TDAA,RtnXX,,,_A
xx TDAA,RtnXX,,,_A
xx TNULL,ErrorDec,
;28
xx TSUB,RM8R8,VBYTE,,_S+_O+_XA+_XR
xx TSUB,RM8R8,VBYTE,,_S+_O+_XA+_XR
xx TSUB,RM8R8,VBYTE,,_S+_O+_XA+_XR
;29
xx TSUB,RM16R16, VWORD,,_S+_O+_R+_R64+_XA+_XR
xx TSUB,RM32R32,VDWORD,,_S+_O+_R+_R64+_XA+_XR
xx TSUB,RM64R64,VQWORD,,_S+_R48+_O+_R+_R64+_XA+_XR
;2A
xx TSUB,R8RM8,VBYTE,,_S+_O
xx TSUB,R8RM8,VBYTE,,_S+_O
xx TSUB,R8RM8,VBYTE,,_S+_O
;2B
xx TSUB,R16RM16, VWORD,,_S+_O+_R+_R64
xx TSUB,R32RM32,VDWORD,,_S+_O+_R+_R64
xx TSUB,R64RM64,VQWORD,,_S+_R48+_O+_R+_R64
;2C
xx TSUB,R8I08,VBYTE,RACC,_S
xx TSUB,R8I08,VBYTE,RACC,_S
xx TSUB,R8I08,VBYTE,RACC,_S
;2D
xx TSUB,R16I16, VWORD,RACC,_S+_R+_R64
xx TSUB,R32I32,VDWORD,RACC,_S+_R+_R64
xx TSUB,R64I32,VQWORD,RACC,_S+_R48+_R+_R64
;2E
xx TNULL,Rtn262E363E,,,_A
xx TNULL,Rtn262E363E,,,_A
xx TNULL,Rtn262E363E64,,,
;2F
xx TDAS,RtnXX,,,_A
xx TDAS,RtnXX,,,_A
xx TNULL,ErrorDec,
;30
xx TXOR,RM8R8,VBYTE,,_S+_O+_XA+_XR
xx TXOR,RM8R8,VBYTE,,_S+_O+_XA+_XR
xx TXOR,RM8R8,VBYTE,,_S+_O+_XA+_XR
;31
xx TXOR,RM16R16, VWORD,,_S+_O+_R+_R64+_XA+_XR
xx TXOR,RM32R32,VDWORD,,_S+_O+_R+_R64+_XA+_XR
xx TXOR,RM64R64,VQWORD,,_S+_R48+_O+_R+_R64+_XA+_XR
;32
xx TXOR,R8RM8,VBYTE,,_S+_O
xx TXOR,R8RM8,VBYTE,,_S+_O
xx TXOR,R8RM8,VBYTE,,_S+_O
;33
xx TXOR,R16RM16, VWORD,,_S+_O+_R+_R64
xx TXOR,R32RM32,VDWORD,,_S+_O+_R+_R64
xx TXOR,R64RM64,VQWORD,,_S+_R48+_O+_R+_R64
;34
xx TXOR,R8I08,VBYTE,RACC,_S
xx TXOR,R8I08,VBYTE,RACC,_S
xx TXOR,R8I08,VBYTE,RACC,_S
;35
xx TXOR,R16I16, VWORD,RACC,_S+_R+_R64
xx TXOR,R32I32,VDWORD,RACC,_S+_R+_R64
xx TXOR,R64I32,VQWORD,RACC,_S+_R48+_R+_R64
;36
xx TNULL,Rtn262E363E,,,_A
xx TNULL,Rtn262E363E,,,_A
xx TNULL,Rtn262E363E64,,,
;37
xx TAAA,RtnXX,,,_A
xx TAAA,RtnXX,,,_A
xx TNULL,ErrorDec
;38
xx TCMP,RM8R8,VBYTE,,_S+_O
xx TCMP,RM8R8,VBYTE,,_S+_O
xx TCMP,RM8R8,VBYTE,,_S+_O
;39
xx TCMP,RM16R16, VWORD,,_S+_O+_R+_R64
xx TCMP,RM32R32,VDWORD,,_S+_O+_R+_R64
xx TCMP,RM64R64,VQWORD,,_S+_R48+_O+_R+_R64
;3A
xx TCMP,R8RM8,VBYTE,,_S+_O
xx TCMP,R8RM8,VBYTE,,_S+_O
xx TCMP,R8RM8,VBYTE,,_S+_O
;3B
xx TCMP,R16RM16, VWORD,,_S+_O+_R+_R64
xx TCMP,R32RM32,VDWORD,,_S+_O+_R+_R64
xx TCMP,R64RM64,VQWORD,,_S+_R48+_O+_R+_R64
;3C
xx TCMP,R8I08,VBYTE,RACC,_S
xx TCMP,R8I08,VBYTE,RACC,_S
xx TCMP,R8I08,VBYTE,RACC,_S
;3D
xx TCMP,R16I16, VWORD,RACC,_S+_R+_R64
xx TCMP,R32I32,VDWORD,RACC,_S+_R+_R64
xx TCMP,R64I32,VQWORD,RACC,_S+_R48+_R+_R64
;3E
xx TNULL,Rtn262E363E,,,_A
xx TNULL,Rtn262E363E,,,_A
xx TNULL,Rtn262E363E64,,,
;3F
xx TAAS,RtnXX,,,_A
xx TAAS,RtnXX,,,_A
xx TNULL,ErrorDec
;40
xx TINC,RtnArgW, VWORD,RRAX,_S+_A+_R
xx TINC,RtnArgD,VDWORD,RRAX,_S+_A+_R
xx TNULL,Rtn4X,,,
;41
xx TINC,RtnArgW, VWORD,RRCX,_S+_A+_R
xx TINC,RtnArgD,VDWORD,RRCX,_S+_A+_R
xx TNULL,Rtn4X,,,
;42
xx TINC,RtnArgW, VWORD,RRDX,_S+_A+_R
xx TINC,RtnArgD,VDWORD,RRDX,_S+_A+_R
xx TNULL,Rtn4X,,,
;43
xx TINC,RtnArgW, VWORD,RRBX,_S+_A+_R
xx TINC,RtnArgD,VDWORD,RRBX,_S+_A+_R
xx TNULL,Rtn4X,,,
;44
xx TINC,RtnArgW, VWORD,RRSP,_S+_A+_R
xx TINC,RtnArgD,VDWORD,RRSP,_S+_A+_R
xx TNULL,Rtn4X,,,
;45
xx TINC,RtnArgW, VWORD,RRBP,_S+_A+_R
xx TINC,RtnArgD,VDWORD,RRBP,_S+_A+_R
xx TNULL,Rtn4X,,,
;46
xx TINC,RtnArgW, VWORD,RRSI,_S+_A+_R
xx TINC,RtnArgD,VDWORD,RRSI,_S+_A+_R
xx TNULL,Rtn4X,,,
;47
xx TINC,RtnArgW, VWORD,RRDI,_S+_A+_R
xx TINC,RtnArgD,VDWORD,RRDI,_S+_A+_R
xx TNULL,Rtn4X,,,
;48
xx TDEC,RtnArgW, VWORD,RRAX,_S+_A+_R
xx TDEC,RtnArgD,VDWORD,RRAX,_S+_A+_R
xx TNULL,Rtn4X,,,
;49
xx TDEC,RtnArgW, VWORD,RRCX,_S+_A+_R
xx TDEC,RtnArgD,VDWORD,RRCX,_S+_A+_R
xx TNULL,Rtn4X,,,
;4A
xx TDEC,RtnArgW, VWORD,RRDX,_S+_A+_R
xx TDEC,RtnArgD,VDWORD,RRDX,_S+_A+_R
xx TNULL,Rtn4X,,,
;4B
xx TDEC,RtnArgW, VWORD,RRBX,_S+_A+_R
xx TDEC,RtnArgD,VDWORD,RRBX,_S+_A+_R
xx TNULL,Rtn4X,,,
;4C
xx TDEC,RtnArgW, VWORD,RRSP,_S+_A+_R
xx TDEC,RtnArgD,VDWORD,RRSP,_S+_A+_R
xx TNULL,Rtn4X,,,
;4D
xx TDEC,RtnArgW, VWORD,RRBP,_S+_A+_R
xx TDEC,RtnArgD,VDWORD,RRBP,_S+_A+_R
xx TNULL,Rtn4X,,,
;4E
xx TDEC,RtnArgW, VWORD,RRSI,_S+_A+_R
xx TDEC,RtnArgD,VDWORD,RRSI,_S+_A+_R
xx TNULL,Rtn4X,,,
;4F
xx TDEC,RtnArgW, VWORD,RRDI,_S+_A+_R
xx TDEC,RtnArgD,VDWORD,RRDI,_S+_A+_R
xx TNULL,Rtn4X,,,
;50
xx TPUSH,RtnArgW, VWORD,RRAX,_S+_R+_R64
xx TPUSH,RtnArgD,VDWORD,RRAX,_S+_A+_R+_R64
xx TPUSH,RtnArgQ,VQWORD,RRAX,_S+_R+_R64
;51
xx TPUSH,RtnArgW, VWORD,RRCX,_S+_R+_R64
xx TPUSH,RtnArgD,VDWORD,RRCX,_S+_A+_R+_R64
xx TPUSH,RtnArgQ,VQWORD,RRCX,_S+_R+_R64
;52
xx TPUSH,RtnArgW, VWORD,RRDX,_S+_R+_R64
xx TPUSH,RtnArgD,VDWORD,RRDX,_S+_A+_R+_R64
xx TPUSH,RtnArgQ,VQWORD,RRDX,_S+_R+_R64
;53
xx TPUSH,RtnArgW, VWORD,RRBX,_S+_R+_R64
xx TPUSH,RtnArgD,VDWORD,RRBX,_S+_A+_R+_R64
xx TPUSH,RtnArgQ,VQWORD,RRBX,_S+_R+_R64
;54
xx TPUSH,RtnArgW, VWORD,RRSP,_S+_R+_R64
xx TPUSH,RtnArgD,VDWORD,RRSP,_S+_A+_R+_R64
xx TPUSH,RtnArgQ,VQWORD,RRSP,_S+_R+_R64
;55
xx TPUSH,RtnArgW, VWORD,RRBP,_S+_R+_R64
xx TPUSH,RtnArgD,VDWORD,RRBP,_S+_A+_R+_R64
xx TPUSH,RtnArgQ,VQWORD,RRBP,_S+_R+_R64
;56
xx TPUSH,RtnArgW, VWORD,RRSI,_S+_R+_R64
xx TPUSH,RtnArgD,VDWORD,RRSI,_S+_A+_R+_R64
xx TPUSH,RtnArgQ,VQWORD,RRSI,_S+_R+_R64
;57
xx TPUSH,RtnArgW, VWORD,RRDI,_S+_R+_R64
xx TPUSH,RtnArgD,VDWORD,RRDI,_S+_A+_R+_R64
xx TPUSH,RtnArgQ,VQWORD,RRDI,_S+_R+_R64
;58
xx TPOP,RtnArgW, VWORD,RRAX,_S+_R+_R64
xx TPOP,RtnArgD,VDWORD,RRAX,_S+_A+_R+_R64
xx TPOP,RtnArgQ,VQWORD,RRAX,_S+_R+_R64
;59
xx TPOP,RtnArgW, VWORD,RRCX,_S+_R+_R64
xx TPOP,RtnArgD,VDWORD,RRCX,_S+_A+_R+_R64
xx TPOP,RtnArgQ,VQWORD,RRCX,_S+_R+_R64
;5A
xx TPOP,RtnArgW, VWORD,RRDX,_S+_R+_R64
xx TPOP,RtnArgD,VDWORD,RRDX,_S+_A+_R+_R64
xx TPOP,RtnArgQ,VQWORD,RRDX,_S+_R+_R64
;5B
xx TPOP,RtnArgW, VWORD,RRBX,_S+_R+_R64
xx TPOP,RtnArgD,VDWORD,RRBX,_S+_A+_R+_R64
xx TPOP,RtnArgQ,VQWORD,RRBX,_S+_R+_R64
;5C
xx TPOP,RtnArgW, VWORD,RRSP,_S+_R+_R64
xx TPOP,RtnArgD,VDWORD,RRSP,_S+_A+_R+_R64
xx TPOP,RtnArgQ,VQWORD,RRSP,_S+_R+_R64
;5D
xx TPOP,RtnArgW, VWORD,RRBP,_S+_R+_R64
xx TPOP,RtnArgD,VDWORD,RRBP,_S+_A+_R+_R64
xx TPOP,RtnArgQ,VQWORD,RRBP,_S+_R+_R64
;5E
xx TPOP,RtnArgW, VWORD,RRSI,_S+_R+_R64
xx TPOP,RtnArgD,VDWORD,RRSI,_S+_A+_R+_R64
xx TPOP,RtnArgQ,VQWORD,RRSI,_S+_R+_R64
;5F
xx TPOP,RtnArgW, VWORD,RRDI,_S+_R+_R64
xx TPOP,RtnArgD,VDWORD,RRDI,_S+_A+_R+_R64
xx TPOP,RtnArgQ,VQWORD,RRDI,_S+_R+_R64
;60
xx TPUSHA ,RtnXX,VWORD,,_S+_A+_R
xx TPUSHAD,RndSizeD60,VDWORD,,_S+_A+_R
xx TNULL,ErrorDec,,,
;61
xx TPOPA ,RtnXX,VWORD,,_S+_A+_R
xx TPOPAD,RndSizeD61,VDWORD,,_S+_A+_R
xx TNULL,ErrorDec,,,
;62
xx TBOUND,BNDEVEX62,,,_S+_A
xx TBOUND,BNDEVEX62,,,_S+_A
xx TNULL ,EVEX62,,,
;63
xx TARPL,RM16R16,VWORD,,_S+_A+_O+_R48
xx TARPL,RM16R16,VWORD,,_S+_A+_O+_R48
xx TNULL,RtnMOVSXD,,,_O+_R48
;64
xx TNULL,Rtn6465,,,
xx TNULL,Rtn6465,,,
xx TNULL,Rtn6465,,,
;65
xx TNULL,Rtn6465,,,
xx TNULL,Rtn6465,,,
xx TNULL,Rtn6465,,,
;66
xx TNULL,Rtn66,,,
xx TNULL,Rtn66,,,
xx TNULL,Rtn66,,,
;67
xx TNULL,Rtn67,,,
xx TNULL,Rtn67,,,
xx TNULL,Rtn67,,,
;68
xx TPUSH,PushI16, VWORD,,_S+_R+_R64
xx TPUSH,PushI32,VDWORD,,_S+_A+_R+_R64
xx TPUSH,PushI64,VQWORD,,_S+_R+_R64
;69
xx TIMUL,R16RM16I16, VWORD,,_S+_O+_R+_R64
xx TIMUL,R32RM32I32,VDWORD,,_S+_O+_R+_R64
xx TIMUL,R64RM64I32,VQWORD,,_S+_R48+_O+_R+_R64
;6A
xx TPUSH,PushSI16, VWORD,,_S+_R+_R64
xx TPUSH,PushSI32,VDWORD,,_S+_A+_R+_R64
xx TPUSH,PushSI64,VQWORD,,_S+_R+_R64
;6B
xx TIMUL,R16RM16SI16, VWORD,,_S+_O+_R+_R64
xx TIMUL,R32RM32SI32,VDWORD,,_S+_O+_R+_R64
xx TIMUL,R64RM64SI32,VQWORD,,_S+_O+_R48+_R+_R64
;6C
xx TINSB,RtnINSX,VBYTE,,_S
xx TINSB,RtnINSX,VBYTE,,_S
xx TINSB,RtnINSX,VBYTE,,_S
;6D
xx TINSW,RtnINSX, VWORD,,_S+_R+_R64
xx TINSD,RtnINSX,VDWORD,,_S+_R+_R64
xx TINSD,RtnINSX,VDWORD,,_S+_R+_R64
;6E
xx TOUTSB,RtnOUTSX,VBYTE,,_S
xx TOUTSB,RtnOUTSX,VBYTE,,_S
xx TOUTSB,RtnOUTSX,VBYTE,,_S
;6F
xx TOUTSW,RtnOUTSX, VWORD,,_S+_R+_R64
xx TOUTSD,RtnOUTSX,VDWORD,,_S+_R+_R64
xx TOUTSD,RtnOUTSX,VDWORD,,_S+_R+_R64
;70
xx TJO,DODISPB,,,_J+_B
xx TJO,DODISPB,,,_J+_B
xx TJO,DODISPB,,,_J+_B
;71
xx TJNO,DODISPB,,,_J+_B
xx TJNO,DODISPB,,,_J+_B
xx TJNO,DODISPB,,,_J+_B
;72 ò
xx TJB,DODISPB,,,_J+_B
xx TJB,DODISPB,,,_J+_B
xx TJB,DODISPB,,,_J+_B
;73
xx TJAE,DODISPB,,,_J+_B
xx TJAE,DODISPB,,,_J+_B
xx TJAE,DODISPB,,,_J+_B
;74
xx TJZ,DODISPB,,,_J+_B
xx TJZ,DODISPB,,,_J+_B
xx TJZ,DODISPB,,,_J+_B
;75
xx TJNZ,DODISPB,,,_J+_B
xx TJNZ,DODISPB,,,_J+_B
xx TJNZ,DODISPB,,,_J+_B
;76
xx TJBE,DODISPB,,,_J+_B
xx TJBE,DODISPB,,,_J+_B
xx TJBE,DODISPB,,,_J+_B
;77
xx TJA,DODISPB,,,_J+_B
xx TJA,DODISPB,,,_J+_B
xx TJA,DODISPB,,,_J+_B
;78
xx TJS,DODISPB,,,_J+_B
xx TJS,DODISPB,,,_J+_B
xx TJS,DODISPB,,,_J+_B
;79
xx TJNS,DODISPB,,,_J+_B
xx TJNS,DODISPB,,,_J+_B
xx TJNS,DODISPB,,,_J+_B
;7A
xx TJP,DODISPB,,,_J+_B
xx TJP,DODISPB,,,_J+_B
xx TJP,DODISPB,,,_J+_B
;7B
xx TJNP,DODISPB,,,_J+_B
xx TJNP,DODISPB,,,_J+_B
xx TJNP,DODISPB,,,_J+_B
;7C
xx TJL,DODISPB,,,_J+_B
xx TJL,DODISPB,,,_J+_B
xx TJL,DODISPB,,,_J+_B
;7D
xx TJGE,DODISPB,,,_J+_B
xx TJGE,DODISPB,,,_J+_B
xx TJGE,DODISPB,,,_J+_B
;7E
xx TJLE,DODISPB,,,_J+_B
xx TJLE,DODISPB,,,_J+_B
xx TJLE,DODISPB,,,_J+_B
;7F
xx TJG,DODISPB,,,_J+_B
xx TJG,DODISPB,,,_J+_B
xx TJG,DODISPB,,,_J+_B
;80
xx TNULL,EXTINSONE,,EXT80,_E
xx TNULL,EXTINSONE,,EXT80,_E
xx TNULL,EXTINSONE,,EXT80,_E
;81
xx TNULL,EXTINST,,EXT81,_E
xx TNULL,EXTINST,,EXT81,_E
xx TNULL,EXTINST,,EXT81,_E
;82
xx TNULL,EXTINSONE,,EXT82,_A+_E
xx TNULL,EXTINSONE,,EXT82,_A+_E
xx TNULL,ErrorDec ,,EXT82,_E
;83
xx TNULL,EXTINST,,EXT83,_E
xx TNULL,EXTINST,,EXT83,_E
xx TNULL,EXTINST,,EXT83,_E
;84
xx TTEST,RM8R8,VBYTE,,_S+_O
xx TTEST,RM8R8,VBYTE,,_S+_O
xx TTEST,RM8R8,VBYTE,,_S+_O
;85
xx TTEST,RM16R16, VWORD,,_S+_O+_R+_R64
xx TTEST,RM32R32,VDWORD,,_S+_O+_R+_R64
xx TTEST,RM64R64,VQWORD,,_S+_R48+_O+_R+_R64
;86
xx TXCHG,RM8R8,VBYTE,,_S+_O+_XA+_XR+_L
xx TXCHG,RM8R8,VBYTE,,_S+_O+_XA+_XR+_L
xx TXCHG,RM8R8,VBYTE,,_S+_O+_XA+_XR+_L
;87
xx TXCHG,RM16R16, VWORD,,_S+_O+_R+_R64+_XA+_XR+_L
xx TXCHG,RM32R32,VDWORD,,_S+_O+_R+_R64+_XA+_XR+_L
xx TXCHG,RM64R64,VQWORD,,_S+_R48+_O+_R+_R64+_XA+_XR+_L
;88
xx TMOV,RM8R8,VBYTE,,_S+_O+_XR+_L
xx TMOV,RM8R8,VBYTE,,_S+_O+_XR+_L
xx TMOV,RM8R8,VBYTE,,_S+_O+_XR+_L
;89
xx TMOV,RM16R16, VWORD,,_S+_O+_R+_R64+_XR+_L
xx TMOV,RM32R32,VDWORD,,_S+_O+_R+_R64+_XR+_L
xx TMOV,RM64R64,VQWORD,,_S+_R48+_O+_R+_R64+_XR+_L
;8A
xx TMOV,R8RM8,VBYTE,,_S+_O
xx TMOV,R8RM8,VBYTE,,_S+_O
xx TMOV,R8RM8,VBYTE,,_S+_O
;8B
xx TMOV,R16RM16, VWORD,,_S+_O+_R+_R64
xx TMOV,R32RM32,VDWORD,,_S+_O+_R+_R64
xx TMOV,R64RM64,VQWORD,,_S+_R48+_O+_R+_R64
;8C
xx TMOV,RM16SEG,VWORD,,_O+_R+_R64
xx TMOV,RM32SEG,VWORD,,_O+_R+_R64
xx TMOV,RM64SEG,VWORD,,_R48+_O+_R+_R64
;8D
xx TLEA,R16RM16L, VWORD,,_S+_O+_R+_R64
xx TLEA,R32RM32L,VDWORD,,_S+_O+_R+_R64
xx TLEA,R64RM64L,VQWORD,,_S+_R48+_O+_R+_R64
;8E
xx TMOV,SEGRM16,VWORD,,_O+_R+_R64
xx TMOV,SEGRM32,VWORD,,_O+_R+_R64
xx TMOV,SEGRM64,VWORD,,_R48+_O+_R+_R64
;8F
xx TNULL,Rtn8F,,EXT8F,_E
xx TNULL,Rtn8F,,EXT8F,_E
xx TNULL,Rtn8F,,EXT8F,_E
;90
xx TXCHG,Rtn9X16, VWORD,,_S+_R+_R64
xx TXCHG,Rtn9X32,VDWORD,,_S+_R+_R64
xx TXCHG,Rtn9X64,VQWORD,,_S+_R48+_R+_R64
;91
xx TXCHG,Rtn9X16, VWORD,,_S+_R+_R64
xx TXCHG,Rtn9X32,VDWORD,,_S+_R+_R64
xx TXCHG,Rtn9X64,VQWORD,,_S+_R48+_R+_R64
;92
xx TXCHG,Rtn9X16, VWORD,,_S+_R+_R64
xx TXCHG,Rtn9X32,VDWORD,,_S+_R+_R64
xx TXCHG,Rtn9X64,VQWORD,,_S+_R48+_R+_R64
;93
xx TXCHG,Rtn9X16, VWORD,,_S+_R+_R64
xx TXCHG,Rtn9X32,VDWORD,,_S+_R+_R64
xx TXCHG,Rtn9X64,VQWORD,,_S+_R48+_R+_R64
;94
xx TXCHG,Rtn9X16, VWORD,,_S+_R+_R64
xx TXCHG,Rtn9X32,VDWORD,,_S+_R+_R64
xx TXCHG,Rtn9X64,VQWORD,,_S+_R48+_R+_R64
;95
xx TXCHG,Rtn9X16, VWORD,,_S+_R+_R64
xx TXCHG,Rtn9X32,VDWORD,,_S+_R+_R64
xx TXCHG,Rtn9X64,VQWORD,,_S+_R48+_R+_R64
;96
xx TXCHG,Rtn9X16, VWORD,,_S+_R+_R64
xx TXCHG,Rtn9X32,VDWORD,,_S+_R+_R64
xx TXCHG,Rtn9X64,VQWORD,,_S+_R48+_R+_R64
;97
xx TXCHG,Rtn9X16, VWORD,,_S+_R+_R64
xx TXCHG,Rtn9X32,VDWORD,,_S+_R+_R64
xx TXCHG,Rtn9X64,VQWORD,,_S+_R48+_R+_R64
;98
xx TCBW ,Rtn9816,,,_R+_R64
xx TCWDE,Rtn9832,,,_R+_R64
xx TCDQE,Rtn9864,,,_R48+_R+_R64
;99
xx TCWD,Rtn9916,,,_R+_R64
xx TCDQ,Rtn9932,,,_R+_R64
xx TCQO,Rtn9964,,,_R48+_R+_R64
;9A
xx TCALL,Rtn9A,,,_A+_R
xx TCALL,Rtn9A,,,_A+_R
xx TCALL,ErrorDec,,,_R
;9B
xx TNULL,Rtn9B,,,
xx TNULL,Rtn9B,,,
xx TNULL,Rtn9B,,,
;9C
xx TPUSHF,RtnF16, VWORD,,_S+_R+_R64
xx TPUSHF,RtnF32,VDWORD,,_S+_A+_R+_R64
xx TPUSHF,RtnF64,VQWORD,,_S+_R+_R64
;9D
xx TPOPF,RtnF16, VWORD,,_S+_R+_R64
xx TPOPF,RtnF32,VDWORD,,_S+_A+_R+_R64
xx TPOPF,RtnF64,VQWORD,,_S+_R+_R64
;9E
xx TSAHF,RtnXX,
xx TSAHF,RtnXX,
xx TSAHF,RtnXX,
;9F
xx TLAHF,RtnXX,
xx TLAHF,RtnXX,
xx TLAHF,RtnXX,
;A0
xx TMOV,RtnA0,VBYTE,,_S+_O
xx TMOV,RtnA0,VBYTE,,_S+_O
xx TMOV,RtnA0,VBYTE,,_S+_O
;A1
xx TMOV,RtnA1,,,_S+_O+_R+_R64
xx TMOV,RtnA1,,,_S+_O+_R+_R64
xx TMOV,RtnA1,,,_S+_R48+_O+_R+_R64
;A2
xx TMOV,RtnA2,VBYTE,,_S+_O
xx TMOV,RtnA2,VBYTE,,_S+_O
xx TMOV,RtnA2,VBYTE,,_S+_O
;A3
xx TMOV,RtnA3,,,_S+_O+_R+_R64
xx TMOV,RtnA3,,,_S+_O+_R+_R64
xx TMOV,RtnA3,,,_S+_R48+_O+_R+_R64
;A4
xx TMOVSB,RtnMOVX,VBYTE,,_S
xx TMOVSB,RtnMOVX,VBYTE,,_S
xx TMOVSB,RtnMOVX,VBYTE,,_S
;A5
xx TMOVSW,RtnMOVX, VWORD,,_S+_R+_R64
xx TMOVSD,RtnMOVX,VDWORD,,_S+_R+_R64
xx TMOVSQ,RtnMOVX,VQWORD,,_S+_R48+_R+_R64
;A6
xx TCMPSB,RtnCMPX,VBYTE,,_S
xx TCMPSB,RtnCMPX,VBYTE,,_S
xx TCMPSB,RtnCMPX,VBYTE,,_S
;A7
xx TCMPSW,RtnCMPX, VWORD,,_S+_R+_R64
xx TCMPSD,RtnCMPX,VDWORD,,_S+_R+_R64
xx TCMPSQ,RtnCMPX,VQWORD,,_S+_R48+_R+_R64
;A8
xx TTEST,R8I08,VBYTE,RACC,_S
xx TTEST,R8I08,VBYTE,RACC,_S
xx TTEST,R8I08,VBYTE,RACC,_S
;A9
xx TTEST,R16I16, VWORD,RACC,_S+_R+_R64
xx TTEST,R32I32,VDWORD,RACC,_S+_R+_R64
xx TTEST,R64I32,VQWORD,RACC,_S+_R48+_R+_R64
;AA
xx TSTOSB,RtnSTOX,VBYTE,,_S
xx TSTOSB,RtnSTOX,VBYTE,,_S
xx TSTOSB,RtnSTOX,VBYTE,,_S
;AB
xx TSTOSW,RtnSTOX, VWORD,,_S+_R+_R64
xx TSTOSD,RtnSTOX,VDWORD,,_S+_R+_R64
xx TSTOSQ,RtnSTOX,VQWORD,,_S+_R48+_R+_R64
;AC
xx TLODSB,RtnLODX,VBYTE,,_S
xx TLODSB,RtnLODX,VBYTE,,_S
xx TLODSB,RtnLODX,VBYTE,,_S
;AD
xx TLODSW,RtnLODX, VWORD,,_S+_R+_R64
xx TLODSD,RtnLODX,VDWORD,,_S+_R48+_R+_R64
xx TLODSQ,RtnLODX,VQWORD,,_S+_R48+_R+_R64
;AE
xx TSCASB,RtnSCAX,VBYTE,,_S
xx TSCASB,RtnSCAX,VBYTE,,_S
xx TSCASB,RtnSCAX,VBYTE,,_S
;AF
xx TSCASW,RtnSCAX, VWORD,,_S+_R+_R64
xx TSCASD,RtnSCAX,VDWORD,,_S+_R+_R64
xx TSCASQ,RtnSCAX,VQWORD,,_S+_R48+_R+_R64
;B0
xx TMOV,R8IMM8,VBYTE,,_S
xx TMOV,R8IMM8,VBYTE,,_S
xx TMOV,R8IMM8,VBYTE,,_S
;B1
xx TMOV,R8IMM8,VBYTE,,_S
xx TMOV,R8IMM8,VBYTE,,_S
xx TMOV,R8IMM8,VBYTE,,_S
;B2
xx TMOV,R8IMM8,VBYTE,,_S
xx TMOV,R8IMM8,VBYTE,,_S
xx TMOV,R8IMM8,VBYTE,,_S
;B3
xx TMOV,R8IMM8,VBYTE,,_S
xx TMOV,R8IMM8,VBYTE,,_S
xx TMOV,R8IMM8,VBYTE,,_S
;B4
xx TMOV,R8IMM8,VBYTE,,_S
xx TMOV,R8IMM8,VBYTE,,_S
xx TMOV,R8IMM8,VBYTE,,_S
;B5
xx TMOV,R8IMM8,VBYTE,,_S
xx TMOV,R8IMM8,VBYTE,,_S
xx TMOV,R8IMM8,VBYTE,,_S
;B6
xx TMOV,R8IMM8,VBYTE,,_S
xx TMOV,R8IMM8,VBYTE,,_S
xx TMOV,R8IMM8,VBYTE,,_S
;B7
xx TMOV,R8IMM8,VBYTE,,_S
xx TMOV,R8IMM8,VBYTE,,_S
xx TMOV,R8IMM8,VBYTE,,_S
;B8
xx TMOV,R16IMM16, VWORD,,_S+_R+_R64
xx TMOV,R32IMM32,VDWORD,,_S+_R+_R64
xx TMOV,R64IMM64,VQWORD,,_S+_R48+_R+_R64
;B9
xx TMOV,R16IMM16, VWORD,,_S+_R+_R64
xx TMOV,R32IMM32,VDWORD,,_S+_R+_R64
xx TMOV,R64IMM64,VQWORD,,_S+_R48+_R+_R64
;BA
xx TMOV,R16IMM16, VWORD,,_S+_R+_R64
xx TMOV,R32IMM32,VDWORD,,_S+_R+_R64
xx TMOV,R64IMM64,VQWORD,,_S+_R48+_R+_R64
;BB
xx TMOV,R16IMM16, VWORD,,_S+_R+_R64
xx TMOV,R32IMM32,VDWORD,,_S+_R+_R64
xx TMOV,R64IMM64,VQWORD,,_S+_R48+_R+_R64
;BC
xx TMOV,R16IMM16, VWORD,,_S+_R+_R64
xx TMOV,R32IMM32,VDWORD,,_S+_R+_R64
xx TMOV,R64IMM64,VQWORD,,_S+_R48+_R+_R64
;BD
xx TMOV,R16IMM16, VWORD,,_S+_R+_R64
xx TMOV,R32IMM32,VDWORD,,_S+_R+_R64
xx TMOV,R64IMM64,VQWORD,,_S+_R48+_R+_R64
;BE
xx TMOV,R16IMM16, VWORD,,_S+_R+_R64
xx TMOV,R32IMM32,VDWORD,,_S+_R+_R64
xx TMOV,R64IMM64,VQWORD,,_S+_R48+_R+_R64
;BF
xx TMOV,R16IMM16, VWORD,,_S+_R+_R64
xx TMOV,R32IMM32,VDWORD,,_S+_R+_R64
xx TMOV,R64IMM64,VQWORD,,_S+_R48+_R+_R64
;C0
xx TNULL,EXTINSONE,,EXTC0,_E
xx TNULL,EXTINSONE,,EXTC0,_E
xx TNULL,EXTINSONE,,EXTC0,_E
;C1
xx TNULL,EXTINST,,EXTC1,_E
xx TNULL,EXTINST,,EXTC1,_E
xx TNULL,EXTINST,,EXTC1,_E
;C2
xx TRET,RtnC216, VWORD,,_S+_R+_R64+_B
xx TRET,RtnC232,VDWORD,,_S+_A+_R+_R64+_B
xx TRET,RtnC264,VQWORD,,_S+_R+_R64+_B
;C3
xx TRET,RtnC316, VWORD,,_S+_R+_R64+_B
xx TRET,RtnC332,VDWORD,,_S+_A+_R+_R64+_B
xx TRET,RtnC364,VQWORD,,_S+_R+_R64+_B
;C4
xx TLES,R16RM16C4,VDWORD,,_A
xx TLES,R32RM32C4,VFWORD,,_A
xx TLES,RtnAVX2C4,
;C5
xx TLDS,R16RM16C5,VDWORD,,_A
xx TLDS,R32RM32C5,VFWORD,,_A
xx TLDS,RtnAVX2C5,
;C6
xx TNULL,RtnC6,,EXTC6,_E
xx TNULL,RtnC6,,EXTC6,_E
xx TNULL,RtnC6,,EXTC6,_E
;C7
xx TNULL,RtnC7,,EXTC7,_E
xx TNULL,RtnC7,,EXTC7,_E
xx TNULL,RtnC7,,EXTC7,_E
;C8
xx TENTER,RtnC816,,,_R+_R64
xx TENTER,RtnC832,,,_A+_R+_R64
xx TENTER,RtnC864,,,_R+_R64
;C9
xx TLEAVE,RtnC916,,,_R+_R64
xx TLEAVE,RtnC932,,,_A+_R+_R64
xx TLEAVE,RtnC964,,,_R+_R64
;CA
xx TRETF,RtnC216, VWORD,,_S+_R+_R64
xx TRETF,RtnC232,VDWORD,,_S+_A+_R+_R64
xx TRETF,RtnC264,VQWORD,,_S+_R+_R64
;CB
xx TRETF,RtnC316, VWORD,,_S+_R+_R64
xx TRETF,RtnC332,VDWORD,,_S+_A+_R+_R64
xx TRETF,RtnC364,VQWORD,,_S+_R+_R64
;CC
xx TINT3,RtnXX,
xx TINT3,RtnXX,
xx TINT3,RtnXX,
;CD
xx TNULL,RtnCD,
xx TNULL,RtnCD,
xx TNULL,RtnCD,
;CE
xx TINTO,RtnXX,,,_A
xx TINTO,RtnXX,,,_A
xx TINTO,ErrorDec,
;CF
xx TIRET,RtnC316, VWORD,,_S+_R+_R64
xx TIRET,RtnC332,VDWORD,,_S+_A+_R+_R64
xx TIRET,RtnC364,VQWORD,,_S+_R+_R64
;D0
xx TNULL,EXTINSONE,,EXTD0,_E
xx TNULL,EXTINSONE,,EXTD0,_E
xx TNULL,EXTINSONE,,EXTD0,_E
;D1
xx TNULL,EXTINST,,EXTD1,_E
xx TNULL,EXTINST,,EXTD1,_E
xx TNULL,EXTINST,,EXTD1,_E
;D2
xx TNULL,EXTINSONE,,EXTD2,_E
xx TNULL,EXTINSONE,,EXTD2,_E
xx TNULL,EXTINSONE,,EXTD2,_E
;D3
xx TNULL,EXTINST,,EXTD3,_E
xx TNULL,EXTINST,,EXTD3,_E
xx TNULL,EXTINST,,EXTD3,_E
;D4
xx TAAM,LoseByte,,,_A
xx TAAM,LoseByte,,,_A
xx TAAM,ErrorDec
;D5
xx TAAD,LoseByte,,,_A
xx TAAD,LoseByte,,,_A
xx TAAD,ErrorDec
;D6
xx TSALC,RtnXX,,,_A
xx TSALC,RtnXX,,,_A
xx TSALC,ErrorDec
;D7
xx TXLATB,RtnD7,
xx TXLATB,RtnD7,
xx TXLATB,RtnD7,
;D8
xx TNULL,EXTINSONEFLT,,EXTD8,_E
xx TNULL,EXTINSONEFLT,,EXTD8,_E
xx TNULL,EXTINSONEFLT,,EXTD8,_E
;D9
xx TNULL,EXTINSONEFLT,,EXTD9,_E
xx TNULL,EXTINSONEFLT,,EXTD9,_E
xx TNULL,EXTINSONEFLT,,EXTD9,_E
;DA
xx TNULL,EXTINSONE,,EXTDA,_E
xx TNULL,EXTINSONE,,EXTDA,_E
xx TNULL,EXTINSONE,,EXTDA,_E
;DB
xx TNULL,EXTINSONE,,EXTDB,_E
xx TNULL,EXTINSONE,,EXTDB,_E
xx TNULL,EXTINSONE,,EXTDB,_E
;DC
xx TNULL,EXTINSONEFLT,,EXTDC,_E
xx TNULL,EXTINSONEFLT,,EXTDC,_E
xx TNULL,EXTINSONEFLT,,EXTDC,_E
;DD
xx TNULL,EXTINSONEFLT,,EXTDD,_E
xx TNULL,EXTINSONEFLT,,EXTDD,_E
xx TNULL,EXTINSONEFLT,,EXTDD,_E
;DE
xx TNULL,EXTINSONEFLT,,EXTDE,_E
xx TNULL,EXTINSONEFLT,,EXTDE,_E
xx TNULL,EXTINSONEFLT,,EXTDE,_E
;DF
xx TNULL,EXTINSONEFLT,,EXTDF,_E
xx TNULL,EXTINSONEFLT,,EXTDF,_E
xx TNULL,EXTINSONEFLT,,EXTDF,_E
;E0
xx TLOOPNZ,RtnE0,
xx TLOOPNZ,RtnE0,
xx TLOOPNZ,RtnE0,
;E1
xx TLOOPZ,RtnE1,
xx TLOOPZ,RtnE1,
xx TLOOPZ,RtnE1,
;E2
xx TLOOP,RtnE2,
xx TLOOP,RtnE2,
xx TLOOP,RtnE2,
;E3
xx TNULL,RtnE3,
xx TNULL,RtnE3,
xx TNULL,RtnE3,
;E4
xx TIN,RtnE4,
xx TIN,RtnE4,
xx TIN,RtnE4,
;E5
xx TIN,RtnE516,,,_R+_R64
xx TIN,RtnE532,,,_R+_R64
xx TIN,RtnE532,,,_R+_R64
;E6
xx TOUT,RtnE6,
xx TOUT,RtnE6,
xx TOUT,RtnE6,
;E7
xx TOUT,RtnE716,,,_R+_R64
xx TOUT,RtnE732,,,_R+_R64
xx TOUT,RtnE732,,,_R+_R64
;E8
xx TCALL,DODISPW,,,_R+_R64+_B
xx TCALL,DODISPD,,,_R+_R64+_B
xx TCALL,DODISPD,,,_R+_R64+_B
;E9
xx TJMP,DODISPW,,,_R+_R64+_B
xx TJMP,DODISPD,,,_R+_R64+_B
xx TJMP,DODISPD,,,_R+_R64+_B
;EA
xx TJMP,RtnEA,,,_A+_R
xx TJMP,RtnEA,,,_A+_R
xx TJMP,ErrorDec,,,_R
;EB
xx TJMP,DODISPBS,,,
xx TJMP,DODISPBS,,,
xx TJMP,DODISPBS,,,
;EC
xx TIN,RtnEC,
xx TIN,RtnEC,
xx TIN,RtnEC,
;ED,
xx TIN,RtnED16,,,_R+_R64
xx TIN,RtnED32,,,_R+_R64
xx TIN,RtnED32,,,_R+_R64
;EE
xx TOUT,RtnEE,
xx TOUT,RtnEE,
xx TOUT,RtnEE,
;EF
xx TOUT,RtnEF16,,,_R+_R64
xx TOUT,RtnEF32,,,_R+_R64
xx TOUT,RtnEF32,,,_R+_R64
;F0
xx TNULL,RtnF0,,,
xx TNULL,RtnF0,,,
xx TNULL,RtnF0,,,
;F1
xx TINT1,RtnF1,
xx TINT1,RtnF1,
xx TINT1,RtnF1,
;F2
xx TNULL,RtnF2,,,
xx TNULL,RtnF2,,,
xx TNULL,RtnF2,,,
;F3
xx TNULL,RtnF3,,,
xx TNULL,RtnF3,,,
xx TNULL,RtnF3,,,
;F4
xx THLT,RtnXX,
xx THLT,RtnXX,
xx THLT,RtnXX,
;F5
xx TCMC,RtnXX,
xx TCMC,RtnXX,
xx TCMC,RtnXX,
;F6
xx TNULL,EXTINSONE,,EXTF6,_E
xx TNULL,EXTINSONE,,EXTF6,_E
xx TNULL,EXTINSONE,,EXTF6,_E
;F7
xx TNULL,EXTINST,,EXTF7,_E
xx TNULL,EXTINST,,EXTF7,_E
xx TNULL,EXTINST,,EXTF7,_E
;F8
xx TCLC,RtnXX,
xx TCLC,RtnXX,
xx TCLC,RtnXX,
;F9
xx TSTC,RtnXX,
xx TSTC,RtnXX,
xx TSTC,RtnXX,
;FA
xx TCLI,RtnXX,
xx TCLI,RtnXX,
xx TCLI,RtnXX,
;FB
xx TSTI,RtnXX,
xx TSTI,RtnXX,
xx TSTI,RtnXX,
;FC
xx TCLD,RtnXX,
xx TCLD,RtnXX,
xx TCLD,RtnXX,
;FD
xx TSTD,RtnXX,
xx TSTD,RtnXX,
xx TSTD,RtnXX,
;FE
xx TNULL,EXTINSONE,,EXTFE,_E
xx TNULL,EXTINSONE,,EXTFE,_E
xx TNULL,EXTINSONE,,EXTFE,_E
;FF
xx TNULL,EXTINSTFF,,EXTFF,_E
xx TNULL,EXTINSTFF,,EXTFF,_E
xx TNULL,EXTINSTFF,,EXTFF,_E
;-----------------------------------------------------------------------------
EXT80: ;One table
EXT82: ;One table
;0
xx TADD,RM8IMM8,VBYTE,,_S+_XA+_XR
;1
xx TOR ,RM8IMM8,VBYTE,,_S+_XA+_XR
;2
xx TADC,RM8IMM8,VBYTE,,_S+_XA+_XR
;3
xx TSBB,RM8IMM8,VBYTE,,_S+_XA+_XR
;4
xx TAND,RM8IMM8,VBYTE,,_S+_XA+_XR
;5
xx TSUB,RM8IMM8,VBYTE,,_S+_XA+_XR
;6
xx TXOR,RM8IMM8,VBYTE,,_S+_XA+_XR
;7
xx TCMP,RM8IMM8,VBYTE,,_S
;-----------------------------------------------------------------------------
EXT81:
;0
xx TADD,RM16IMM16, VWORD,,_S+_R+_R64+_XA+_XR
xx TADD,RM32IMM32,VDWORD,,_S+_R+_R64+_XA+_XR
xx TADD,RM64IMM32,VQWORD,,_S+_R48+_R+_R64+_XA+_XR
;1
xx TOR ,RM16IMM16, VWORD,,_S+_R+_R64+_XA+_XR
xx TOR ,RM32IMM32,VDWORD,,_S+_R+_R64+_XA+_XR
xx TOR ,RM64IMM32,VQWORD,,_S+_R48+_R+_R64+_XA+_XR
;2
xx TADC,RM16IMM16, VWORD,,_S+_R+_R64+_XA+_XR
xx TADC,RM32IMM32,VDWORD,,_S+_R+_R64+_XA+_XR
xx TADC,RM64IMM32,VQWORD,,_S+_R48+_R+_R64+_XA+_XR
;3
xx TSBB,RM16IMM16, VWORD,,_S+_R+_R64+_XA+_XR
xx TSBB,RM32IMM32,VDWORD,,_S+_R+_R64+_XA+_XR
xx TSBB,RM64IMM32,VQWORD,,_S+_R48+_R+_R64+_XA+_XR
;4
xx TAND,RM16IMM16, VWORD,,_S+_R+_R64+_XA+_XR
xx TAND,RM32IMM32,VDWORD,,_S+_R+_R64+_XA+_XR
xx TAND,RM64IMM32,VQWORD,,_S+_R48+_R+_R64+_XA+_XR
;5
xx TSUB,RM16IMM16, VWORD,,_S+_R+_R64+_XA+_XR
xx TSUB,RM32IMM32,VDWORD,,_S+_R+_R64+_XA+_XR
xx TSUB,RM64IMM32,VQWORD,,_S+_R48+_R+_R64+_XA+_XR
;6
xx TXOR,RM16IMM16, VWORD,,_S+_R+_R64+_XA+_XR
xx TXOR,RM32IMM32,VDWORD,,_S+_R+_R64+_XA+_XR
xx TXOR,RM64IMM32,VQWORD,,_S+_R48+_R+_R64+_XA+_XR
;7
xx TCMP,RM16IMM16, VWORD,,_S+_R+_R64
xx TCMP,RM32IMM32,VDWORD,,_S+_R+_R64
xx TCMP,RM64IMM32,VQWORD,,_S+_R48+_R+_R64
;-----------------------------------------------------------------------------
EXT83:
;0
xx TADD,RM16IMMS8, VWORD,,_S+_R+_R64+_XA+_XR
xx TADD,RM32IMMS8,VDWORD,,_S+_R+_R64+_XA+_XR
xx TADD,RM64IMMS8,VQWORD,,_S+_R48+_R+_R64+_XA+_XR
;1
xx TOR ,RM16IMMS8, VWORD,,_S+_R+_R64+_XA+_XR
xx TOR ,RM32IMMS8,VDWORD,,_S+_R+_R64+_XA+_XR
xx TOR ,RM64IMMS8,VQWORD,,_S+_R48+_R+_R64+_XA+_XR
;2
xx TADC,RM16IMMS8, VWORD,,_S+_R+_R64+_XA+_XR
xx TADC,RM32IMMS8,VDWORD,,_S+_R+_R64+_XA+_XR
xx TADC,RM64IMMS8,VQWORD,,_S+_R48+_R+_R64+_XA+_XR
;3
xx TSBB,RM16IMMS8, VWORD,,_S+_R+_R64+_XA+_XR
xx TSBB,RM32IMMS8,VDWORD,,_S+_R+_R64+_XA+_XR
xx TSBB,RM64IMMS8,VQWORD,,_S+_R48+_R+_R64+_XA+_XR
;4
xx TAND,RM16IMMS8, VWORD,,_S+_R+_R64+_XA+_XR
xx TAND,RM32IMMS8,VDWORD,,_S+_R+_R64+_XA+_XR
xx TAND,RM64IMMS8,VQWORD,,_S+_R48+_R+_R64+_XA+_XR
;5
xx TSUB,RM16IMMS8, VWORD,,_S+_R+_R64+_XA+_XR
xx TSUB,RM32IMMS8,VDWORD,,_S+_R+_R64+_XA+_XR
xx TSUB,RM64IMMS8,VQWORD,,_S+_R48+_R+_R64+_XA+_XR
;6
xx TXOR,RM16IMMS8, VWORD,,_S+_R+_R64+_XA+_XR
xx TXOR,RM32IMMS8,VDWORD,,_S+_R+_R64+_XA+_XR
xx TXOR,RM64IMMS8,VQWORD,,_S+_R48+_R+_R64+_XA+_XR
;7
xx TCMP,RM16IMMS8, VWORD,,_S+_R+_R64
xx TCMP,RM32IMMS8,VDWORD,,_S+_R+_R64
xx TCMP,RM64IMMS8,VQWORD,,_S+_R48+_R+_R64
;-----------------------------------------------------------------------------
EXT8F:
;0
xx TPOP,RM16, VWORD,,_S+_R+_R64
xx TPOP,RM32,VDWORD,,_S+_A+_R+_R64
xx TPOP,RM64,VQWORD,,_S+_R+_R64
;-----------------------------------------------------------------------------
EXTC0: ;One table
;0
xx TROL,RM8IMM8,VBYTE,,_S
;1
xx TROR,RM8IMM8,VBYTE,,_S
;2
xx TRCL,RM8IMM8,VBYTE,,_S
;3
xx TRCR,RM8IMM8,VBYTE,,_S
;4
xx TSHL,RM8IMM8,VBYTE,,_S
;5
xx TSHR,RM8IMM8,VBYTE,,_S
;6
xx TSAL,RM8IMM8,VBYTE,,_S
;7
xx TSAR,RM8IMM8,VBYTE,,_S
;-----------------------------------------------------------------------------
EXTC1:
;0
xx TROL,RM16I8, VWORD,,_S+_R+_R64
xx TROL,RM32I8,VDWORD,,_S+_R+_R64
xx TROL,RM64I8,VQWORD,,_S+_R48+_R+_R64
;1
xx TROR,RM16I8, VWORD,,_S+_R+_R64
xx TROR,RM32I8,VDWORD,,_S+_R+_R64
xx TROR,RM64I8,VQWORD,,_S+_R48+_R+_R64
;2
xx TRCL,RM16I8, VWORD,,_S+_R+_R64
xx TRCL,RM32I8,VDWORD,,_S+_R+_R64
xx TRCL,RM64I8,VQWORD,,_S+_R48+_R+_R64
;3
xx TRCR,RM16I8, VWORD,,_S+_R+_R64
xx TRCR,RM32I8,VDWORD,,_S+_R+_R64
xx TRCR,RM64I8,VQWORD,,_S+_R48+_R+_R64
;4
xx TSHL,RM16I8, VWORD,,_S+_R+_R64
xx TSHL,RM32I8,VDWORD,,_S+_R+_R64
xx TSHL,RM64I8,VQWORD,,_S+_R48+_R+_R64
;5
xx TSHR,RM16I8, VWORD,,_S+_R+_R64
xx TSHR,RM32I8,VDWORD,,_S+_R+_R64
xx TSHR,RM64I8,VQWORD,,_S+_R48+_R+_R64
;6
xx TSAL,RM16I8, VWORD,,_S+_R+_R64
xx TSAL,RM32I8,VDWORD,,_S+_R+_R64
xx TSAL,RM64I8,VQWORD,,_S+_R48+_R+_R64
;7
xx TSAR,RM16I8, VWORD,,_S+_R+_R64
xx TSAR,RM32I8,VDWORD,,_S+_R+_R64
xx TSAR,RM64I8,VQWORD,,_S+_R48+_R+_R64
;-----------------------------------------------------------------------------
EXTC6: ;One table
;0
xx TMOV,RM8IMM8,VBYTE,,_S+_XR+_L
;-----------------------------------------------------------------------------
EXTC7:
;0
xx TMOV,RM16IMM16, VWORD,,_S+_R+_R64+_XR+_L
xx TMOV,RM32IMM32,VDWORD,,_S+_R+_R64+_XR+_L
xx TMOV,RM64IMM32,VQWORD,,_S+_R48+_R+_R64+_XR+_L
;-----------------------------------------------------------------------------
EXTD0: ;One table
;0
xx TROL,RM81,VBYTE,,_S
;1
xx TROR,RM81,VBYTE,,_S
;2
xx TRCL,RM81,VBYTE,,_S
;3
xx TRCR,RM81,VBYTE,,_S
;4
xx TSHL,RM81,VBYTE,,_S
;5
xx TSHR,RM81,VBYTE,,_S
;6
xx TSAL,RM81,VBYTE,,_S
;7
xx TSAR,RM81,VBYTE,,_S
;-----------------------------------------------------------------------------
EXTD1:
;0
xx TROL,RM161, VWORD,,_S+_R+_R64
xx TROL,RM321,VDWORD,,_S+_R+_R64
xx TROL,RM641,VQWORD,,_S+_R48+_R+_R64
;1
xx TROR,RM161, VWORD,,_S+_R+_R64
xx TROR,RM321,VDWORD,,_S+_R+_R64
xx TROR,RM641,VQWORD,,_S+_R48+_R+_R64
;2
xx TRCL,RM161, VWORD,,_S+_R+_R64
xx TRCL,RM321,VDWORD,,_S+_R+_R64
xx TRCL,RM641,VQWORD,,_S+_R48+_R+_R64
;3
xx TRCR,RM161, VWORD,,_S+_R+_R64
xx TRCR,RM321,VDWORD,,_S+_R+_R64
xx TRCR,RM641,VQWORD,,_S+_R48+_R+_R64
;4
xx TSHL,RM161, VWORD,,_S+_R+_R64
xx TSHL,RM321,VDWORD,,_S+_R+_R64
xx TSHL,RM641,VQWORD,,_S+_R48+_R+_R64
;5
xx TSHR,RM161, VWORD,,_S+_R+_R64
xx TSHR,RM321,VDWORD,,_S+_R+_R64
xx TSHR,RM641,VQWORD,,_S+_R48+_R+_R64
;6
xx TSAL,RM161, VWORD,,_S+_R+_R64
xx TSAL,RM321,VDWORD,,_S+_R+_R64
xx TSAL,RM641,VQWORD,,_S+_R48+_R+_R64
;7
xx TSAR,RM161, VWORD,,_S+_R+_R64
xx TSAR,RM321,VDWORD,,_S+_R+_R64
xx TSAR,RM641,VQWORD,,_S+_R48+_R+_R64
;-----------------------------------------------------------------------------
EXTD2: ;One table
;0
xx TROL,RM8CL,VBYTE,,_S
;1
xx TROR,RM8CL,VBYTE,,_S
;2
xx TRCL,RM8CL,VBYTE,,_S
;3
xx TRCR,RM8CL,VBYTE,,_S
;4
xx TSHL,RM8CL,VBYTE,,_S
;5
xx TSHR,RM8CL,VBYTE,,_S
;6
xx TSAL,RM8CL,VBYTE,,_S
;7
xx TSAR,RM8CL,VBYTE,,_S
;-----------------------------------------------------------------------------
EXTD3:
;0
xx TROL,RM16CL, VWORD,,_S+_R+_R64
xx TROL,RM32CL,VDWORD,,_S+_R+_R64
xx TROL,RM64CL,VQWORD,,_S+_R48+_R+_R64
;1
xx TROR,RM16CL, VWORD,,_S+_R+_R64
xx TROR,RM32CL,VDWORD,,_S+_R+_R64
xx TROR,RM64CL,VQWORD,,_S+_R48+_R+_R64
;2
xx TRCL,RM16CL, VWORD,,_S+_R+_R64
xx TRCL,RM32CL,VDWORD,,_S+_R+_R64
xx TRCL,RM64CL,VQWORD,,_S+_R48+_R+_R64
;3
xx TRCR,RM16CL, VWORD,,_S+_R+_R64
xx TRCR,RM32CL,VDWORD,,_S+_R+_R64
xx TRCR,RM64CL,VQWORD,,_S+_R48+_R+_R64
;4
xx TSHL,RM16CL, VWORD,,_S+_R+_R64
xx TSHL,RM32CL,VDWORD,,_S+_R+_R64
xx TSHL,RM64CL,VQWORD,,_S+_R48+_R+_R64
;5
xx TSHR,RM16CL, VWORD,,_S+_R+_R64
xx TSHR,RM32CL,VDWORD,,_S+_R+_R64
xx TSHR,RM64CL,VQWORD,,_S+_R48+_R+_R64
;6
xx TSAL,RM16CL, VWORD,,_S+_R+_R64
xx TSAL,RM32CL,VDWORD,,_S+_R+_R64
xx TSAL,RM64CL,VQWORD,,_S+_R48+_R+_R64
;7
xx TSAR,RM16CL, VWORD,,_S+_R+_R64
xx TSAR,RM32CL,VDWORD,,_S+_R+_R64
xx TSAR,RM64CL,VQWORD,,_S+_R48+_R+_R64
;-----------------------------------------------------------------------------
EXTF6: ;One table
;0
xx TTEST ,RM8IMM8,VBYTE,,_S
;1
xx TTEST2,RM8IMM8,VBYTE,,_S
;2
xx TNOT ,RM8,VBYTE,,_S+_XA+_XR
;3
xx TNEG ,RM8,VBYTE,,_S+_XA+_XR
;4
xx TMUL ,RM8,VBYTE,,_S
;5
xx TIMUL ,RM8,VBYTE,,_S
;6
xx TDIV ,RM8,VBYTE,,_S
;7
xx TIDIV ,RM8,VBYTE,,_S
;-----------------------------------------------------------------------------
EXTF7:
;0
xx TTEST ,RM16IMM16, VWORD,,_S+_R+_R64
xx TTEST ,RM32IMM32,VDWORD,,_S+_R+_R64
xx TTEST ,RM64IMM32,VQWORD,,_S+_R48+_R+_R64
;1
xx TTEST2,RM16IMM16, VWORD,,_S+_R+_R64
xx TTEST2,RM32IMM32,VDWORD,,_S+_R+_R64
xx TTEST2,RM64IMM32,VQWORD,,_S+_R48+_R+_R64
;2
xx TNOT ,RM16, VWORD,,_S+_R+_R64+_XA+_XR
xx TNOT ,RM32,VDWORD,,_S+_R+_R64+_XA+_XR
xx TNOT ,RM64,VQWORD,,_S+_R48+_R+_R64+_XA+_XR
;3
xx TNEG ,RM16, VWORD,,_S+_R+_R64+_XA+_XR
xx TNEG ,RM32,VDWORD,,_S+_R+_R64+_XA+_XR
xx TNEG ,RM64,VQWORD,,_S+_R48+_R+_R64+_XA+_XR
;4
xx TMUL ,RM16, VWORD,,_S+_R+_R64
xx TMUL ,RM32,VDWORD,,_S+_R+_R64
xx TMUL ,RM64,VQWORD,,_S+_R48+_R+_R64
;5
xx TIMUL ,RM16, VWORD,,_S+_R+_R64
xx TIMUL ,RM32,VDWORD,,_S+_R+_R64
xx TIMUL ,RM64,VQWORD,,_S+_R48+_R+_R64
;6
xx TDIV ,RM16, VWORD,,_S+_R+_R64
xx TDIV ,RM32,VDWORD,,_S+_R+_R64
xx TDIV ,RM64,VQWORD,,_S+_R48+_R+_R64
;7
xx TIDIV ,RM16, VWORD,,_S+_R+_R64
xx TIDIV ,RM32,VDWORD,,_S+_R+_R64
xx TIDIV ,RM64,VQWORD,,_S+_R48+_R+_R64
;-----------------------------------------------------------------------------
EXTFE: ;One table
;0
xx TINC ,RM8,VBYTE,,_S+_XA+_XR
;1
xx TDEC ,RM8,VBYTE,,_S+_XA+_XR
;2
xx TNULL,ErrorDec,
;3
xx TNULL,ErrorDec,
;4
xx TNULL,ErrorDec,
;5
xx TNULL,ErrorDec,
;6
xx TNULL,ErrorDec,
;7
xx TNULL,ErrorDec,
;-----------------------------------------------------------------------------
EXTFF:
;0
xx TINC ,RM16, VWORD,,_S+_R+_R64+_XA+_XR
xx TINC ,RM32,VDWORD,,_S+_R+_R64+_XA+_XR
xx TINC ,RM64,VQWORD,,_S+_R48+_R+_R64+_XA+_XR
;1
xx TDEC ,RM16, VWORD,,_S+_R+_R64+_XA+_XR
xx TDEC ,RM32,VDWORD,,_S+_R+_R64+_XA+_XR
xx TDEC ,RM64,VQWORD,,_S+_R48+_R+_R64+_XA+_XR
;2
xx TCALL,RM16N, VWORD,,_S+_R+_R64+_B
xx TCALL,RM32N,VDWORD,,_S+_A+_R+_R64+_B
xx TCALL,RM64N,VQWORD,,_S+_R+_R64+_B
;3
xx TCALL,RM16F3, VWORD,,_S+_R+_R64
xx TCALL,RM32F3,VDWORD,,_S+_R+_R64
xx TCALL,RM64F3, ,,_R48+_R+_R64
;4
xx TJMP,RM16N, VWORD,,_S+_R+_R64+_B
xx TJMP,RM32N,VDWORD,,_S+_A+_R+_R64+_B
xx TJMP,RM64N,VQWORD,,_S+_R+_R64+_B
;5
xx TJMP,RM16F5, VWORD,,_S+_R+_R64
xx TJMP,RM32F5,VDWORD,,_S+_R+_R64
xx TJMP,RM64F5, ,,_R48+_R+_R64
;6
xx TPUSH,RM16, VWORD,,_S+_R+_R64
xx TPUSH,RM32,VDWORD,,_S+_A+_R+_R64
xx TPUSH,RM64,VQWORD,,_S+_R+_R64
;7
xx TNULL,ErrorDec,
xx TNULL,ErrorDec,
xx TNULL,ErrorDec,
;-----------------------------------------------------------------------------
EXTD8: ;One table
;0
xx TFADD ,ESC_0_000,VDWORD,,_S
;1
xx TFMUL ,ESC_0_001,VDWORD,,_S
;2
xx TFCOM ,ESC_0_010,VDWORD,,_S
;3
xx TFCOMP,ESC_0_011,VDWORD,,_S
;4
xx TFSUB ,ESC_0_100,VDWORD,,_S
;5
xx TFSUBR,ESC_0_101,VDWORD,,_S
;6
xx TFDIV ,ESC_0_110,VDWORD,,_S
;7
xx TFDIVR,ESC_0_111,VDWORD,,_S
;-----------------------------------------------------------------------------
EXTD9: ;One table
;0
xx TFLD ,ESC_1_000,VDWORD,,_S
;1
xx TFXCH ,ESC_1_001, ,,_S
;2
xx TFST ,ESC_1_010,VDWORD,,_S
;3
xx TFSTP ,ESC_1_011,VDWORD,,_S
;4
xx TNULL ,ESC_1_100, ,,_S
;5
xx TFLDCW,ESC_1_101, ,,_S
;6
xx TNULL ,ESC_1_110, ,,_S
;7
xx TNULL ,ESC_1_111, ,,_S
;-----------------------------------------------------------------------------
EXTDA: ;One table
;0
xx TFIADD ,ESC_2_000,VDWORD,,_S
;1
xx TFIMUL ,ESC_2_001,VDWORD,,_S
;2
xx TFICOM ,ESC_2_010,VDWORD,,_S
;3
xx TFICOMP,ESC_2_011,VDWORD,,_S
;4
xx TFISUB ,ESC_2_100,VDWORD,,_S
;5
xx TFISUBR,ESC_2_101,VDWORD,,_S
;6
xx TFIDIV ,ESC_2_110,VDWORD,,_S
;7
xx TFIDIVR,ESC_2_111,VDWORD,,_S
;-----------------------------------------------------------------------------
EXTDB: ;One table
;0
xx TFILD ,ESC_3_000,VDWORD,,_S
;1
xx TFISTTP,ESC_3_001,VDWORD,,_S
;2
xx TFIST ,ESC_3_010,VDWORD,,_S
;3
xx TFISTP ,ESC_3_011,VDWORD,,_S
;4
xx TNULL ,ESC_3_100, ,,_S
;5
xx TFLD ,ESC_3_101,VTWORD,,_S
;6
xx TFCOMI ,ESC_3_110, ,,_S
;7
xx TFSTP ,ESC_3_111, ,,_S
;-----------------------------------------------------------------------------
EXTDC: ;One table
;0
xx TFADD ,ESC_4_000,VQWORD,,_S
;1
xx TFMUL ,ESC_4_001,VQWORD,,_S
;2
xx TFCOM ,ESC_4_010,VQWORD,,_S
;3
xx TFCOMP ,ESC_4_011,VQWORD,,_S
;4
xx TFSUB ,ESC_4_100,VQWORD,,_S
;5
xx TFSUBR ,ESC_4_101,VQWORD,,_S
;6
xx TFDIV ,ESC_4_110,VQWORD,,_S
;7
xx TFDIVR ,ESC_4_111,VQWORD,,_S
;-----------------------------------------------------------------------------
EXTDD: ;One table
;0
xx TFLD ,ESC_5_000,VQWORD,,_S
;1
xx TFISTTP,ESC_5_001,VQWORD,,_S
;2
xx TFST ,ESC_5_010,VQWORD,,_S
;3
xx TFSTP ,ESC_5_011,VQWORD,,_S
;4
xx TNULL ,ESC_5_100, ,,_S
;5
xx TNULL ,ESC_5_101, ,,_S
;6
xx TNULL ,ESC_5_110, ,,_S
;7
xx TNULL ,ESC_5_111, ,,_S
;-----------------------------------------------------------------------------
EXTDE: ;One table
;0
xx TFIADD ,ESC_6_000,VWORD ,,_S
;1
xx TFIMUL ,ESC_6_001,VWORD ,,_S
;2
xx TFICOM ,ESC_6_010,VWORD ,,_S
;3
xx TFICOMP,ESC_6_011,VWORD ,,_S
;4
xx TFISUB ,ESC_6_100,VWORD ,,_S
;5
xx TFISUBR,ESC_6_101,VWORD ,,_S
;6
xx TFIDIV ,ESC_6_110,VWORD ,,_S
;7
xx TFIDIVR,ESC_6_111,VWORD ,,_S
;-----------------------------------------------------------------------------
EXTDF: ;One table
;0
xx TFILD ,ESC_7_000,VWORD ,,_S
;1
xx TFISTTP,ESC_7_001,VWORD ,,_S
;2
xx TFIST ,ESC_7_010,VWORD ,,_S
;3
xx TFISTP ,ESC_7_011,VWORD ,,_S
;4
xx TFBLD ,ESC_7_100,VTWORD,,_S
;5
xx TFILD ,ESC_7_101,VQWORD,,_S
;6
xx TFBSTP ,ESC_7_110,VTWORD,,_S
;7
xx TFISTP ,ESC_7_111,VQWORD,,_S
;-----------------------------------------------------------------------------
EXTR0F00:
;0
xx TSLDT,RM163264W,VWORD,,_S+_O
;0
xx TSTR ,RM163264W,VWORD,,_S+_O
;2
xx TLLDT ,RM16,VWORD,,_S+_O
;3
xx TLTR ,RM16,VWORD,,_S+_O
;4
xx TVERR ,RM16,VWORD,,_S+_O
;5
xx TVERW ,RM16,VWORD,,_S+_O
;6
xx TJMPE ,RMDW,VWORD,,_S+_R+_R64
;7
xx TNULL ,ErrorDec,
;-----------------------------------------------------------------------------
EXTR0F01:
;0
xx TSGDT ,RMW0100,,,_O
;1
xx TSIDT ,RMW0101,,,_O
;2
xx TLGDT ,RMW0102,,,_O
;3
xx TLIDT ,RMW0103,,,_O
;4
xx TSMSW ,RMW0104,,,
;5
xx TNULL ,RtnPKRU,,,
;6
xx TLMSW ,RM16,VWORD,,_O
;7
xx TINVLPG,RMW0107,,,
;-----------------------------------------------------------------------------
TableMOVBE:
;F0
xx TMOVBE,R16RM163, VWORD,,_S+_O+_R+_R64
xx TMOVBE,R32RM323,VDWORD,,_S+_O+_R+_R64
xx TMOVBE,R64RM643,VQWORD,,_S+_O+_R+_R64+_R48
;F1
xx TMOVBE,RM16R163, VWORD,,_S+_O+_R+_R64
xx TMOVBE,RM32R323,VDWORD,,_S+_O+_R+_R64
xx TMOVBE,RM64R643,VQWORD,,_S+_O+_R+_R64+_R48
;-----------------------------------------------------------------------------
TableCRC32:
;F0
xx TCRC32,CRC32R,VBYTE,,_S
xx TCRC32,CRC32R,VBYTE,,_S
xx TCRC32,CRC32R,VBYTE,,_S+_R48
;F1
xx TCRC32,CRC32X, VWORD,,_S+_R+_R64
xx TCRC32,CRC32X,VDWORD,,_S+_R+_R64
xx TCRC32,CRC32X,VQWORD,,_S+_R+_R64+_R48
;-----------------------------------------------------------------------------
TableADCX:
;F6
xx TADCX,R3264RM3264,VDWORD,,_S+_O+_R+_R64+_R48
;-----------------------------------------------------------------------------
TableADOX:
;F6
xx TADOX,R3264RM3264,VDWORD,,_S+_O+_R+_R64+_R48
;-----------------------------------------------------------------------------
TableINVx:;One table
;80
xx TINVEPT ,Rtn0F388X,VXWORD,,_O+_R+_R64
;81
xx TINVVPID ,Rtn0F388X,VXWORD,,_O+_R+_R64
;82
xx TINVPCID ,Rtn0F388X,VXWORD,,_O+_R+_R64
;-----------------------------------------------------------------------------
EXT0FBA:
;0
xx TNULL,ErrorDec,,,
xx TNULL,ErrorDec,,,
xx TNULL,ErrorDec,,,
;1
xx TNULL,ErrorDec,,,
xx TNULL,ErrorDec,,,
xx TNULL,ErrorDec,,,
;2
xx TNULL,ErrorDec,,,
xx TNULL,ErrorDec,,,
xx TNULL,ErrorDec,,,
;3
xx TNULL,ErrorDec,,,
xx TNULL,ErrorDec,,,
xx TNULL,ErrorDec,,,
;4
xx TBT,RM16I8, VWORD,,_S+_R+_R64
xx TBT,RM32I8,VDWORD,,_S+_R+_R64
xx TBT,RM64I8,VQWORD,,_S+_R48+_R+_R64
;5
xx TBTS,RM16I8, VWORD,,_S+_R+_R64+_XA+_XR
xx TBTS,RM32I8,VDWORD,,_S+_R+_R64+_XA+_XR
xx TBTS,RM64I8,VQWORD,,_S+_R48+_R+_R64+_XA+_XR
;6
xx TBTR,RM16I8, VWORD,,_S+_R+_R64+_XA+_XR
xx TBTR,RM32I8,VDWORD,,_S+_R+_R64+_XA+_XR
xx TBTR,RM64I8,VQWORD,,_S+_R48+_R+_R64+_XA+_XR
;7
xx TBTC,RM16I8, VWORD,,_S+_R+_R64+_XA+_XR
xx TBTC,RM32I8,VDWORD,,_S+_R+_R64+_XA+_XR
xx TBTC,RM64I8,VQWORD,,_S+_R48+_R+_R64+_XA+_XR
;-----------------------------------------------------------------------------
EXT0F00:
;00
xx TNULL,EXTINSONE,,EXTR0F00,_E
xx TNULL,EXTINSONE,,EXTR0F00,_E
xx TNULL,EXTINSONE,,EXTR0F00,_E
;01
xx TNULL,EXTINSONE,,EXTR0F01,_E
xx TNULL,EXTINSONE,,EXTR0F01,_E
xx TNULL,EXTINSONE,,EXTR0F01,_E
;02
xx TLAR,R16RM16W,VWORD,,_O+_R+_R64
xx TLAR,R32RM32W,VWORD,,_O+_R+_R64
xx TLAR,R64RM64W,VWORD,,_O+_R48+_R+_R64
;03
xx TLSL,R16RM16W,VWORD,,_O+_R+_R64
xx TLSL,R32RM32W,VWORD,,_O+_R+_R64
xx TLSL,R64RM64W,VWORD,,_O+_R48+_R+_R64
;04
xx TNULL,ErrorDec,,,
xx TNULL,ErrorDec,,,
xx TNULL,ErrorDec,,,
;05
xx TSYSCALL,LOADALL2,,,_A
xx TSYSCALL,LOADALL2,,,_A
xx TSYSCALL,RtnXX
;06
xx TCLTS,RtnXX,
xx TCLTS,RtnXX,
xx TCLTS,RtnXX,
;07
xx TSYSRET,Rtn0F07
xx TSYSRET,Rtn0F07
xx TSYSRETQ,Rtn0F07,,,_R48
;08
xx TINVD,RtnXX,
xx TINVD,RtnXX,
xx TINVD,RtnXX,
;09
xx TWBINVD,RtnWB,
xx TWBINVD,RtnWB,
xx TWBINVD,RtnWB,
;0A
xx TNULL,ErrorDec,,,
xx TNULL,ErrorDec,,,
xx TNULL,ErrorDec,,,
;0B
xx TUD2,RtnXX,
xx TUD2,RtnXX,
xx TUD2,RtnXX,
;0C
xx TNULL,ErrorDec,,,
xx TNULL,ErrorDec,,,
xx TNULL,ErrorDec,,,
;0D
xx TPREFETCH,PREFETCHRTN
xx TPREFETCH,PREFETCHRTN
xx TPREFETCH,PREFETCHRTN
;0E
xx TFEMMS,RtnXX
xx TFEMMS,RtnXX
xx TFEMMS,RtnXX
;0F
xx TNULL,Rtn0F0F,VQWORD,,_O
xx TNULL,Rtn0F0F,VQWORD,,_O
xx TNULL,Rtn0F0F,VQWORD,,_O
;-----------------------------------------------------------------------------
EXT0F10:
;10
xx TUMOV,Rtn0F1012 ,,TT0F10,_A+_T
xx TUMOV,Rtn0F1012 ,,TT0F10,_A+_T
xx TNULL,Rtn0066F2F3 ,,TT0F10,_T
;11
xx TUMOV,Rtn0F11X ,,TT0F11,_A+_R+_T
xx TUMOV,Rtn0F11X ,,TT0F11,_A+_R+_T
xx TNULL,Rtn0066F2F3 ,,TT0F11,_T
;12
xx TUMOV,Rtn0F1012 ,,TT0F12,_A+_T+_3
xx TUMOV,Rtn0F1012 ,,TT0F12,_A+_T+_3
xx TNULL,Rtn0066F2F3 ,,TT0F12,_T+_3
;13
xx TUMOV,Rtn0F13X ,,TT0F13,_A+_R+_T+_3
xx TUMOV,Rtn0F13X ,,TT0F13,_A+_R+_T+_3
xx TNULL,Rtn0066F2F3 ,,TT0F13,_A+_R+_T+_3
;14
xx TNULL,Rtn0066F2F3 ,,TT0F14,_T
xx TNULL,Rtn0066F2F3 ,,TT0F14,_T
xx TNULL,Rtn0066F2F3 ,,TT0F14,_T
;15
xx TNULL,Rtn0066F2F3 ,,TT0F15,_T
xx TNULL,Rtn0066F2F3 ,,TT0F15,_T
xx TNULL,Rtn0066F2F3 ,,TT0F15,_T
;16
xx TNULL,Rtn0066F2F3 ,,TT0F16,_T+_3
xx TNULL,Rtn0066F2F3 ,,TT0F16,_T+_3
xx TNULL,Rtn0066F2F3 ,,TT0F16,_T+_3
;17
xx TNULL,Rtn0066F2F3 ,,TT0F17,_T+_3
xx TNULL,Rtn0066F2F3 ,,TT0F17,_T+_3
xx TNULL,Rtn0066F2F3 ,,TT0F17,_T+_3
;18
xx TNULL,Rtn0F1816 , VWORD,,
xx TNULL,Rtn0F1832 ,VDWORD,,
xx TNULL,Rtn0F1864 ,VQWORD,,
;19
xx TNULL,Rtn0F1X16 , VWORD,,
xx TNULL,Rtn0F1X32 ,VDWORD,,
xx TNULL,Rtn0F1X64 ,VQWORD,,
;1A
xx TNULL,Rtn0F1A , VWORD,,
xx TNULL,Rtn0F1A ,VDWORD,,
xx TNULL,Rtn0F1A ,VQWORD,,
;1B
xx TNULL,Rtn0F1B , VWORD,,
xx TNULL,Rtn0F1B ,VDWORD,,
xx TNULL,Rtn0F1B ,VQWORD,,
;1C
xx TNULL,Rtn0F1C16 , VWORD,,
xx TNULL,Rtn0F1C32 ,VDWORD,,
xx TNULL,Rtn0F1C64 ,VQWORD,,
;1D
xx TNULL,Rtn0F1X16 , VWORD,,
xx TNULL,Rtn0F1X32 ,VDWORD,,
xx TNULL,Rtn0F1X64 ,VQWORD,,
;1E
xx TNULL,Rtn0F1E , VWORD,,
xx TNULL,Rtn0F1E ,VDWORD,,
xx TNULL,Rtn0F1E ,VQWORD,,_R48
;1F
xx TNULL,Rtn0F1X16 , VWORD,,
xx TNULL,Rtn0F1X32 ,VDWORD,,
xx TNULL,Rtn0F1X64 ,VQWORD,,
;-----------------------------------------------------------------------------
EXT0F20:;One table
;20
xx TMOV ,Rtn0F20 ,,,
;21
xx TMOV ,Rtn0F21 ,,,
;22
xx TMOV ,Rtn0F22 ,,,
;23
xx TMOV ,Rtn0F23 ,,,
;24
xx TMOV ,Rtn0F24 ,,,
;25
xx TNULL,ErrorDec ,,,
;26
xx TMOV ,Rtn0F26 ,,,
;27
xx TNULL,ErrorDec ,,,
;28
xx TNULL,Rtn0066F2F3 ,,TT0F28,_T
;29
xx TNULL,Rtn0066F2F3 ,,TT0F29,_T
;2A
xx TNULL,Rtn0066F2F3X ,,TT0F2A,_T
;2B
xx TNULL,Rtn0066F2F3 ,,TT0F2B,_T+_3
;2C
xx TNULL,Rtn0066F2F3X ,,TT0F2C,_T
;2D
xx TNULL,Rtn0066F2F3X ,,TT0F2D,_T
;2E
xx TNULL,Rtn0066F2F3 ,,TT0F2E,_T
;2F
xx TNULL,Rtn0066F2F3 ,,TT0F2F,_T
;-----------------------------------------------------------------------------
EXT0F30:;One table
;30
xx TWRMSR ,AddSuffixQ,,,
;31
xx TRDTSC ,RtnXX,,,
;32
xx TRDMSR ,AddSuffixQ,,,
;33
xx TRDPMC ,RtnXX,,,
;34
xx TSYSENTER ,RtnXX,,,
;35
xx TSYSEXIT ,AddSuffixQ,,,
;36
xx TRDSHR ,Rtn0F36,,,
;37
xx TGETSEC ,Rtn0F37,,,
;38
xx TNULL ,Rtn0066F2F3Y,,TT0F38,_T
;39
xx TDMINT ,Rtn0F39,,,
;3A
xx TPALIGNR ,Rtn0F3A,,,
;3B
xx TBB1?RESET ,Rtn0F3X,,,
;3C
xx TCPU?WRITE ,Rtn0F3X,,,
;3D
xx TCPU?READ ,Rtn0F3X,,,
;3E
xx TNULL ,ErrorDec,,,
;3F
xx TNULL ,ErrorDec,,,
;-----------------------------------------------------------------------------
EXT0F40:
;40
xx TCMOVO ,R16RM16, VWORD,,_S+_O+_R+_R64
xx TCMOVO ,R32RM32,VDWORD,,_S+_O+_R+_R64
xx TCMOVO ,R64RM64,VQWORD,,_S+_R48+_O+_R+_R64
;41
xx TCMOVNO ,R16RM16, VWORD,,_S+_O+_R+_R64
xx TCMOVNO ,R32RM32,VDWORD,,_S+_O+_R+_R64
xx TCMOVNO ,R64RM64,VQWORD,,_S+_R48+_O+_R+_R64
;42
xx TCMOVB ,R16RM16, VWORD,,_S+_O+_R+_R64
xx TCMOVB ,R32RM32,VDWORD,,_S+_O+_R+_R64
xx TCMOVB ,R64RM64,VQWORD,,_S+_R48+_O+_R+_R64
;43
xx TCMOVAE ,R16RM16, VWORD,,_S+_O+_R+_R64
xx TCMOVAE ,R32RM32,VDWORD,,_S+_O+_R+_R64
xx TCMOVAE ,R64RM64,VQWORD,,_S+_R48+_O+_R+_R64
;44
xx TCMOVZ ,R16RM16, VWORD,,_S+_O+_R+_R64
xx TCMOVZ ,R32RM32,VDWORD,,_S+_O+_R+_R64
xx TCMOVZ ,R64RM64,VQWORD,,_S+_R48+_O+_R+_R64
;45
xx TCMOVNZ ,R16RM16, VWORD,,_S+_O+_R+_R64
xx TCMOVNZ ,R32RM32,VDWORD,,_S+_O+_R+_R64
xx TCMOVNZ ,R64RM64,VQWORD,,_S+_R48+_O+_R+_R64
;46
xx TCMOVBE ,R16RM16, VWORD,,_S+_O+_R+_R64
xx TCMOVBE ,R32RM32,VDWORD,,_S+_O+_R+_R64
xx TCMOVBE ,R64RM64,VQWORD,,_S+_R48+_O+_R+_R64
;47
xx TCMOVA ,R16RM16, VWORD,,_S+_O+_R+_R64
xx TCMOVA ,R32RM32,VDWORD,,_S+_O+_R+_R64
xx TCMOVA ,R64RM64,VQWORD,,_S+_R48+_O+_R+_R64
;48
xx TCMOVS ,R16RM16, VWORD,,_S+_O+_R+_R64
xx TCMOVS ,R32RM32,VDWORD,,_S+_O+_R+_R64
xx TCMOVS ,R64RM64,VQWORD,,_S+_R48+_O+_R+_R64
;49
xx TCMOVNS ,R16RM16, VWORD,,_S+_O+_R+_R64
xx TCMOVNS ,R32RM32,VDWORD,,_S+_O+_R+_R64
xx TCMOVNS ,R64RM64,VQWORD,,_S+_R48+_O+_R+_R64
;4A
xx TCMOVP ,R16RM16, VWORD,,_S+_O+_R+_R64
xx TCMOVP ,R32RM32,VDWORD,,_S+_O+_R+_R64
xx TCMOVP ,R64RM64,VQWORD,,_S+_R48+_O+_R+_R64
;4B
xx TCMOVNP ,R16RM16, VWORD,,_S+_O+_R+_R64
xx TCMOVNP ,R32RM32,VDWORD,,_S+_O+_R+_R64
xx TCMOVNP ,R64RM64,VQWORD,,_S+_R48+_O+_R+_R64
;4C
xx TCMOVL ,R16RM16, VWORD,,_S+_O+_R+_R64
xx TCMOVL ,R32RM32,VDWORD,,_S+_O+_R+_R64
xx TCMOVL ,R64RM64,VQWORD,,_S+_R48+_O+_R+_R64
;4D
xx TCMOVGE ,R16RM16, VWORD,,_S+_O+_R+_R64
xx TCMOVGE ,R32RM32,VDWORD,,_S+_O+_R+_R64
xx TCMOVGE ,R64RM64,VQWORD,,_S+_R48+_O+_R+_R64
;4E
xx TCMOVLE ,R16RM16, VWORD,,_S+_O+_R+_R64
xx TCMOVLE ,R32RM32,VDWORD,,_S+_O+_R+_R64
xx TCMOVLE ,R64RM64,VQWORD,,_S+_R48+_O+_R+_R64
;4F
xx TCMOVG ,R16RM16, VWORD,,_S+_O+_R+_R64
xx TCMOVG ,R32RM32,VDWORD,,_S+_O+_R+_R64
xx TCMOVG ,R64RM64,VQWORD,,_S+_R48+_O+_R+_R64
;-----------------------------------------------------------------------------
EXT0F50:;One table
;50
xx TPAVEB ,Rtn0F50,,TT0F50,_T+_3
;51
xx TPADDSIW ,RtnIAMM ,,TT0F51,_T
;52
xx TPMAGW ,RtnIAMM ,,TT0F52,_T
;53
xx TNULL ,Rtn0066F2F3 ,,TT0F53,_T
;54
xx TPDISTIB ,RtnIAMM ,,TT0F54,_T
;55
xx TPSUBSIW ,RtnIAMM ,,TT0F55,_T
;56
xx TNULL ,Rtn0066F2F3 ,,TT0F56,_T
;57
xx TNULL ,Rtn0066F2F3 ,,TT0F57,_T
;58
xx TPMVZB ,RtnIAM3 ,,TT0F58,_T
;59
xx TPMULHRWC ,RtnIAMM ,,TT0F59,_T
;5A
xx TPMVNZB ,RtnIAM3 ,,TT0F5A,_T
;5B
xx TPMVLZB ,RtnIAM3 ,,TT0F5B,_T
;5C
xx TPMVGEZB ,RtnIAM3 ,,TT0F5C,_T
;5D
xx TPMULHRIW ,RtnIAMM ,,TT0F5D,_T
;5E
xx TPMACHRIW ,RtnIAM3 ,,TT0F5E,_T
;5F
xx TNULL ,Rtn0066F2F3 ,,TT0F5F,_T
;-----------------------------------------------------------------------------
EXT0F60:;One table
;60
xx TPUNPCKLBW ,Rtn0F6X,VDWORD,,_O
;61
xx TPUNPCKLWD ,Rtn0F6X,VDWORD,,_O
;62
xx TPUNPCKLDQ ,Rtn0F6X,VDWORD,,_O
;63
xx TPACKSSWB ,Rtn0F6X,VQWORD,,_O
;64
xx TPCMPGTB ,Rtn0F6X,VQWORD,,_O
;65
xx TPCMPGTW ,Rtn0F6X,VQWORD,,_O
;66
xx TPCMPGTD ,Rtn0F6X,VQWORD,,_O
;67
xx TPACKUSWB ,Rtn0F6X,VQWORD,,_O
;68
xx TPUNPCKHBW ,Rtn0F6X,VQWORD,,_O
;69
xx TPUNPCKHWD ,Rtn0F6X,VQWORD,,_O
;6A
xx TPUNPCKHDQ ,Rtn0F6X,VQWORD,,_O
;6B
xx TPACKSSDW ,Rtn0F6X,VQWORD,,_O
;6C
xx TPUNPCKLQDQ ,Rtn0F6X,VQWORD,,_O
;6D
xx TPUNPCKHQDQ ,Rtn0F6X,VQWORD,,_O
;6E
xx TNULL ,Rtn0066F2F3X,,TT0F6E,_T
;6F
xx TNULL ,Rtn0066F2F3 ,,TT0F6F,_T
;-----------------------------------------------------------------------------
EXT0F70:;One table
;70
xx TNULL ,Rtn0066F2F3X,,TT0F70,_T
;71
xx TNULL ,Rtn0F71,,,
;72
xx TNULL ,Rtn0F72,,,
;73
xx TNULL ,Rtn0F73,,,
;74
xx TPCMPEQB ,RtnMMXM,VQWORD,,_O
;75
xx TPCMPEQW ,RtnMMXM,VQWORD,,_O
;76
xx TPCMPEQD ,RtnMMXM,VQWORD,,_O
;77
xx TEMMS ,RtnXX ,,,
;78
xx TVMREAD ,Rtn0F78,,,
;79
xx TVMWRITE ,Rtn0F79,,,
;7A
xx TSVLDT ,Rtn0F7A,,,
;7B
xx TRSLDT ,Rtn0F7B,,,
;7C
xx TSVTS ,Rtn0F7C,,TT0F7C,_T
;7D
xx TRSTS ,Rtn0F7D,,TT0F7D,_T
;7E
xx TSMINTOLD ,Rtn0F7E,,TT0F7E,_T
;7F
xx TNULL ,Rtn0066F2F3,,TT0F7F,_T
;-----------------------------------------------------------------------------
EXT0F80:;One table
;80
xx TJO ,DODISPWD,,,_J+_R+_R64+_B
;81
xx TJNO ,DODISPWD,,,_J+_R+_R64+_B
;82
xx TJB ,DODISPWD,,,_J+_R+_R64+_B
;83
xx TJAE ,DODISPWD,,,_J+_R+_R64+_B
;84
xx TJZ ,DODISPWD,,,_J+_R+_R64+_B
;85
xx TJNZ ,DODISPWD,,,_J+_R+_R64+_B
;86
xx TJBE ,DODISPWD,,,_J+_R+_R64+_B
;87
xx TJA ,DODISPWD,,,_J+_R+_R64+_B
;88
xx TJS ,DODISPWD,,,_J+_R+_R64+_B
;89
xx TJNS ,DODISPWD,,,_J+_R+_R64+_B
;8A
xx TJP ,DODISPWD,,,_J+_R+_R64+_B
;8B
xx TJNP ,DODISPWD,,,_J+_R+_R64+_B
;8C
xx TJL ,DODISPWD,,,_J+_R+_R64+_B
;8D
xx TJGE ,DODISPWD,,,_J+_R+_R64+_B
;8E
xx TJLE ,DODISPWD,,,_J+_R+_R64+_B
;8F
xx TJG ,DODISPWD,,,_J+_R+_R64+_B
;-----------------------------------------------------------------------------
EXT0F90:;One table
;90
xx TSETO ,RM8,VBYTE,,_S+_O
;91
xx TSETNO ,RM8,VBYTE,,_S+_O
;92
xx TSETB ,RM8,VBYTE,,_S+_O
;93
xx TSETNB ,RM8,VBYTE,,_S+_O
;94
xx TSETZ ,RM8,VBYTE,,_S+_O
;95
xx TSETNZ ,RM8,VBYTE,,_S+_O
;96
xx TSETBE ,RM8,VBYTE,,_S+_O
;97
xx TSETA ,RM8,VBYTE,,_S+_O
;98
xx TSETS ,RM8,VBYTE,,_S+_O
;99
xx TSETNS ,RM8,VBYTE,,_S+_O
;9A
xx TSETP ,RM8,VBYTE,,_S+_O
;9B
xx TSETNP ,RM8,VBYTE,,_S+_O
;9C
xx TSETL ,RM8,VBYTE,,_S+_O
;9D
xx TSETGE ,RM8,VBYTE,,_S+_O
;9E
xx TSETLE ,RM8,VBYTE,,_S+_O
;9F
xx TSETG ,RM8,VBYTE,,_S+_O
;-----------------------------------------------------------------------------
EXT0FA0:
;A0
xx TPUSH,AddPointW, VWORD,RFS,_S+_R
xx TPUSH,AddPointD,VDWORD,RFS,_S+_R
xx TPUSH,RtnXX ,VQWORD,RFS,_S+_R
;A1
xx TPOP ,AddPointW, VWORD,RFS,_S+_R
xx TPOP ,AddPointD,VDWORD,RFS,_S+_R
xx TPOP ,RtnXX ,VQWORD,RFS,_S+_R
;A2
xx TCPUID,RtnXX,,,
xx TCPUID,RtnXX,,,
xx TCPUID,RtnXX,,,
;A3
xx TBT,RM16R16, VWORD,,_S+_O+_R+_R64
xx TBT,RM32R32,VDWORD,,_S+_O+_R+_R64
xx TBT,RM64R64,VQWORD,,_S+_R48+_O+_R+_R64
;A4
xx TSHLD,RM16R16I8, VWORD,,_S+_O+_R+_R64
xx TSHLD,RM32R32I8,VDWORD,,_S+_O+_R+_R64
xx TSHLD,RM64R64I8,VQWORD,,_S+_R48+_O+_R+_R64
;A5
xx TSHLD,RM16R16CL, VWORD,,_S+_O+_R+_R64
xx TSHLD,RM32R32CL,VDWORD,,_S+_O+_R+_R64
xx TSHLD,RM64R64CL,VQWORD,,_S+_R48+_O+_R+_R64
;A6
xx TCMPXCHG486,Rtn0FA6,,,
xx TCMPXCHG486,Rtn0FA6,,,
xx TCMPXCHG486,Rtn0FA6,,,
;A7
xx TCMPXCHG486,Rtn0FA7,,,
xx TCMPXCHG486,Rtn0FA7,,,
xx TCMPXCHG486,Rtn0FA7,,,
;A8
xx TPUSH,AddPointW, VWORD,RGS,_S+_R
xx TPUSH,AddPointD,VDWORD,RGS,_S+_R
xx TPUSH,RtnXX ,VQWORD,RGS,_S+_R
;A9
xx TPOP ,AddPointW, VWORD,RGS,_S+_R
xx TPOP ,AddPointD,VDWORD,RGS,_S+_R
xx TPOP ,RtnXX ,VQWORD,RGS,_S+_R
;AA
xx TRSM ,RtnXX,,,
xx TRSM ,RtnXX,,,
xx TRSM ,RtnXX,,,
;AB
xx TBTS,RM16R16, VWORD,,_S+_O+_R+_R64+_XA+_XR
xx TBTS,RM32R32,VDWORD,,_S+_O+_R+_R64+_XA+_XR
xx TBTS,RM64R64,VQWORD,,_S+_R48+_O+_R+_R64+_XA+_XR
;AC
xx TSHRD,RM16R16I8, VWORD,,_S+_O+_R+_R64
xx TSHRD,RM32R32I8,VDWORD,,_S+_O+_R+_R64
xx TSHRD,RM64R64I8,VQWORD,,_S+_R48+_O+_R+_R64
;AD
xx TSHRD,RM16R16CL, VWORD,,_S+_O+_R+_R64
xx TSHRD,RM32R32CL,VDWORD,,_S+_O+_R+_R64
xx TSHRD,RM64R64CL,VQWORD,,_S+_R48+_O+_R+_R64
;AE
xx TNULL,Rtn0FAE,,,
xx TNULL,Rtn0FAE,,,
xx TNULL,Rtn0FAE,,,
;AF
xx TIMUL,R16RM16, VWORD,,_S+_O+_R+_R64
xx TIMUL,R32RM32,VDWORD,,_S+_O+_R+_R64
xx TIMUL,R64RM64,VQWORD,,_S+_R48+_O+_R+_R64
;-----------------------------------------------------------------------------
EXT0FB0:
;B0
xx TCMPXCHG,RM8R8,VBYTE,,_S+_O+_XA+_XR
xx TCMPXCHG,RM8R8,VBYTE,,_S+_O+_XA+_XR
xx TCMPXCHG,RM8R8,VBYTE,,_S+_O+_XA+_XR
;B1
xx TCMPXCHG,RM16R16, VWORD,,_S+_O+_R+_R64+_XA+_XR
xx TCMPXCHG,RM32R32,VDWORD,,_S+_O+_R+_R64+_XA+_XR
xx TCMPXCHG,RM64R64,VQWORD,,_S+_R48+_O+_R+_R64+_XA+_XR
;B2
xx TLSS,R16RM163,VDWORD,,_O+_R+_R64
xx TLSS,R32RM323,VFWORD,,_O+_R+_R64
xx TLSS,R64RM643,VTWORD,,_O+_R+_R64+_R48
;B3
xx TBTR,RM16R16, VWORD,,_S+_O+_R+_R64+_XA+_XR
xx TBTR,RM32R32,VDWORD,,_S+_O+_R+_R64+_XA+_XR
xx TBTR,RM64R64,VQWORD,,_S+_R48+_O+_R+_R64+_XA+_XR
;B4
xx TLFS,R16RM163,VDWORD,,_O+_R+_R64
xx TLFS,R32RM323,VFWORD,,_O+_R+_R64
xx TLFS,R64RM643,VTWORD,,_O+_R+_R64+_R48
;B5
xx TLGS,R16RM163,VDWORD,,_O+_R+_R64
xx TLGS,R32RM323,VFWORD,,_O+_R+_R64
xx TLGS,R64RM643,VTWORD,,_O+_R+_R64+_R48
;B6
xx TMOVZX,MOVZXWB,VBYTE,,_R+_R64
xx TMOVZX,MOVZXDB,VBYTE,,_R+_R64
xx TMOVZX,MOVZXQB,VBYTE,,_R+_R64+_R48
;B7
xx TMOVZX,MOVZXWW,VWORD,,_R+_R64
xx TMOVZX,MOVZXDW,VWORD,,_R+_R64
xx TMOVZX,MOVZXQW,VWORD,,_R+_R64+_R48
;B8
xx TPOPCNT,R16RM16B8,,,_R+_R64
xx TPOPCNT,R32RM32B8,,,_R+_R64
xx TPOPCNT,R64RM64B8,,,_R+_R64
;B9
xx TUD1,RtnXX,,,
xx TUD1,RtnXX,,,
xx TUD1,RtnXX,,,
;BA
xx TNULL,EXTINST,,EXT0FBA,_E
xx TNULL,EXTINST,,EXT0FBA,_E
xx TNULL,EXTINST,,EXT0FBA,_E
;BB
xx TBTC,RM16R16, VWORD,,_S+_O+_R+_R64+_XA+_XR
xx TBTC,RM32R32,VDWORD,,_S+_O+_R+_R64+_XA+_XR
xx TBTC,RM64R64,VQWORD,,_S+_R48+_O+_R+_R64+_XA+_XR
;BC
xx TBSF,R16RM16TZ, VWORD,,_S+_O+_R+_R64
xx TBSF,R32RM32TZ,VDWORD,,_S+_O+_R+_R64
xx TBSF,R64RM64TZ,VQWORD,,_S+_R48+_O+_R+_R64
;BD
xx TBSR,R16RM16LZ, VWORD,,_S+_O+_R+_R64
xx TBSR,R32RM32LZ,VDWORD,,_S+_O+_R+_R64
xx TBSR,R64RM64LZ,VQWORD,,_S+_R48+_O+_R+_R64
;BE
xx TMOVSX,MOVSXWB,VBYTE,,_R+_R64
xx TMOVSX,MOVSXDB,VBYTE,,_R+_R64
xx TMOVSX,MOVSXQB,VBYTE,,_R+_R64+_R48
;BF
xx TMOVSX,MOVSXWW,VWORD,,_R+_R64
xx TMOVSX,MOVSXDW,VWORD,,_R+_R64
xx TMOVSX,MOVSXQW,VWORD,,_R+_R64+_R48
;-----------------------------------------------------------------------------
EXT0FC0:
;C0
xx TXADD,RM8R8,VBYTE,,_S+_O+_XA+_XR
xx TXADD,RM8R8,VBYTE,,_S+_O+_XA+_XR
xx TXADD,RM8R8,VBYTE,,_S+_O+_XA+_XR
;C1
xx TXADD,RM16R16, VWORD,,_S+_O+_R+_R64+_XA+_XR
xx TXADD,RM32R32,VDWORD,,_S+_O+_R+_R64+_XA+_XR
xx TXADD,RM64R64,VQWORD,,_S+_R48+_O+_R+_R64+_XA+_XR
;C2
xx TNULL,Rtn0FC2,,,
xx TNULL,Rtn0FC2,,,
xx TNULL,Rtn0FC2,,,
;C3
xx TNULL,Rtn0066F2F3X,,TT0FC3,_T+_3
xx TNULL,Rtn0066F2F3X,,TT0FC3,_T+_3
xx TNULL,Rtn0066F2F3X,,TT0FC3,_T+_3
;C4
xx TNULL,Rtn0066F2F3X,,TT0FC4,_T
xx TNULL,Rtn0066F2F3X,,TT0FC4,_T
xx TNULL,Rtn0066F2F3X,,TT0FC4,_T
;C5
xx TNULL,Rtn0066F2F3X,,TT0FC5,_T+_3
xx TNULL,Rtn0066F2F3X,,TT0FC5,_T+_3
xx TNULL,Rtn0066F2F3X,,TT0FC5,_T+_3
;C6
xx TNULL,Rtn0066F2F3X,,TT0FC6,_T
xx TNULL,Rtn0066F2F3X,,TT0FC6,_T
xx TNULL,Rtn0066F2F3X,,TT0FC6,_T
;C7
xx TCMPXCHG8B,Rtn0FC7,,,
xx TCMPXCHG8B,Rtn0FC7,,,
xx TCMPXCHG8B,Rtn0FC7,,,
;C8
xx TBSWAP,RtnBSWAP,,,_R
xx TBSWAP,RtnBSWAP,,,_R
xx TBSWAP,RtnBSWAP,,,_R+_R48
;C9
xx TBSWAP,RtnBSWAP,,,_R
xx TBSWAP,RtnBSWAP,,,_R
xx TBSWAP,RtnBSWAP,,,_R+_R48
;CA
xx TBSWAP,RtnBSWAP,,,_R
xx TBSWAP,RtnBSWAP,,,_R
xx TBSWAP,RtnBSWAP,,,_R+_R48
;CB
xx TBSWAP,RtnBSWAP,,,_R
xx TBSWAP,RtnBSWAP,,,_R
xx TBSWAP,RtnBSWAP,,,_R+_R48
;CC
xx TBSWAP,RtnBSWAP,,,_R
xx TBSWAP,RtnBSWAP,,,_R
xx TBSWAP,RtnBSWAP,,,_R+_R48
;CD
xx TBSWAP,RtnBSWAP,,,_R
xx TBSWAP,RtnBSWAP,,,_R
xx TBSWAP,RtnBSWAP,,,_R+_R48
;CE
xx TBSWAP,RtnBSWAP,,,_R
xx TBSWAP,RtnBSWAP,,,_R
xx TBSWAP,RtnBSWAP,,,_R+_R48
;CF
xx TBSWAP,RtnBSWAP,,,_R
xx TBSWAP,RtnBSWAP,,,_R
xx TBSWAP,RtnBSWAP,,,_R+_R48
;-----------------------------------------------------------------------------
EXT0FD0:;One table
;D0
xx TNULL,Rtn0066F2F3,,TT0FD0,_T
;D1
xx TPSRLW ,RtnMMXM,VQWORD,,_O
;D2
xx TPSRLD ,RtnMMXM,VQWORD,,_O
;D3
xx TPSRLQ ,RtnMMXM,VQWORD,,_O
;D4
xx TPADDQ ,RtnMMXM,VQWORD,,_O
;D5
xx TPMULLW,RtnMMXM,VQWORD,,_O
;D6
xx TNULL,Rtn0066F2F3X,,TT0FD6,_T+_3
;D7
xx TNULL,Rtn0066F2F3X,,TT0FD7,_T+_3
;D8
xx TPSUBUSB,RtnMMXM,VQWORD,,_O
;D9
xx TPSUBUSW,RtnMMXM,VQWORD,,_O
;DA
xx TPMINUB ,RtnMMXM,VQWORD,,_O
;DB
xx TPAND ,RtnMMXM,VQWORD,,_O
;DC
xx TPADDUSB,RtnMMXM,VQWORD,,_O
;DD
xx TPADDUSW,RtnMMXM,VQWORD,,_O
;DE
xx TPMAXUB ,RtnMMXM,VQWORD,,_O
;DF
xx TPANDN ,RtnMMXM,VQWORD,,_O
;-----------------------------------------------------------------------------
EXT0FE0:;One table
;E0
xx TPAVGB ,RtnMMXM,VQWORD,,_O
;E1
xx TPSRAW ,RtnMMXM,VQWORD,,_O
;E2
xx TPSRAD ,RtnMMXM,VQWORD,,_O
;E3
xx TPAVGW ,RtnMMXM,VQWORD,,_O
;E4
xx TPMULHUW,RtnMMXM,VQWORD,,_O
;E5
xx TPMULHW ,RtnMMXM,VQWORD,,_O
;E6
xx TNULL,Rtn0066F2F3 ,,TT0FE6,_T
;E7
xx TNULL,Rtn0066F2F3X,,TT0FE7,_T+_3
;E8
xx TPSUBSB ,RtnMMXM,VQWORD,,_O
;E9
xx TPSUBSW ,RtnMMXM,VQWORD,,_O
;EA
xx TPMINSW ,RtnMMXM,VQWORD,,_O
;EB
xx TPOR ,RtnMMXM,VQWORD,,_O
;EC
xx TPADDSB ,RtnMMXM,VQWORD,,_O
;ED
xx TPADDSW ,RtnMMXM,VQWORD,,_O
;EE
xx TPMAXSW ,RtnMMXM,VQWORD,,_O
;EF
xx TPXOR ,RtnMMXM,VQWORD,,_O
;-----------------------------------------------------------------------------
EXT0FF0:;One table
;F0
xx TNULL ,Rtn0066F2F3,,TT0FF0,_T+_3
;F1
xx TPSLLW ,RtnMMXM,VQWORD,,_O
;F2
xx TPSLLD ,RtnMMXM,VQWORD,,_O
;F3
xx TPSLLQ ,RtnMMXM,VQWORD,,_O
;F4
xx TPMULUDQ,RtnMMXM,VQWORD,,_O
;F5
xx TPMADDWD,RtnMMXM,VQWORD,,_O
;F6
xx TPSADBW ,RtnMMXM,VQWORD,,_O
;F7
xx TNULL ,Rtn0066F2F3X,,TT0FF7,_T+_3
;F8
xx TPSUBB ,RtnMMXM,VQWORD,,_O
;F9
xx TPSUBW ,RtnMMXM,VQWORD,,_O
;FA
xx TPSUBD ,RtnMMXM,VQWORD,,_O
;FB
xx TPSUBQ ,RtnMMXM,VQWORD,,_O
;FC
xx TPADDB ,RtnMMXM,VQWORD,,_O
;FD
xx TPADDW ,RtnMMXM,VQWORD,,_O
;FE
xx TPADDD ,RtnMMXM,VQWORD,,_O
;FF
xx TUD0 ,RtnXX,,,
;-----------------------------------------------------------------------------
/programs/develop/koldbg/disasm/tables.inc
0,0 → 1,1800
;-----------------------------------------------------------------------------
macro dr [Name]
{
if Name eq
dw 0
else
dw Name-RtnXX
end if
}
;-----------------------------------------------------------------------------
N0F1A: dw TBNDCL,TBNDCU,TBNDMOV ,TBNDLDX
R0F1A: dr RBNDCL,RBNDCU,RBNDMOV2,RBNDLDX
;-----------------------------------------------------------------------------
N0F1B: dw TBNDMK,TBNDCN,TBNDMOV ,TBNDSTX
R0F1B: dr RBNDMK,RBNDCN,RBNDMOV1,RBNDSTX
;-----------------------------------------------------------------------------
TTXXXX:
;-----------------------------------------------------------------------------
TT0F10: dw TMOVUPS ;00
dw TMOVUPD ;66
dw TMOVSD ;F2
dw TMOVSS ;F3
;ch=3, dwdwdwdw
db VXWORD+80h ;00
db VXWORD+80h ;66
db VQWORD+80h ;F2
db VDWORD+80h ;F3
dr R32RM32X ;00
dr R32RM32X ;66
dr R32RM32X ;F2
dr R32RM32X ;F3
;-----------------------------------------------------------------------------
TT0F11: dw TMOVUPS ;00
dw TMOVUPD ;66
dw TMOVSD ;F2
dw TMOVSS ;F3
;ch=3, dwdwdwdw
db VXWORD+80h ;00
db VXWORD+80h ;66
db VQWORD+80h ;F2
db VDWORD+80h ;F3
dr RM32R32X ;00
dr RM32R32X ;66
dr RM32R32X ;F2
dr RM32R32X ;F3
;-----------------------------------------------------------------------------
TT0F12: dw TMOVLPS ;00
dw TMOVLPD ;66
dw TMOVDDUP ;F2
dw TMOVSLDUP ;F3
dw TMOVHLPS ;00 ch=3
dw 0 ;66 ch=3
dw TMOVDDUP ;F2 ch=3
dw TMOVSLDUP ;F3 ch=3
db VQWORD+80h ;00
db VQWORD+80h ;66
db VQWORD+80h ;F2
db VXWORD+80h ;F3
dr R32RM32X ;00
dr R32RM32X ;66
dr R32RM32X ;F2
dr R32RM32X ;F3
;-----------------------------------------------------------------------------
TT0F13: dw TMOVLPS ;00
dw TMOVLPD ;66
dw 0 ;F2
dw 0 ;F3
dw 0 ;00 ch=3
dw 0 ;66 ch=3
dw 0 ;F2 ch=3
dw 0 ;F3 ch=3
db VQWORD+80h ;00
db VQWORD+80h ;66
db 0 ;F2
db 0 ;F3
dr RM32R32X ;00
dr RM32R32X ;66
dr RM32R32X ;F2
dr RM32R32X ;F3
;-----------------------------------------------------------------------------
TT0F14: dw TUNPCKLPS ;00
dw TUNPCKLPD ;66
dw 0 ;F2
dw 0 ;F3
;ch=3, dwdwdwdw
db VXWORD+80h ;00
db VXWORD+80h ;66
db 0 ;F2
db 0 ;F3
dr R32RM32X ;00
dr R32RM32X ;66
dr ;F2
dr ;F3
;-----------------------------------------------------------------------------
TT0F15: dw TUNPCKHPS ;00
dw TUNPCKHPD ;66
dw 0 ;F2
dw 0 ;F3
;ch=3, dwdwdwdw
db VXWORD+80h ;00
db VXWORD+80h ;66
db 0 ;F2
db 0 ;F3
dr R32RM32X ;00
dr R32RM32X ;66
dr ;F2
dr ;F3
;-----------------------------------------------------------------------------
TT0F16: dw TMOVHPS ;00
dw TMOVHPD ;66
dw 0 ;F2
dw TMOVSHDUP ;F3
dw TMOVLHPS ;00 ch=3
dw 0 ;66 ch=3
dw 0 ;F2 ch=3
dw TMOVSHDUP ;F3 ch=3
db VQWORD+80h ;00
db VQWORD+80h ;66
db 0 ;F2
db VXWORD+80h ;F3
dr R32RM32X ;00
dr R32RM32X ;66
dr ;F2
dr R32RM32X ;F3
;-----------------------------------------------------------------------------
TT0F17: dw TMOVHPS ;00
dw TMOVHPD ;66
dw 0 ;F2
dw 0 ;F3
dw 0 ;00 ch=3
dw 0 ;66 ch=3
dw 0 ;F2 ch=3
dw 0 ;F3 ch=3
db VQWORD+80h ;00
db VQWORD+80h ;66
db 0 ;F2
db 0 ;F3
dr RM32R32X ;00
dr RM32R32X ;66
dr RM32R32X ;F2
dr RM32R32X ;F3
;-----------------------------------------------------------------------------
TT0F28: dw TMOVAPS ;00
dw TMOVAPD ;66
dw 0 ;F2
dw 0 ;F3
db VXWORD+80h ;00
db VXWORD+80h ;66
db 0 ;F2
db 0 ;F3
dr R32RM32X ;00
dr R32RM32X ;66
dr R32RM32X ;F2
dr R32RM32X ;F3
;-----------------------------------------------------------------------------
TT0F29: dw TMOVAPS ;00
dw TMOVAPD ;66
dw 0 ;F2
dw 0 ;F3
db VXWORD+80h ;00
db VXWORD+80h ;66
db 0 ;F2
db 0 ;F3
dr RM32R32X ;00
dr RM32R32X ;66
dr RM32R32X ;F2
dr RM32R32X ;F3
;-----------------------------------------------------------------------------
TT0F2B: dw TMOVNTPS ;00
dw TMOVNTPD ;66
dw TMOVNTSD ;F2
dw TMOVNTSS ;F3
dw 0 ;00 ch=3
dw 0 ;66 ch=3
dw 0 ;F2 ch=3
dw 0 ;F3 ch=3
db VXWORD+80h ;00
db VXWORD+80h ;66
db VQWORD+80h ;F2
db VDWORD+80h ;F3
dr RM32R32X ;00
dr RM32R32X ;66
dr RM32R32X ;F2
dr RM32R32X ;F3
;-----------------------------------------------------------------------------
TT0F2E: dw TUCOMISS ;00
dw TUCOMISD ;66
dw 0 ;F2
dw 0 ;F3
db VDWORD+80h ;00
db VQWORD+80h ;66
db 0 ;F2
db 0 ;F3
dr R32RM32X ;00
dr R32RM32X ;66
dr R32RM32X ;F2
dr R32RM32X ;F3
;-----------------------------------------------------------------------------
TT0F2F: dw TCOMISS ;00
dw TCOMISD ;66
dw 0 ;F2
dw 0 ;F3
db VDWORD+80h ;00
db VQWORD+80h ;66
db 0 ;F2
db 0 ;F3
dr R32RM32X ;00
dr R32RM32X ;66
dr R32RM32X ;F2
dr R32RM32X ;F3
;-----------------------------------------------------------------------------
TT0F38: dw TNULL ;00
dw TNULL ;66
dw TNULL ;F2
dw TNULL ;F3
db 0 ;00
db 0 ;66
db 0 ;F2
db 0 ;F3
dr Rtn0F3800 ;00
dr Rtn0F3866 ;66
dr Rtn0F38F2 ;F2
dr Rtn0F38F3 ;F3
;-----------------------------------------------------------------------------
TT0F51: dw TSQRTPS ;00
dw TSQRTPD ;66
dw TSQRTSD ;F2
dw TSQRTSS ;F3
db VXWORD+80h ;00
db VXWORD+80h ;66
db VQWORD+80h ;F2
db VDWORD+80h ;F3
dr R32RM32X ;00
dr R32RM32X ;66
dr R32RM32X ;F2
dr R32RM32X ;F3
;-----------------------------------------------------------------------------
TT0F52: dw TRSQRTPS ;00
dw 0 ;66
dw 0 ;F2
dw TRSQRTSS ;F3
db VXWORD+80h ;00
db 0 ;66
db 0 ;F2
db VDWORD+80h ;F3
dr R32RM32X ;00
dr R32RM32X ;66
dr R32RM32X ;F2
dr R32RM32X ;F3
;-----------------------------------------------------------------------------
TT0F53: dw TRCPPS ;00
dw 0 ;66
dw 0 ;F2
dw TRCPSS ;F3
db VXWORD+80h ;00
db 0 ;66
db 0 ;F2
db VDWORD+80h ;F3
dr R32RM32X ;00
dr R32RM32X ;66
dr R32RM32X ;F2
dr R32RM32X ;F3
;-----------------------------------------------------------------------------
TT0F54: dw TANDPS ;00
dw TANDPD ;66
dw 0 ;F2
dw 0 ;F3
db VXWORD+80h ;00
db VXWORD+80h ;66
db 0 ;F2
db 0 ;F3
dr R32RM32X ;00
dr R32RM32X ;66
dr R32RM32X ;F2
dr R32RM32X ;F3
;-----------------------------------------------------------------------------
TT0F55: dw TANDNPS ;00
dw TANDNPD ;66
dw 0 ;F2
dw 0 ;F3
db VXWORD+80h ;00
db VXWORD+80h ;66
db 0 ;F2
db 0 ;F3
dr R32RM32X ;00
dr R32RM32X ;66
dr R32RM32X ;F2
dr R32RM32X ;F3
;-----------------------------------------------------------------------------
TT0F56: dw TORPS ;00
dw TORPD ;66
dw 0 ;F2
dw 0 ;F3
db VXWORD+80h ;00
db VXWORD+80h ;66
db 0 ;F2
db 0 ;F3
dr R32RM32X ;00
dr R32RM32X ;66
dr R32RM32X ;F2
dr R32RM32X ;F3
;-----------------------------------------------------------------------------
TT0F57: dw TXORPS ;00
dw TXORPD ;66
dw 0 ;F2
dw 0 ;F3
db VXWORD+80h ;00
db VXWORD+80h ;66
db 0 ;F2
db 0 ;F3
dr R32RM32X ;00
dr R32RM32X ;66
dr R32RM32X ;F2
dr R32RM32X ;F3
;-----------------------------------------------------------------------------
TT0F58: dw TADDPS ;00
dw TADDPD ;66
dw TADDSD ;F2
dw TADDSS ;F3
db VXWORD+80h ;00
db VXWORD+80h ;66
db VQWORD+80h ;F2
db VDWORD+80h ;F3
dr R32RM32X ;00
dr R32RM32X ;66
dr R32RM32X ;F2
dr R32RM32X ;F3
;-----------------------------------------------------------------------------
TT0F59: dw TMULPS ;00
dw TMULPD ;66
dw TMULSD ;F2
dw TMULSS ;F3
db VXWORD+80h ;00
db VXWORD+80h ;66
db VQWORD+80h ;F2
db VDWORD+80h ;F3
dr R32RM32X ;00
dr R32RM32X ;66
dr R32RM32X ;F2
dr R32RM32X ;F3
;-----------------------------------------------------------------------------
TT0F5A: dw TCVTPS2PD ;00
dw TCVTPD2PS ;66
dw TCVTSD2SS ;F2
dw TCVTSS2SD ;F3
db VQWORD+80h ;00
db VXWORD+80h ;66
db VQWORD+80h ;F2
db VDWORD+80h ;F3
dr R32RM32X ;00
dr R32RM32X ;66
dr R32RM32X ;F2
dr R32RM32X ;F3
;-----------------------------------------------------------------------------
TT0F5B: dw TCVTDQ2PS ;00
dw TCVTPS2DQ ;66
dw 0 ;F2
dw TCVTTPS2DQ ;F3
db VXWORD+80h ;00
db VXWORD+80h ;66
db 0 ;F2
db VXWORD+80h ;F3
dr R32RM32X ;00
dr R32RM32X ;66
dr R32RM32X ;F2
dr R32RM32X ;F3
;-----------------------------------------------------------------------------
TT0F5C: dw TSUBPS ;00
dw TSUBPD ;66
dw TSUBSD ;F2
dw TSUBSS ;F3
db VXWORD+80h ;00
db VXWORD+80h ;66
db VQWORD+80h ;F2
db VDWORD+80h ;F3
dr R32RM32X ;00
dr R32RM32X ;66
dr R32RM32X ;F2
dr R32RM32X ;F3
;-----------------------------------------------------------------------------
TT0F5D: dw TMINPS ;00
dw TMINPD ;66
dw TMINSD ;F2
dw TMINSS ;F3
db VXWORD+80h ;00
db VXWORD+80h ;66
db VQWORD+80h ;F2
db VDWORD+80h ;F3
dr R32RM32X ;00
dr R32RM32X ;66
dr R32RM32X ;F2
dr R32RM32X ;F3
;-----------------------------------------------------------------------------
TT0F5E: dw TDIVPS ;00
dw TDIVPD ;66
dw TDIVSD ;F2
dw TDIVSS ;F3
db VXWORD+80h ;00
db VXWORD+80h ;66
db VQWORD+80h ;F2
db VDWORD+80h ;F3
dr R32RM32X ;00
dr R32RM32X ;66
dr R32RM32X ;F2
dr R32RM32X ;F3
;-----------------------------------------------------------------------------
TT0F5F: dw TMAXPS ;00
dw TMAXPD ;66
dw TMAXSD ;F2
dw TMAXSS ;F3
db VXWORD+80h ;00
db VXWORD+80h ;66
db VQWORD+80h ;F2
db VDWORD+80h ;F3
dr R32RM32X ;00
dr R32RM32X ;66
dr R32RM32X ;F2
dr R32RM32X ;F3
;-----------------------------------------------------------------------------
TT0F6F: dw TMOVQ ;00
dw TMOVDQA ;66
dw 0 ;F2
dw TMOVDQU ;F3
db VQWORD+80h ;00
db VXWORD+80h ;66
db 0 ;F2
db VXWORD+80h ;F3
dr RtnMM2MM ;00
dr R32RM32X ;66
dr R32RM32X ;F2
dr R32RM32X ;F3
;-----------------------------------------------------------------------------
TT0F7C: dw 0 ;00
dw THADDPD ;66
dw THADDPS ;F2
dw 0 ;F3
db 0 ;00
db VXWORD+80h ;66
db VXWORD+80h ;F2
db 0 ;F3
dr R32RM32X ;00
dr R32RM32X ;66
dr R32RM32X ;F2
dr R32RM32X ;F3
;-----------------------------------------------------------------------------
TT0F7D: dw 0 ;00
dw THSUBPD ;66
dw THSUBPS ;F2
dw 0 ;F3
db 0 ;00
db VXWORD+80h ;66
db VXWORD+80h ;F2
db 0 ;F3
dr R32RM32X ;00
dr R32RM32X ;66
dr R32RM32X ;F2
dr R32RM32X ;F3
;-----------------------------------------------------------------------------
TT0F7F: dw TMOVQ ;00
dw TMOVDQA ;66
dw 0 ;F2
dw TMOVDQU ;F3
db VQWORD+80h ;00
db VXWORD+80h ;66
db 0 ;F2
db VXWORD+80h ;F3
dr RtnMM4MM ;00
dr RM32R32X ;66
dr RM32R32X ;F2
dr RM32R32X ;F3
;-----------------------------------------------------------------------------
TT0FD0: dw 0 ;00
dw TADDSUBPD ;66
dw TADDSUBPS ;F2
dw 0 ;F3
db 0 ;00
db VXWORD+80h ;66
db VXWORD+80h ;F2
db 0 ;F3
dr R32RM32X ;00
dr R32RM32X ;66
dr R32RM32X ;F2
dr R32RM32X ;F3
;-----------------------------------------------------------------------------
TT0FE6: dw 0 ;00
dw TCVTTPD2DQ ;66
dw TCVTPD2DQ ;F2
dw TCVTDQ2PD ;F3
db 0 ;00
db VXWORD+80h ;66
db VXWORD+80h ;F2
db VQWORD+80h ;F3
dr R32RM32X ;00
dr R32RM32X ;66
dr R32RM32X ;F2
dr R32RM32X ;F3
;-----------------------------------------------------------------------------
TT0FF0: dw 0 ;00
dw 0 ;66
dw TLDDQU ;F2
dw 0 ;F3
dw 0 ;00 ch=3
dw 0 ;66 ch=3
dw 0 ;F2 ch=3
dw 0 ;F3 ch=3
db 0 ;00
db 0 ;66
db VXWORD+80h ;F2
db 0 ;F3
dr R32RM32X ;00
dr R32RM32X ;66
dr R32RM32X ;F2
dr R32RM32X ;F3
;-----------------------------------------------------------------------------
; 80h - REX.W -> RD -> RQ
; 40h - REX.W -> QWORD
; 20h - REX.W -> ...Q
; 10h - IMMB
;-----------------------------------------------------------------------------
TT0F2A: dw TCVTPI2PS ;00
dw TCVTPI2PD ;66
dw TCVTSI2SD ;F2
dw TCVTSI2SS ;F3
;ch=3 dwdwdwdw
db VQWORD+80h ;00
db VQWORD+80h ;66
db VDWORD ;F2
db VDWORD ;F3
dr R32RM32X ;00
dr R32RM32X ;66
dr R32RM32X ;F2
dr R32RM32X ;F3
db XMMRG,MMXRG ;00
db XMMRG,MMXRG ;66
db XMMRG,GPR32+80h+40h ;F2
db XMMRG,GPR32+80h+40h ;F3
;-----------------------------------------------------------------------------
TT0F2C: dw TCVTTPS2PI ;00
dw TCVTTPD2PI ;66
dw TCVTTSD2SI ;F2
dw TCVTTSS2SI ;F3
db VQWORD+80h ;00
db VXWORD+80h ;66
db VQWORD+80h ;F2
db VDWORD+80h ;F3
dr R32RM32X ;00
dr R32RM32X ;66
dr R32RM32X ;F2
dr R32RM32X ;F3
db MMXRG,XMMRG ;00
db MMXRG,XMMRG ;66
db GPR32+80h,XMMRG ;F2
db GPR32+80h,XMMRG ;F3
;-----------------------------------------------------------------------------
TT0F2D: dw TCVTPS2PI ;00
dw TCVTPD2PI ;66
dw TCVTSD2SI ;F2
dw TCVTSS2SI ;F3
db VQWORD+80h ;00
db VXWORD+80h ;66
db VQWORD+80h ;F2
db VDWORD+80h ;F3
dr R32RM32X ;00
dr R32RM32X ;66
dr R32RM32X ;F2
dr R32RM32X ;F3
db MMXRG,XMMRG ;00
db MMXRG,XMMRG ;66
db GPR32+80h,XMMRG ;F2
db GPR32+80h,XMMRG ;F3
;-----------------------------------------------------------------------------
TT0F50: dw 0 ;00
dw 0 ;66
dw 0 ;F2
dw 0 ;F3
dw TMOVMSKPS ;00 ch=3
dw TMOVMSKPD ;66 ch=3
dw 0 ;F2 ch=3
dw 0 ;F3 ch=3
db 0 ;00
db 0 ;66
db 0 ;F2
db 0 ;F3
dr R32RM32X ;00
dr R32RM32X ;66
dr ;F2
dr ;F3
db GPR32+80h,XMMRG ;00
db GPR32+80h,XMMRG ;66
db 0,0 ;F2
db 0,0 ;F3
;-----------------------------------------------------------------------------
TT0F6E: dw TMOVD ;00
dw TMOVD ;66
dw 0 ;F2
dw 0 ;F3
db VDWORD+80h ;00
db VDWORD+80h ;66
db 0 ;F2
db 0 ;F3
dr R32RM32X ;00
dr R32RM32X ;66
dr ;F2
dr ;F3
db MMXRG,GPR32+20h+40h+80h;00
db XMMRG,GPR32+20h+40h+80h;66
db 0,0 ;F2
db 0,0 ;F3
;-----------------------------------------------------------------------------
TT0F70: dw TPSHUFW ;00
dw TPSHUFD ;66
dw TPSHUFLW ;F2
dw TPSHUFHW ;F3
db VQWORD+80h ;00
db VXWORD+80h ;66
db VXWORD+80h ;F2
db VXWORD+80h ;F3
dr R32RM32X ;00
dr R32RM32X ;66
dr R32RM32X ;F2
dr R32RM32X ;F3
db MMXRG,MMXRG+10h ;00
db XMMRG,XMMRG+10h ;66
db XMMRG,XMMRG+10h ;F2
db XMMRG,XMMRG+10h ;F3
;-----------------------------------------------------------------------------
TT0F7E: dw TMOVD ;00
dw TMOVD ;66
dw 0 ;F2
dw TMOVQ ;F3
db VDWORD+80h ;00
db VDWORD+80h ;66
db 0 ;F2
db VQWORD+80h ;F3
dr RM32R32X ;00
dr RM32R32X ;66
dr RM32R32X ;F2
dr R32RM32X ;F3
db GPR32+20h+40h+80h,MMXRG;00
db GPR32+20h+40h+80h,XMMRG;66
db 0,0 ;F2
db XMMRG,XMMRG ;F3
;-----------------------------------------------------------------------------
TT0FC3: dw TMOVNTI ;00
dw 0 ;66
dw 0 ;F2
dw 0 ;F3
dw 0 ;00 ch=3
dw 0 ;66 ch=3
dw 0 ;F2 ch=3
dw 0 ;F3 ch=3
db VDWORD+80h ;00
db 0 ;66
db 0 ;F2
db 0 ;F3
dr RM32R32X ;00
dr RM32R32X ;66
dr RM32R32X ;F2
dr RM32R32X ;F3
db 0,GPR32+80h+40h ;00
db 0,0 ;66
db 0,0 ;F2
db 0,0 ;F3
;-----------------------------------------------------------------------------
TT0FC4: dw TPINSRW ;00
dw TPINSRW ;66
dw 0 ;F2
dw 0 ;F3
db VWORD+80h ;00
db VWORD+80h ;66
db 0 ;F2
db 0 ;F3
dr R32RM32X ;00
dr R32RM32X ;66
dr R32RM32X ;F2
dr R32RM32X ;F3
db MMXRG,GPR32+80h+10h ;00
db XMMRG,GPR32+80h+10h ;66
db 0,0 ;F2
db 0,0 ;F3
;-----------------------------------------------------------------------------
TT0FC5: dw 0 ;00
dw 0 ;66
dw 0 ;F2
dw 0 ;F3
dw TPEXTRW ;00 ch=3
dw TPEXTRW ;66 ch=3
dw 0 ;F2 ch=3
dw 0 ;F3 ch=3
db 0 ;00
db 0 ;66
db 0 ;F2
db 0 ;F3
dr R32RM32X ;00
dr R32RM32X ;66
dr R32RM32X ;F2
dr R32RM32X ;F3
db GPR32+80h+10h,MMXRG ;00
db GPR32+80h+10h,XMMRG ;66
db 0,0 ;F2
db 0,0 ;F3
;-----------------------------------------------------------------------------
TT0FC6: dw TSHUFPS ;00
dw TSHUFPD ;66
dw 0 ;F2
dw 0 ;F3
db VXWORD+80h ;00
db VXWORD+80h ;66
db 0 ;F2
db 0 ;F3
dr R32RM32X ;00
dr R32RM32X ;66
dr R32RM32X ;F2
dr R32RM32X ;F3
db XMMRG,XMMRG+10h ;00
db XMMRG,XMMRG+10h ;66
db 0,0 ;F2
db 0,0 ;F3
;-----------------------------------------------------------------------------
TT0FD6: dw 0 ;00
dw TMOVQ ;66
dw 0 ;F2
dw 0 ;F3
dw 0 ;00 ch=3
dw TMOVQ ;66 ch=3
dw TMOVDQ2Q ;F2 ch=3
dw TMOVQ2DQ ;F3 ch=3
db 0 ;00
db VQWORD+80h ;66
db 0 ;F2
db 0 ;F3
dr R32RM32X ;00
dr RM32R32X ;66
dr R32RM32X ;F2
dr R32RM32X ;F3
db XMMRG,XMMRG ;00
db XMMRG,XMMRG ;66
db MMXRG,XMMRG ;F2
db XMMRG,MMXRG ;F3
;-----------------------------------------------------------------------------
TT0FD7: dw 0 ;00
dw 0 ;66
dw 0 ;F2
dw 0 ;F3
dw TPMOVMSKB ;00 ch=3
dw TPMOVMSKB ;66 ch=3
dw 0 ;F2 ch=3
dw 0 ;F3 ch=3
db 0 ;00
db 0 ;66
db 0 ;F2
db 0 ;F3
dr R32RM32X ;00
dr R32RM32X ;66
dr R32RM32X ;F2
dr R32RM32X ;F3
db GPR32+80h,MMXRG ;00
db GPR32+80h,XMMRG ;66
db 0,0 ;F2
db 0,0 ;F3
;-----------------------------------------------------------------------------
TT0FE7: dw TMOVNTQ ;00
dw TMOVNTDQ ;66
dw 0 ;F2
dw 0 ;F3
dw 0 ;00 ch=3
dw 0 ;66 ch=3
dw 0 ;F2 ch=3
dw 0 ;F3 ch=3
db VQWORD+80h ;00
db VXWORD+80h ;66
db 0 ;F2
db 0 ;F3
dr RM32R32X ;00
dr RM32R32X ;66
dr RM32R32X ;F2
dr RM32R32X ;F3
db 0,MMXRG ;00
db 0,XMMRG ;66
db 0,0 ;F2
db 0,0 ;F3
;-----------------------------------------------------------------------------
TT0FF7: dw 0 ;00
dw 0 ;66
dw 0 ;F2
dw 0 ;F3
dw TMASKMOVQ ;00 ch=3
dw TMASKMOVDQU ;66 ch=3
dw 0 ;F2 ch=3
dw 0 ;F3 ch=3
db 0 ;00
db 0 ;66
db 0 ;F2
db 0 ;F3
dr R32RM32X ;00
dr R32RM32X ;66
dr R32RM32X ;F2
dr R32RM32X ;F3
db MMXRG,MMXRG ;00
db XMMRG,XMMRG ;66
db 0,0 ;F2
db 0,0 ;F3
;-----------------------------------------------------------------------------
StrTabXOPA:
XOPc $10,0,0,XOPL ,RtnTBM0,TNULL
XOPc $12,0,0,0 ,RtnLWPxx,TNULL
dd -1
;-----------------------------------------------------------------------------
StrTabXOP9:
XOPc $01,0,0,XOPL ,RtnTBM1,TNULL
XOPc $02,0,0,XOPL ,RtnTBM2,TNULL
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
XOPc $12,0,0,XOPV ,RtnLWPCB,TNULL
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
XOPc $81,VOWORD+80h,VYWORD+80h,XOPV or XOPO or XOPW ,RtnXOP,TFRCZPD
XOPc $80,VOWORD+80h,VYWORD+80h,XOPV or XOPO or XOPW ,RtnXOP,TFRCZPS
XOPc $83,VQWORD+80h,0,XOPV or XOPO or XOPL ,RtnXOP,TFRCZSD
XOPc $82,VDWORD+80h,0,XOPV or XOPO or XOPL ,RtnXOP,TFRCZSS
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
XOPc $C1,VOWORD+80h,0,XOPL or XOPW ,RtnXOP,TPHADDBW
XOPc $C2,VOWORD+80h,0,XOPL or XOPW ,RtnXOP,TPHADDBD
XOPc $C3,VOWORD+80h,0,XOPL or XOPW ,RtnXOP,TPHADDBQ
XOPc $C6,VOWORD+80h,0,XOPL or XOPW ,RtnXOP,TPHADDWD
XOPc $C7,VOWORD+80h,0,XOPL or XOPW ,RtnXOP,TPHADDWQ
XOPc $CB,VOWORD+80h,0,XOPL or XOPW ,RtnXOP,TPHADDDQ
XOPc $D1,VOWORD+80h,0,XOPL or XOPW ,RtnXOP,TPHADDUBW
XOPc $D2,VOWORD+80h,0,XOPL or XOPW ,RtnXOP,TPHADDUBD
XOPc $D3,VOWORD+80h,0,XOPL or XOPW ,RtnXOP,TPHADDUBQ
XOPc $D6,VOWORD+80h,0,XOPL or XOPW ,RtnXOP,TPHADDUWD
XOPc $D7,VOWORD+80h,0,XOPL or XOPW ,RtnXOP,TPHADDUWQ
XOPc $DB,VOWORD+80h,0,XOPL or XOPW ,RtnXOP,TPHADDUDQ
XOPc $E1,VOWORD+80h,0,XOPL or XOPW ,RtnXOP,TPHSUBBW
XOPc $E2,VOWORD+80h,0,XOPL or XOPW ,RtnXOP,TPHSUBWD
XOPc $E3,VOWORD+80h,0,XOPL or XOPW ,RtnXOP,TPHSUBDQ
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
XOPc $90,VOWORD+80h,0,XOPL ,XOP3Rtn,TPROTB
XOPc $91,VOWORD+80h,0,XOPL ,XOP3Rtn,TPROTW
XOPc $92,VOWORD+80h,0,XOPL ,XOP3Rtn,TPROTD
XOPc $93,VOWORD+80h,0,XOPL ,XOP3Rtn,TPROTQ
XOPc $98,VOWORD+80h,0,XOPL ,XOP3Rtn,TPSHAB
XOPc $99,VOWORD+80h,0,XOPL ,XOP3Rtn,TPSHAW
XOPc $9A,VOWORD+80h,0,XOPL ,XOP3Rtn,TPSHAD
XOPc $9B,VOWORD+80h,0,XOPL ,XOP3Rtn,TPSHAQ
XOPc $94,VOWORD+80h,0,XOPL ,XOP3Rtn,TPSHLB
XOPc $95,VOWORD+80h,0,XOPL ,XOP3Rtn,TPSHLW
XOPc $96,VOWORD+80h,0,XOPL ,XOP3Rtn,TPSHLD
XOPc $97,VOWORD+80h,0,XOPL ,XOP3Rtn,TPSHLQ
dd -1
;-----------------------------------------------------------------------------
StrTabXOP8:
XOPc $A2,VOWORD+80h,VYWORD+80h,XOPI ,XOP4Rtn,TPCMOV
XOPc $CC,VOWORD+80h,0,XOPL or XOPW ,SuffixCOMB,TPCOM
XOPc $CD,VOWORD+80h,0,XOPL or XOPW ,SuffixCOMW,TPCOM
XOPc $CE,VOWORD+80h,0,XOPL or XOPW ,SuffixCOMD,TPCOM
XOPc $CF,VOWORD+80h,0,XOPL or XOPW ,SuffixCOMQ,TPCOM
XOPc $EC,VOWORD+80h,0,XOPL or XOPW ,SuffixCOMUB,TPCOM
XOPc $ED,VOWORD+80h,0,XOPL or XOPW ,SuffixCOMUW,TPCOM
XOPc $EE,VOWORD+80h,0,XOPL or XOPW ,SuffixCOMUD,TPCOM
XOPc $EF,VOWORD+80h,0,XOPL or XOPW ,SuffixCOMUQ,TPCOM
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
XOPc $9E,VOWORD+80h,0,XOPL or XOPW or XOPI ,XOP4Rtn,TPMACSDD
XOPc $9F,VOWORD+80h,0,XOPL or XOPW or XOPI ,XOP4Rtn,TPMACSDQH
XOPc $97,VOWORD+80h,0,XOPL or XOPW or XOPI ,XOP4Rtn,TPMACSDQL
XOPc $8E,VOWORD+80h,0,XOPL or XOPW or XOPI ,XOP4Rtn,TPMACSSDD
XOPc $8F,VOWORD+80h,0,XOPL or XOPW or XOPI ,XOP4Rtn,TPMACSSDQH
XOPc $87,VOWORD+80h,0,XOPL or XOPW or XOPI ,XOP4Rtn,TPMACSSDQL
XOPc $86,VOWORD+80h,0,XOPL or XOPW or XOPI ,XOP4Rtn,TPMACSSWD
XOPc $85,VOWORD+80h,0,XOPL or XOPW or XOPI ,XOP4Rtn,TPMACSSWW
XOPc $96,VOWORD+80h,0,XOPL or XOPW or XOPI ,XOP4Rtn,TPMACSWD
XOPc $95,VOWORD+80h,0,XOPL or XOPW or XOPI ,XOP4Rtn,TPMACSWW
XOPc $A6,VOWORD+80h,0,XOPL or XOPW or XOPI ,XOP4Rtn,TPMADCSSWD
XOPc $B6,VOWORD+80h,0,XOPL or XOPW or XOPI ,XOP4Rtn,TPMADCSWD
XOPc $A3,VOWORD+80h,0,XOPL or XOPI ,XOP4Rtn,TPPERM
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
XOPc $C0,VOWORD+80h,0,XOPL or XOPW or XOPV ,XOPImm8,TPROTB
XOPc $C1,VOWORD+80h,0,XOPL or XOPW or XOPV ,XOPImm8,TPROTW
XOPc $C2,VOWORD+80h,0,XOPL or XOPW or XOPV ,XOPImm8,TPROTD
XOPc $C3,VOWORD+80h,0,XOPL or XOPW or XOPV ,XOPImm8,TPROTQ
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
dd -1
;-----------------------------------------------------------------------------
C43866:
xC RtnC4C5, VEXV or VEX2 or VEXW, $13,xQ,xO,TCVTPH2PS
xC RtnC4C5, VEX0, $DC,xO,xY,TAESENC
xC RtnC4C5, VEX0, $DD,xO,xY,TAESENCLAST
xC RtnC4C5, VEX0, $DE,xO,xY,TAESDEC
xC RtnC4C5, VEX0, $DF,xO,xY,TAESDECLAST
xC RtnC4C5, VEXV or VEXL, $DB,xO,xN,TAESIMC
xC RtnC401, VEXV or VEX0 or VEXW, $18,xD,xD,TBROADCASTSS
xC RtnC401, VEXV or VEXN or VEXW, $19,xN,xQ,TBROADCASTSD
xC RtnC4C5, VEXV or VEXN or VEXM, $1A,xN,xO,TBROADCASTF128
xC RtnC4C5, VEXV or VEXN or VEXM or VEXW, $5A,xN,xO,TBROADCASTI128
xC RtnC4C5, VEXM, $2C,xO,xY,TMASKMOVPS
xC RtnC4C5, VEXM, $2D,xO,xY,TMASKMOVPD
xC RtnC402, VEXM, $2E,xO,xY,TMASKMOVPS
xC RtnC402, VEXM, $2F,xO,xY,TMASKMOVPD
xC RtnC4C5, VEXV or VEXM, $2A,xO,xY,TMOVNTDQA
xC RtnC4C5, VEXV, $1C,xO,xY,TPABSB
xC RtnC4C5, VEXV, $1D,xO,xY,TPABSW
xC RtnC4C5, VEXV, $1E,xO,xY,TPABSD
xC RtnC4C5, VEX0, $2B,xO,xY,TPACKUSDW
xC RtnC4C5, VEX0, $29,xO,xY,TPCMPEQQ
xC RtnC4C5, VEX0, $37,xO,xY,TPCMPGTQ
xC RtnC4C5, VEX0, $0D,xO,xY,TPERMILPD
xC RtnC4C5, VEX0, $0C,xO,xY,TPERMILPS
xC RtnC4C5, VEX0, $01,xO,xY,TPHADDW
xC RtnC4C5, VEX0, $02,xO,xY,TPHADDD
xC RtnC4C5, VEX0, $03,xO,xY,TPHADDSW
xC RtnC4C5, VEXV or VEXL, $41,xO,xN,TPHMINPOSUW
xC RtnC4C5, VEX0, $05,xO,xY,TPHSUBW
xC RtnC4C5, VEX0, $06,xO,xY,TPHSUBD
xC RtnC4C5, VEX0, $07,xO,xY,TPHSUBSW
xC RtnC4C5, VEX0, $04,xO,xY,TPMADDUBSW
xC RtnC4C5, VEX0, $3C,xO,xY,TPMAXSB
xC RtnC4C5, VEX0, $3D,xO,xY,TPMAXSD
xC RtnC4C5, VEX0, $3E,xO,xY,TPMAXUW
xC RtnC4C5, VEX0, $3F,xO,xY,TPMAXUD
xC RtnC4C5, VEX0, $38,xO,xY,TPMINSB
xC RtnC4C5, VEX0, $39,xO,xY,TPMINSD
xC RtnC4C5, VEX0, $3A,xO,xY,TPMINUW
xC RtnC4C5, VEX0, $3B,xO,xY,TPMINUD
xC RtnC4C5, VEXV or VEX2, $20,xQ,xO,TPMOVSXBW
xC RtnC4C5, VEXV or VEX2, $21,xD,xQ,TPMOVSXBD
xC RtnC4C5, VEXV or VEX2, $22,xW,xD,TPMOVSXBQ
xC RtnC4C5, VEXV or VEX2, $23,xQ,xO,TPMOVSXWD
xC RtnC4C5, VEXV or VEX2, $24,xD,xQ,TPMOVSXWQ
xC RtnC4C5, VEXV or VEX2, $25,xQ,xO,TPMOVSXDQ
xC RtnC4C5, VEXV or VEX2, $30,xQ,xO,TPMOVZXBW
xC RtnC4C5, VEXV or VEX2, $31,xD,xQ,TPMOVZXBD
xC RtnC4C5, VEXV or VEX2, $32,xW,xD,TPMOVZXBQ
xC RtnC4C5, VEXV or VEX2, $33,xQ,xO,TPMOVZXWD
xC RtnC4C5, VEXV or VEX2, $34,xD,xQ,TPMOVZXWQ
xC RtnC4C5, VEXV or VEX2, $35,xQ,xO,TPMOVZXDQ
xC RtnC4C5, VEX0, $0B,xO,xY,TPMULHRSW
xC RtnC4C5, VEX0, $40,xO,xY,TPMULLD
xC RtnC4C5, VEX0, $28,xO,xY,TPMULDQ
xC RtnC4C5, VEX0, $00,xO,xY,TPSHUFB
xC RtnC4C5, VEX0, $08,xO,xY,TPSIGNB
xC RtnC4C5, VEX0, $09,xO,xY,TPSIGNW
xC RtnC4C5, VEX0, $0A,xO,xY,TPSIGND
xC RtnC4C5, VEXV, $17,xO,xY,TPTEST
xC RtnC4C5, VEXV, $0E,xO,xY,TTESTPS
xC RtnC4C5, VEXV, $0F,xO,xY,TTESTPD
xC RtnC401, VEXV or VEXW, $78,xB,xB,TPBROADCASTB
xC RtnC401, VEXV or VEXW, $79,xW,xW,TPBROADCASTW
xC RtnC401, VEXV or VEXW, $58,xD,xD,TPBROADCASTD
xC RtnC401, VEXV or VEXW, $59,xQ,xQ,TPBROADCASTQ
xC RtnC4C5, VEXN or VEXW, $36,xN,xY,TPERMD
xC RtnC4C5, VEXN or VEXW, $16,xN,xY,TPERMPS
xC RtnC403, VEX0, $47,xO,xY,TPSLLVD
xC RtnC4C5, VEXW, $46,xO,xY,TPSRAVD
xC RtnC403, VEX0, $45,xO,xY,TPSRLVD
xC RtnC403, VEXM, $8C,xO,xY,TPMASKMOVD
xC RtnC404, VEXM, $8E,xO,xY,TPMASKMOVD
xC RtnC405, VEXM, $90,xD,xD,TPGATHERDD
xC RtnC405, VEXM, $91,xQ,xQ,TPGATHERQD
xC RtnC406, VEXM, $92,xD,xD,TGATHERD
xC RtnC406, VEXM, $93,xQ,xQ,TGATHERQ
;;;;;;;;----------------------------------------------------------------------
xC RtnC407, VEX0 or VEXC, $96,xO,xY,TFMADDSUB132
xC RtnC407, VEX0 or VEXC, $97,xO,xY,TFMSUBADD132
xC RtnC407, VEX0 or VEXC, $98,xO,xY,TFMADD132
xC RtnC408, VEXL or VEXC, $99,xD,xN,TFMADD132
xC RtnC407, VEX0 or VEXC, $9A,xO,xY,TFMSUB132
xC RtnC408, VEXL or VEXC, $9B,xD,xN,TFMSUB132
xC RtnC407, VEX0 or VEXC, $9C,xO,xY,TFNMADD132
xC RtnC408, VEXL or VEXC, $9D,xD,xN,TFNMADD132
xC RtnC407, VEX0 or VEXC, $9E,xO,xY,TFNMSUB132
xC RtnC408, VEXL or VEXC, $9F,xD,xN,TFNMSUB132
xC RtnC407, VEX0 or VEXC, $A6,xO,xY,TFMADDSUB213
xC RtnC407, VEX0 or VEXC, $A7,xO,xY,TFMSUBADD213
xC RtnC407, VEX0 or VEXC, $A8,xO,xY,TFMADD213
xC RtnC408, VEXL or VEXC, $A9,xD,xN,TFMADD213
xC RtnC407, VEX0 or VEXC, $AA,xO,xY,TFMSUB213
xC RtnC408, VEXL or VEXC, $AB,xD,xN,TFMSUB213
xC RtnC407, VEX0 or VEXC, $AC,xO,xY,TFNMADD213
xC RtnC408, VEXL or VEXC, $AD,xD,xN,TFNMADD213
xC RtnC407, VEX0 or VEXC, $AE,xO,xY,TFNMSUB213
xC RtnC408, VEXL or VEXC, $AF,xD,xN,TFNMSUB213
xC RtnC407, VEX0 or VEXC, $B6,xO,xY,TFMADDSUB231
xC RtnC407, VEX0 or VEXC, $B7,xO,xY,TFMSUBADD231
xC RtnC407, VEX0 or VEXC, $B8,xO,xY,TFMADD231
xC RtnC408, VEXL or VEXC, $B9,xD,xN,TFMADD231
xC RtnC407, VEX0 or VEXC, $BA,xO,xY,TFMSUB231
xC RtnC408, VEXL or VEXC, $BB,xD,xN,TFMSUB231
xC RtnC407, VEX0 or VEXC, $BC,xO,xY,TFNMADD231
xC RtnC408, VEXL or VEXC, $BD,xD,xN,TFNMADD231
xC RtnC407, VEX0 or VEXC, $BE,xO,xY,TFNMSUB231
xC RtnC408, VEXL or VEXC, $BF,xD,xN,TFNMSUB231
xC RtnC409, VEXG or VEXH or VEXL, $F7,xD,xQ,TSHLX
xC RtnC4C5, VEXW, $CF,xO,xY,TGF2P8MULB
;;;;;;;;----------------------------------------------------------------------
dd -1
;-----------------------------------------------------------------------------
C43A66:
xC RtnC40A, VEXL or VEXI or VEXH, $30,xO,xY,TKSHIFTRB
xC RtnC40B, VEXL or VEXI or VEXH, $31,xO,xY,TKSHIFTRD
xC RtnC40A, VEXL or VEXI or VEXH, $32,xO,xY,TKSHIFTLB
xC RtnC40B, VEXL or VEXI or VEXH, $33,xO,xY,TKSHIFTLD
xC RtnC4C5, VEXV or VEXL or VEXI, $DF,xO,xN,TAESKEYGENASSIST
xC RtnC4C5, VEXI, $0C,xO,xY,TBLENDPS
xC RtnC4C5, VEXI, $0D,xO,xY,TBLENDPD
xC RtnC4C5, VEX4 or VEXW, $4A,xO,xY,TBLENDVPS
xC RtnC4C5, VEX4 or VEXW, $4B,xO,xY,TBLENDVPD
xC RtnC4C5, VEXI or VEXL, $41,xO,xN,TDPPD
xC RtnC4C5, VEXI, $40,xO,xY,TDPPS
xC RtnC40C, VEXI or VEXV or VEXN, $19,xN,xO,TEXTRACTF128
xC RtnC40D, VEXI or VEXV or VEXW, $1D,xQ,xO,TCVTPS2PH
xC RtnC40E, VEXI or VEXV or VEXL, $17,xD,xN,TEXTRACTPS
xC RtnC410, VEXI or VEX0, $18,xN,xO,TINSERTF128
xC RtnC4C5, VEXI or VEXL, $21,xD,xN,TINSERTPS
xC RtnC4C5, VEXI, $42,xO,xY,TMPSADBW
xC RtnC4C5, VEXI, $0F,xO,xY,TPALIGNR
xC RtnC4C5, VEX4 or VEXW, $4C,xO,xY,TPBLENDVB
xC RtnC4C5, VEXI, $0E,xO,xY,TPBLENDW
xC RtnCLMUL, VEXI, $44,xO,xY,TPCLMULQDQ
xC RtnC4C5, VEXV or VEXL or VEXI, $61,xO,xN,TPCMPESTRI
xC RtnC4C5, VEXV or VEXL or VEXI, $60,xO,xN,TPCMPESTRM
xC RtnC4C5, VEXV or VEXL or VEXI, $63,xO,xN,TPCMPISTRI
xC RtnC4C5, VEXV or VEXL or VEXI, $62,xO,xN,TPCMPISTRM
xC RtnC4C5, VEXV or VEXI, $05,xO,xY,TPERMILPD
xC RtnC4C5, VEXV or VEXI, $04,xO,xY,TPERMILPS
xC RtnC4C5, VEXN or VEXI, $06,xN,xY,TPERM2F128
xC RtnC40F, VEXV or VEXL or VEXI, $14,xB,xN,TPEXTRB
xC RtnC40F, VEXV or VEXL or VEXI, $15,xW,xN,TPEXTRW
xC RtnC411, VEXV or VEXL or VEXI, $16,xD,xN,TPEXTRD
xC RtnC412, VEXL or VEXI, $20,xB,xN,TPINSRB
xC RtnC413, VEXL or VEXI, $22,xD,xN,TPINSRD
xC RtnC4C5, VEXV or VEXI, $09,xO,xY,TROUNDPD
xC RtnC4C5, VEXV or VEXI, $08,xO,xY,TROUNDPS
xC RtnC4C5, VEXL or VEXI, $0B,xQ,xN,TROUNDSD
xC RtnC4C5, VEXL or VEXI, $0A,xD,xN,TROUNDSS
xC RtnC4C5, VEXI or VEXW, $02,xO,xY,TPBLENDD
xC RtnC414, VEXN or VEXC or VEXI, $01,xN,xY,TPERMPD
xC RtnC414, VEXN or VEXC or VEXI, $00,xN,xY,TPERMQ
xC RtnC4C5, VEXN or VEXW or VEXI, $46,xN,xY,TPERM2I128
xC RtnC40C, VEXN or VEXV or VEXW or VEXI, $39,xN,xO,TEXTRACTI128
xC RtnC410, VEXN or VEXW or VEXI, $38,xN,xO,TINSERTI128
xC RtnC4C5, VEXC or VEXI, $CE,xO,xY,TGF2P8AFFINEQB
xC RtnC4C5, VEXC or VEXI, $CF,xO,xY,TGF2P8AFFINEINVQB
;;;;;;;;----------------------------------------------------------------------
xC C4FMA, VEX0 or VEXC, $69,xO,xY,TFMADDPD
xC C4FMA, VEX0 or VEXC, $68,xO,xY,TFMADDPS
xC C4FMA, VEXL or VEXC, $6B,xQ,xN,TFMADDSD
xC C4FMA, VEXL or VEXC, $6A,xD,xN,TFMADDSS
xC C4FMA, VEX0 or VEXC, $5D,xO,xY,TFMADDSUBPD
xC C4FMA, VEX0 or VEXC, $5C,xO,xY,TFMADDSUBPS
xC C4FMA, VEX0 or VEXC, $5F,xO,xY,TFMSUBADDPD
xC C4FMA, VEX0 or VEXC, $5E,xO,xY,TFMSUBADDPS
xC C4FMA, VEX0 or VEXC, $6D,xO,xY,TFMSUBPD
xC C4FMA, VEX0 or VEXC, $6C,xO,xY,TFMSUBPS
xC C4FMA, VEXL or VEXC, $6F,xQ,xN,TFMSUBSD
xC C4FMA, VEXL or VEXC, $6E,xD,xN,TFMSUBSS
xC C4FMA, VEX0 or VEXC, $79,xO,xY,TFNMADDPD
xC C4FMA, VEX0 or VEXC, $78,xO,xY,TFNMADDPS
xC C4FMA, VEXL or VEXC, $7B,xQ,xN,TFNMADDSD
xC C4FMA, VEXL or VEXC, $7A,xD,xN,TFNMADDSS
xC C4FMA, VEX0 or VEXC, $7D,xO,xY,TFNMSUBPD
xC C4FMA, VEX0 or VEXC, $7C,xO,xY,TFNMSUBPS
xC C4FMA, VEXL or VEXC, $7F,xQ,xN,TFNMSUBSD
xC C4FMA, VEXL or VEXC, $7E,xD,xN,TFNMSUBSS
dd -1
;;;;;;;;----------------------------------------------------------------------
C43800:
xC RtnC4C5, VEXG or VEXH or VEXL, $F2,xD,xQ,TANDN
xC RtnC409, VEXG or VEXH or VEXL, $F7,xD,xQ,TBEXTR
xC RtnC415, VEXG or VEXH or VEXL, $F3,xD,xQ,TNULL
xC RtnC409, VEXG or VEXH or VEXL, $F5,xD,xQ,TBZHI
dd -1
C438F3:
xC RtnC4C5, VEXG or VEXH or VEXL, $F5,xD,xQ,TPEXT
xC RtnC409, VEXG or VEXH or VEXL, $F7,xD,xQ,TSARX
dd -1
C438F2:
xC RtnC4C5, VEXG or VEXH or VEXL, $F6,xD,xQ,TMULX
xC RtnC4C5, VEXG or VEXH or VEXL, $F5,xD,xQ,TPDEP
xC RtnC409, VEXG or VEXH or VEXL, $F7,xD,xQ,TSHRX
dd -1
C43A00:
xC C40F3A48, VEX4, $48,xO,xY,TPERMIL2PS
xC C40F3A49, VEX4, $49,xO,xY,TPERMIL2PD
dd -1
C43AF3:
C43AF2:
xC RtnC416, VEXG or VEXH or VEXL, $F0,xD,xQ,TRORX
dd -1
;-----------------------------------------------------------------------------
C4C500:
xC RtnC4C501, VEXN+VEXH, $4A,xO,xY,TKADDW
xC RtnC4C501, VEXN+VEXH, $41,xO,xY,TKANDW
xC RtnC4C501, VEXN+VEXH, $42,xO,xY,TKANDNW
xC RtnC4C501, VEXN+VEXH, $45,xO,xY,TKORW
xC RtnC4C501, VEXN+VEXH, $46,xO,xY,TKXNORW
xC RtnC4C501, VEXN+VEXH, $47,xO,xY,TKXORW
xC RtnC4C504, VEXL+VEXH, $44,xO,xY,TKNOTW
xC RtnC4C504, VEXL+VEXH, $98,xO,xY,TKORTESTW
xC RtnC4C504, VEXL+VEXH, $99,xO,xY,TKTESTW
xC RtnC4C505, VEXL+VEXH, $90,xN,xN,TKMOVW
xC RtnC4C507, VEXL+VEXH, $91,xN,xN,TKMOVW
xC RtnC4C508, VEXN+VEXH, $4B,xN,xN,TKUNPCKWD
xC RtnC4C509, VEXL+VEXH+VEXW, $92,xN,xN,TKMOVW
xC RtnC4C50A, VEXL+VEXH+VEXW, $93,xN,xN,TKMOVW
xC RtnC4C5, VEX0, $58,xO,xY,TADDPS
xC RtnC4C5, VEX0, $54,xO,xY,TANDPS
xC RtnC4C5, VEX0, $55,xO,xY,TANDNPS
xC RtnC4C5, VEX8, $C2,xO,xY,TCMPPS
xC RtnC4C5, VEXV or VEXL, $2F,xD,xN,TCOMISS
xC RtnC4C5, VEXV or VEX0, $5B,xO,xY,TCVTDQ2PS
xC RtnC4C5, VEXV or VEX2, $5A,xQ,xO,TCVTPS2PD
xC RtnC4C5, VEX0, $5E,xO,xY,TDIVPS
xC RtnC4C50B, VEXL or VEXM, $AE,xD,xN,TLDMXCSR
xC RtnC4C5, VEX0, $5F,xO,xY,TMAXPS
xC RtnC4C5, VEX0, $5D,xO,xY,TMINPS
xC RtnC4C5, VEXV, $28,xO,xY,TMOVAPS
xC RtnC4C50C, VEXV, $29,xO,xY,TMOVAPS
xC C4C5NB1, VEXL, $12,xQ,xY,TMOVLPS
xC C4C5NB2, VEXL, $16,xQ,xN,TMOVHPS
xC RtnC4C50C, VEXV or VEXL or VEXM, $17,xQ,xN,TMOVHPS
xC RtnC4C50C, VEXV or VEXL or VEXM, $13,xQ,xN,TMOVLPS
xC RtnC4C50D, VEXV or VEXR, $50,xO,xY,TMOVMSKPS
xC RtnC4C50C, VEXV or VEXM, $2B,xO,xY,TMOVNTPS
xC RtnC4C5, VEXV, $10,xO,xY,TMOVUPS
xC RtnC4C50C, VEXV, $11,xO,xY,TMOVUPS
xC RtnC4C5, VEX0, $59,xO,xY,TMULPS
xC RtnC4C5, VEX0, $56,xO,xY,TORPS
xC RtnC4C5, VEXV, $53,xO,xY,TRCPPS
xC RtnC4C5, VEXV, $52,xO,xY,TRSQRTPS
xC RtnC4C5, VEXI, $C6,xO,xY,TSHUFPS
xC RtnC4C5, VEXV, $51,xO,xY,TSQRTPS
xC RtnC4C5, VEX0, $5C,xO,xY,TSUBPS
xC RtnC4C5, VEXV or VEXL, $2E,xD,xN,TUCOMISS
xC RtnC4C5, VEX0, $15,xO,xY,TUNPCKHPS
xC RtnC4C5, VEX0, $14,xO,xY,TUNPCKLPS
xC RtnC4C5, VEX0, $57,xO,xY,TXORPS
xC RtnC4C50E, VEXF or VEXV, $77,xN,xN,TZEROALL
dd -1
;-----------------------------------------------------------------------------
C4C566:
xC RtnC4C502, VEXN+VEXH, $41,xO,xY,TKANDB
xC RtnC4C502, VEXN+VEXH, $42,xO,xY,TKANDNB
xC RtnC4C502, VEXN+VEXH, $4A,xO,xY,TKADDB
xC RtnC4C502, VEXN+VEXH, $45,xO,xY,TKORB
xC RtnC4C502, VEXN+VEXH, $46,xO,xY,TKXNORB
xC RtnC4C502, VEXN+VEXH, $47,xO,xY,TKXORB
xC RtnC4C503, VEXL+VEXH, $44,xO,xY,TKNOTB
xC RtnC4C503, VEXL+VEXH, $98,xO,xY,TKORTESTB
xC RtnC4C503, VEXL+VEXH, $99,xO,xY,TKTESTB
xC RtnC4C508, VEXN+VEXH+VEXW, $4B,xN,xN,TKUNPCKBW
xC RtnC4C503, VEXL+VEXH, $90,xN,xN,TKMOVB
xC RtnC4C506, VEXL+VEXH, $91,xN,xN,TKMOVB
xC RtnC4C509, VEXL+VEXH+VEXW, $92,xN,xN,TKMOVB
xC RtnC4C50A, VEXL+VEXH+VEXW, $93,xN,xN,TKMOVB
xC RtnC4C5, VEX0, $58,xO,xY,TADDPD
xC RtnC4C5, VEX0, $D0,xO,xY,TADDSUBPD
xC RtnC4C5, VEX0, $54,xO,xY,TANDPD
xC RtnC4C5, VEX0, $55,xO,xY,TANDNPD
xC RtnC4C5, VEX8, $C2,xO,xY,TCMPPD
xC RtnC4C5, VEXV or VEXL, $2F,xQ,xN,TCOMISD
xC RtnC4C5, VEXV or VEX1, $5A,xO,xY,TCVTPD2PS
xC RtnC4C5, VEXV or VEX0, $5B,xO,xY,TCVTPS2DQ
xC RtnC4C5, VEXV or VEX0 or VEX1, $E6,xO,xY,TCVTTPD2DQ
xC RtnC4C5, VEX0, $5E,xO,xY,TDIVPD
xC RtnC4C5, VEX0, $7C,xO,xY,THADDPD
xC RtnC4C5, VEX0, $7D,xO,xY,THSUBPD
xC RtnC4C5, VEXV or VEXL or VEXR, $F7,xN,xN,TMASKMOVDQU
xC RtnC4C5, VEX0, $5F,xO,xY,TMAXPD
xC RtnC4C5, VEX0, $5D,xO,xY,TMINPD
xC RtnC4C5, VEXV, $28,xO,xY,TMOVAPD
xC RtnC4C50C, VEXV, $29,xO,xY,TMOVAPD
xC RtnC4C5XRM, VEXV or VEXL, $6E,xD,xN,TMOVD
xC RtnC4C5RMX, VEXV or VEXL, $7E,xD,xN,TMOVD
xC RtnC4C50C, VEXV or VEXL, $D6,xQ,xN,TMOVQ
xC RtnC4C5, VEXV, $6F,xO,xY,TMOVDQA
xC RtnC4C50C, VEXV, $7F,xO,xY,TMOVDQA
xC RtnC4C5, VEXL or VEXM, $16,xQ,xN,TMOVHPD
xC RtnC4C50C, VEXV or VEXL or VEXM, $17,xQ,xN,TMOVHPD
xC RtnC4C5, VEXL or VEXM, $12,xQ,xN,TMOVLPD
xC RtnC4C50C, VEXV or VEXL or VEXM, $13,xQ,xN,TMOVLPD
xC RtnC4C50D, VEXV or VEXR, $50,xO,xY,TMOVMSKPD
xC RtnC4C50C, VEXV or VEXM, $E7,xO,xY,TMOVNTDQ
xC RtnC4C50C, VEXV or VEXM, $2B,xO,xY,TMOVNTPD
xC RtnC4C5, VEXV, $10,xO,xY,TMOVUPD
xC RtnC4C50C, VEXV, $11,xO,xY,TMOVUPD
xC RtnC4C5, VEX0, $59,xO,xY,TMULPD
xC RtnC4C5, VEX0, $56,xO,xY,TORPD
xC RtnC4C5, VEX0, $63,xO,xY,TPACKSSWB
xC RtnC4C5, VEX0, $6B,xO,xY,TPACKSSDW
xC RtnC4C5, VEX0, $67,xO,xY,TPACKUSWB
xC RtnC4C5, VEX0, $FC,xO,xY,TPADDB
xC RtnC4C5, VEX0, $FD,xO,xY,TPADDW
xC RtnC4C5, VEX0, $FE,xO,xY,TPADDD
xC RtnC4C5, VEX0, $D4,xO,xY,TPADDQ
xC RtnC4C5, VEX0, $EC,xO,xY,TPADDSB
xC RtnC4C5, VEX0, $ED,xO,xY,TPADDSW
xC RtnC4C5, VEX0, $DC,xO,xY,TPADDUSB
xC RtnC4C5, VEX0, $DD,xO,xY,TPADDUSW
xC RtnC4C5, VEX0, $DB,xO,xY,TPAND
xC RtnC4C5, VEX0, $DF,xO,xY,TPANDN
xC RtnC4C5, VEX0, $E0,xO,xY,TPAVGB
xC RtnC4C5, VEX0, $E3,xO,xY,TPAVGW
xC RtnC4C5, VEX0, $74,xO,xY,TPCMPEQB
xC RtnC4C5, VEX0, $75,xO,xY,TPCMPEQW
xC RtnC4C5, VEX0, $76,xO,xY,TPCMPEQD
xC RtnC4C5, VEX0, $64,xO,xY,TPCMPGTB
xC RtnC4C5, VEX0, $65,xO,xY,TPCMPGTW
xC RtnC4C5, VEX0, $66,xO,xY,TPCMPGTD
xC RtnC4C50F, VEXV or VEXL or VEXR, $C5,xN,xN,TPEXTRW
xC RtnC412, VEXL or VEXI, $C4,xW,xN,TPINSRW
xC RtnC4C5, VEX0, $F5,xO,xY,TPMADDWD
xC RtnC4C5, VEX0, $EE,xO,xY,TPMAXSW
xC RtnC4C5, VEX0, $DE,xO,xY,TPMAXUB
xC RtnC4C5, VEX0, $EA,xO,xY,TPMINSW
xC RtnC4C5, VEX0, $DA,xO,xY,TPMINUB
xC RtnC4C50D, VEXV or VEXR, $D7,xN,xN,TPMOVMSKB
xC RtnC4C5, VEX0, $E4,xO,xY,TPMULHUW
xC RtnC4C5, VEX0, $E5,xO,xY,TPMULHW
xC RtnC4C5, VEX0, $D5,xO,xY,TPMULLW
xC RtnC4C5, VEX0, $F4,xO,xY,TPMULUDQ
xC RtnC4C5, VEX0, $EB,xO,xY,TPOR
xC RtnC4C5, VEX0, $F6,xO,xY,TPSADBW
xC RtnC4C5, VEXV or VEXI, $70,xO,xY,TPSHUFD
xC C4C50F71, VEXS or VEXI or VEXR, $71,xN,xN,TNULL
xC C4C50F72, VEXS or VEXI or VEXR, $72,xN,xN,TNULL
xC C4C50F73, VEXS or VEXI or VEXR, $73,xN,xN,TNULL
xC RtnC4C510, VEX0, $F1,xO,xO,TPSLLW
xC RtnC4C510, VEX0, $F2,xO,xO,TPSLLD
xC RtnC4C510, VEX0, $F3,xO,xO,TPSLLQ
xC RtnC4C510, VEX0, $E1,xO,xO,TPSRAW
xC RtnC4C510, VEX0, $E2,xO,xO,TPSRAD
xC RtnC4C510, VEX0, $D1,xO,xO,TPSRLW
xC RtnC4C510, VEX0, $D2,xO,xO,TPSRLD
xC RtnC4C510, VEX0, $D3,xO,xO,TPSRLQ
xC RtnC4C5, VEX0, $F8,xO,xY,TPSUBB
xC RtnC4C5, VEX0, $F9,xO,xY,TPSUBW
xC RtnC4C5, VEX0, $FA,xO,xY,TPSUBD
xC RtnC4C5, VEX0, $FB,xO,xY,TPSUBQ
xC RtnC4C5, VEX0, $E8,xO,xY,TPSUBSB
xC RtnC4C5, VEX0, $E9,xO,xY,TPSUBSW
xC RtnC4C5, VEX0, $D8,xO,xY,TPSUBUSB
xC RtnC4C5, VEX0, $D9,xO,xY,TPSUBUSW
xC RtnC4C5, VEX0, $68,xO,xY,TPUNPCKHBW
xC RtnC4C5, VEX0, $69,xO,xY,TPUNPCKHWD
xC RtnC4C5, VEX0, $6A,xO,xY,TPUNPCKHDQ
xC RtnC4C5, VEX0, $6D,xO,xY,TPUNPCKHQDQ
xC RtnC4C5, VEX0, $60,xO,xY,TPUNPCKLBW
xC RtnC4C5, VEX0, $61,xO,xY,TPUNPCKLWD
xC RtnC4C5, VEX0, $62,xO,xY,TPUNPCKLDQ
xC RtnC4C5, VEX0, $6C,xO,xY,TPUNPCKLQDQ
xC RtnC4C5, VEX0, $EF,xO,xY,TPXOR
xC RtnC4C5, VEXI, $C6,xO,xY,TSHUFPD
xC RtnC4C5, VEXV, $51,xO,xY,TSQRTPD
xC RtnC4C5, VEX0, $5C,xO,xY,TSUBPD
xC RtnC4C5, VEXV or VEXL, $2E,xQ,xN,TUCOMISD
xC RtnC4C5, VEX0, $15,xO,xY,TUNPCKHPD
xC RtnC4C5, VEX0, $14,xO,xY,TUNPCKLPD
xC RtnC4C5, VEX0, $57,xO,xY,TXORPD
dd -1
;-----------------------------------------------------------------------------
C4C5F2:
xC RtnC4C5, VEXL, $58,xQ,xN,TADDSD
xC RtnC4C5, VEX0, $D0,xO,xY,TADDSUBPS
xC RtnC4C5, VEX8 or VEXL, $C2,xQ,xN,TCMPSD
xC RtnC4C5, VEXV or VEX1, $E6,xO,xY,TCVTPD2DQ
xC RtnC4C511, VEXV or VEXL, $2D,xQ,xN,TCVTSD2SI
xC RtnC4C5, VEXL, $5A,xQ,xN,TCVTSD2SS
xC RtnC4C512, VEXL, $2A,xD,xN,TCVTSI2SD
xC RtnC4C511, VEXV or VEXL, $2C,xQ,xN,TCVTTSD2SI
xC RtnC4C5, VEXL, $5E,xQ,xN,TDIVSD
xC RtnC4C5, VEX0, $7C,xO,xY,THADDPS
xC RtnC4C5, VEX0, $7D,xO,xY,THSUBPS
xC RtnC4C5, VEXV or VEXM, $F0,xO,xY,TLDDQU
xC RtnC4C5, VEXL, $5F,xQ,xN,TMAXSD
xC RtnC4C5, VEXL, $5D,xQ,xN,TMINSD
xC RtnC4C5, VEXV, $12,xQ,xY,TMOVDDUP
xC C4C5XMJ, VEXL, $10,xQ,xN,TMOVSD
xC C4C5MXJ, VEXL, $11,xQ,xN,TMOVSD
xC RtnC4C5, VEXL, $59,xQ,xN,TMULSD
xC RtnC4C5, VEXV or VEXI, $70,xO,xY,TPSHUFLW
xC RtnC4C5, VEXL, $51,xQ,xN,TSQRTSD
xC RtnC4C5, VEXL, $5C,xQ,xN,TSUBSD
xC RtnC4C509, VEXL or VEXH, $92,xN,xN,TKMOVD
xC RtnC4C50A, VEXL or VEXH, $93,xN,xN,TKMOVD
dd -1
;-----------------------------------------------------------------------------
C4C5F3:
xC RtnC4C5, VEXL, $58,xD,xN,TADDSS
xC RtnC4C5, VEX8 or VEXL, $C2,xD,xN,TCMPSS
xC RtnC4C5, VEXV or VEX0 or VEX2, $E6,xQ,xO,TCVTDQ2PD
xC RtnC4C512, VEXL, $2A,xD,xN,TCVTSI2SS
xC RtnC4C5, VEXL, $5A,xD,xN,TCVTSS2SD
xC RtnC4C511, VEXV or VEXL, $2D,xD,xN,TCVTSS2SI
xC RtnC4C5, VEXV, $5B,xO,xY,TCVTTPS2DQ
xC RtnC4C511, VEXV or VEXL, $2C,xD,xN,TCVTTSS2SI
xC RtnC4C5, VEXL, $5E,xD,xN,TDIVSS
xC RtnC4C5, VEXL, $5F,xD,xN,TMAXSS
xC RtnC4C5, VEXL, $5D,xD,xN,TMINSS
xC RtnC4C5, VEXV or VEXL, $7E,xQ,xN,TMOVQ
xC RtnC4C5, VEXV, $6F,xO,xY,TMOVDQU
xC RtnC4C50C, VEXV, $7F,xO,xY,TMOVDQU
xC RtnC4C5, VEXV, $16,xO,xY,TMOVSHDUP
xC RtnC4C5, VEXV, $12,xO,xY,TMOVSLDUP
xC C4C5XMJ, VEXL, $10,xD,xN,TMOVSS
xC C4C5MXJ, VEXL, $11,xD,xN,TMOVSS
xC RtnC4C5, VEXL, $59,xD,xN,TMULSS
xC RtnC4C5, VEXV or VEXI, $70,xO,xY,TPSHUFHW
xC RtnC4C5, VEXL, $53,xD,xN,TRCPSS
xC RtnC4C5, VEXL, $51,xD,xN,TSQRTSS
xC RtnC4C5, VEXL, $52,xD,xN,TRSQRTSS
xC RtnC4C5, VEXL, $5C,xD,xN,TSUBSS
dd -1
;-----------------------------------------------------------------------------
T620000:
T62 T6201,54h,TANDPS,EVEXM+EVEXYW,xO,xD
T62 T6201,55h,TANDNPS,EVEXM+EVEXYW,xO,xD
T62 T6201,58h,TADDPS,EVEXM+EVEXYW+EVEXR,xO,xD
T62 T6202,$C2,TCMPPS,EVEXM+EVEXYW+EVEXI,xO,xD
T62 T6203,$2E,TUCOMISS,EVEXYW+EVEXX+EVEXS+EVEXV,xD,xD
T62 T6203,$2F,TCOMISS,EVEXYW+EVEXX+EVEXS+EVEXV,xD,xD
T62 T6201,5Eh,TDIVPS,EVEXM+EVEXR+EVEXYW,xO,xD
T62 T62W0,$5B,TCVT?Q2PS,EVEX2+EVEXR+EVEXB+EVEXM+EVEXE+EVEXV,xO,xD
T62 T62W1,$79,TCVTP?2UDQ,EVEX2+EVEXR+EVEXM+EVEXE+EVEXV,xO,xQ
T62 T6206,$5A,TCVTPS2PD,EVEXM+EVEXV+EVEXYW,xO,xQ
T62 T62W0,$78,TCVTTP?2UDQ,EVEX2+EVEXM+EVEXE+EVEXB+EVEXV,xO,xD
T62 T6201,5Fh,TMAXPS,EVEXM+EVEXYW,xO,xD
T62 T6201,5Dh,TMINPS,EVEXM+EVEXYW,xO,xD
T62 T6204,28h,TMOVAPS,EVEXM+EVEXYW+EVEXV,xO,xO
T62 T620B,29h,TMOVAPS,EVEXM+EVEXYW+EVEXV,xO,xO
T62 T620C,12h,TMOVLPS,EVEXLX+EVEXM+EVEXYW,xQ,xQ
T62 T620E,16h,TMOVHPS,EVEXM+EVEXLX+EVEXYW,xQ,xQ
T62 T620F,17h,TMOVHPS,EVEXM+EVEXLX+EVEXV+EVEXYW,xQ,xQ
T62 T620F,13h,TMOVLPS,EVEXM+EVEXLX+EVEXV+EVEXYW,xQ,xQ
T62 T6210,2Bh,TMOVNTPS,EVEXM+EVEXV+EVEXYW,xO,xO
T62 T6204,10h,TMOVUPS,EVEXM+EVEXV+EVEXYW,xO,xO
T62 T620B,11h,TMOVUPS,EVEXM+EVEXYW+EVEXV,xO,xO
T62 T6201,59h,TMULPS,EVEXM+EVEXR+EVEXYW,xO,xD
T62 T6201,56h,TORPS,EVEXM+EVEXR+EVEXYW,xO,xD
T62 T6201,57h,TXORPS,EVEXM+EVEXR+EVEXYW,xO,xD
T62 T6201,$C6,TSHUFPS,EVEXM+EVEXYW+EVEXI,xO,xD
T62 T6204,51h,TSQRTPS,EVEXM+EVEXR+EVEXYW+EVEXV,xO,xD
T62 T6201,5Ch,TSUBPS,EVEXM+EVEXYW+EVEXR,xO,xD
T62 T6201,15h,TUNPCKHPS,EVEXM+EVEXYW,xO,xD
T62 T6201,14h,TUNPCKLPS,EVEXM+EVEXYW,xO,xD
dd -1
T620066:
T62 T6201,54h,TANDPD,EVEXM+EVEXNW,xO,xQ
T62 T6201,55h,TANDNPD,EVEXM+EVEXNW,xO,xQ
T62 T6201,58h,TADDPD,EVEXM+EVEXNW+EVEXR,xO,xQ
T62 T6202,$C2,TCMPPD,EVEXM+EVEXNW+EVEXI,xO,xQ
T62 T6203,2Eh,TUCOMISD,EVEXNW+EVEXX+EVEXS+EVEXV,xQ,xQ
T62 T6203,2Fh,TCOMISD,EVEXNW+EVEXX+EVEXS+EVEXV,xQ,xQ
T62 T6201,5Eh,TDIVPD,EVEXM+EVEXR+EVEXNW,xO,xQ
T62 T6205,$5A,TCVTPD2PS,EVEXM+EVEXR+EVEXNW+EVEXV,xO,xQ
T62 T6206,$7B,TCVTP?2QQ,EVEXM+EVEXR+EVEXE+EVEXV,xO,xQ
T62 T6206,$79,TCVTP?2UQQ,EVEXM+EVEXR+EVEXE+EVEXV,xO,xQ
T62 T6204,$5B,TCVTPS2DQ,EVEXM+EVEXR+EVEXYW+EVEXV,xO,xD
T62 T6205,$E6,TCVTTPD2DQ,EVEXM+EVEXNW+EVEXV,xO,xQ
T62 T6206,$7A,TCVTTP?2QQ,EVEXM+EVEXE+EVEXV,xO,xQ
T62 T6206,$78,TCVTTP?2UQQ,EVEXM+EVEXE+EVEXV,xO,xQ
T62 T6201,5Fh,TMAXPD,EVEXM+EVEXNW,xO,xQ
T62 T6201,5Dh,TMINPD,EVEXM+EVEXNW,xO,xQ
T62 T6204,28h,TMOVAPD,EVEXM+EVEXNW+EVEXV,xO,xO
T62 T620B,29h,TMOVAPD,EVEXM+EVEXNW+EVEXV,xO,xO
T62 T6211,6Eh,TMOVD,EVEXM+EVEXQ1+EVEXNW+EVEXYW+EVEXV,xD,xD
T62 T6212,7Eh,TMOVD,EVEXM+EVEXQ1+EVEXNW+EVEXYW+EVEXV,xD,xD
T62 T620B,$D6,TMOVQ,EVEXM+EVEXNW+EVEXV,xQ,xQ
T62 T6204,6Fh,TMOVDQA??,EVEXM+EVEXE+EVEXV,xO,xO
T62 T620B,7Fh,TMOVDQA??,EVEXM+EVEXE+EVEXV,xO,xO
T62 T620D,16h,TMOVHPD,EVEXM+EVEXLX+EVEXNW,xQ,xQ
T62 T620D,12h,TMOVLPD,EVEXM+EVEXLX+EVEXNW,xQ,xQ
T62 T620F,17h,TMOVHPD,EVEXM+EVEXLX+EVEXV+EVEXNW,xQ,xQ
T62 T620F,13h,TMOVLPD,EVEXM+EVEXLX+EVEXV+EVEXNW,xQ,xQ
T62 T6210,$E7,TMOVNTDQ,EVEXM+EVEXV+EVEXYW,xO,xO
T62 T6210,2Bh,TMOVNTPD,EVEXM+EVEXV+EVEXNW,xO,xO
T62 T6204,10h,TMOVUPD,EVEXM+EVEXV+EVEXNW,xO,xO
T62 T620B,11h,TMOVUPD,EVEXM+EVEXNW+EVEXV,xO,xO
T62 T6201,$F6,TPSADBW,EVEXM,xO,xO
T62 T6201,59h,TMULPD,EVEXM+EVEXR+EVEXNW,xO,xQ
T62 T6201,56h,TORPD,EVEXM+EVEXR+EVEXNW,xO,xQ
T62 T6201,57h,TXORPD,EVEXM+EVEXR+EVEXNW,xO,xQ
T62 T6201,63h,TPACKSSWB,EVEXM,xO,xO
T62 T6201,6Bh,TPACKSSDW,EVEXM+EVEXR+EVEXYW,xO,xD
T62 T6201,67h,TPACKUSWB,EVEXM,xO,xO
T62 T6201,$FC,TPADDB,EVEXM,xO,xO
T62 T6201,$FD,TPADDW,EVEXM,xO,xO
T62 T6201,$FE,TPADDD,EVEXM+EVEXR+EVEXYW,xO,xD
T62 T6201,$D4,TPADDQ,EVEXM+EVEXR+EVEXNW,xO,xQ
T62 T6201,$EC,TPADDSB,EVEXM,xO,xO
T62 T6201,$ED,TPADDSW,EVEXM,xO,xO
T62 T6201,$DC,TPADDUSB,EVEXM,xO,xO
T62 T6201,$DD,TPADDUSW,EVEXM,xO,xO
T62 T6201,$DB,TPANDD,EVEXM+EVEXQ1+EVEXB+EVEXR,xO,xD
T62 T6201,$DF,TPANDND,EVEXM+EVEXQ1+EVEXB+EVEXR,xO,xD
T62 T6201,$E0,TPAVGB,EVEXM,xO,xO
T62 T6201,$E3,TPAVGW,EVEXM,xO,xO
T62 T6202,$76,TPCMPEQD,EVEXM+EVEXYW,xO,xD
T62 T6202,$74,TPCMPEQB,EVEXM,xO,xO
T62 T6202,$75,TPCMPEQW,EVEXM,xO,xO
T62 T6202,$66,TPCMPGTD,EVEXM+EVEXYW,xO,xD
T62 T6202,$64,TPCMPGTB,EVEXM,xO,xO
T62 T6202,$65,TPCMPGTW,EVEXM,xO,xO
T62 T6213,$C5,TPEXTRW,EVEXV+EVEXI+EVEXM+EVEXLX,xW,xW
T62 T6201,$F5,TPMADDWD,EVEXM,xO,xO
T62 T6214,$C4,TPINSRW,EVEXM+EVEXLX+EVEXI,xW,xW
T62 T6201,$EE,TPMAXSW,EVEXM,xO,xO
T62 T6201,$DE,TPMAXUB,EVEXM,xO,xO
T62 T6201,$EA,TPMINSW,EVEXM,xO,xO
T62 T6201,$DA,TPMINUB,EVEXM,xO,xO
T62 T6201,$E4,TPMULHUW,EVEXM,xO,xO
T62 T6201,$E5,TPMULHW,EVEXM,xO,xO
T62 T6201,$D5,TPMULLW,EVEXM,xO,xO
T62 T6201,$F4,TPMULUDQ,EVEXNW+EVEXM+EVEXB,xO,xD
T62 T6201,$EB,TPORD,EVEXQ1+EVEXM+EVEXB,xO,xD
T62 T6204,70h,TPSHUFD,EVEXYW+EVEXM+EVEXI+EVEXV,xO,xD
T62 T6215,$F1,TPSLLW,EVEXM,xO,xO
T62 T6215,$F2,TPSLLD,EVEXYW+EVEXM,xO,xO
T62 T6215,$F3,TPSLLQ,EVEXNW+EVEXM,xO,xO
T62 T6271,71h,TNULL,EVEXM+EVEXI,xO,xO
T62 T6272,72h,TNULL,EVEXM+EVEXB+EVEXI,xO,xD
T62 T6273,73h,TNULL,EVEXM+EVEXB+EVEXI,xO,xD
T62 T6215,$E1,TPSRAW,EVEXM,xO,xO
T62 T6215,$E2,TPSRAD,EVEXQ1+EVEXM,xO,xO
T62 T6215,$D1,TPSRLW,EVEXM,xO,xO
T62 T6215,$D2,TPSRLD,EVEXYW+EVEXQ1+EVEXM,xO,xO
T62 T6215,$D3,TPSRLQ,EVEXNW+EVEXM,xO,xO
T62 T6201,$F8,TPSUBB,EVEXM,xO,xD
T62 T6201,$F9,TPSUBW,EVEXM,xO,xD
T62 T6201,$FA,TPSUBD,EVEXM+EVEXYW+EVEXB,xO,xD
T62 T6201,$FB,TPSUBQ,EVEXM+EVEXNW+EVEXB,xO,xD
T62 T6201,$E8,TPSUBSB,EVEXM,xO,xD
T62 T6201,$E9,TPSUBSW,EVEXM,xO,xD
T62 T6201,$D8,TPSUBUSB,EVEXM,xO,xD
T62 T6201,$D9,TPSUBUSW,EVEXM,xO,xD
T62 T6201,68h,TPUNPCKHBW,EVEXM,xO,xD
T62 T6201,69h,TPUNPCKHWD,EVEXM,xO,xD
T62 T6201,6Ah,TPUNPCKHDQ,EVEXYW+EVEXM,xO,xD
T62 T6201,6Dh,TPUNPCKHQDQ,EVEXNW+EVEXM,xO,xQ
T62 T6201,60h,TPUNPCKLBW,EVEXM,xO,xD
T62 T6201,61h,TPUNPCKLWD,EVEXM,xO,xD
T62 T6201,62h,TPUNPCKLDQ,EVEXYW+EVEXM,xO,xD
T62 T6201,6Ch,TPUNPCKLQDQ,EVEXNW+EVEXM,xO,xQ
T62 T6201,$C6,TSHUFPD,EVEXM+EVEXNW+EVEXI,xO,xQ
T62 T6206,51h,TSQRTPD,EVEXM+EVEXR+EVEXNW+EVEXV,xO,xQ
T62 T6201,$EF,TPXORD,EVEXQ1+EVEXM+EVEXB,xO,xD
T62 T6201,5Ch,TSUBPD,EVEXM+EVEXNW+EVEXR,xO,xQ
T62 T6201,15h,TUNPCKHPD,EVEXM+EVEXNW,xO,xQ
T62 T6201,14h,TUNPCKLPD,EVEXM+EVEXNW,xO,xQ
dd -1
T6200F3:
T62 T6201,5Ch,TSUBSS,EVEXM+EVEXYW+EVEXR+EVEXX,xD,xD
T62 T6201,58h,TADDSS,EVEXM+EVEXYW+EVEXR+EVEXX,xD,xD
T62 T6201,59h,TMULSS,EVEXM+EVEXYW+EVEXR+EVEXX,xD,xD
T62 T6202,$C2,TCMPSS,EVEXM+EVEXYW+EVEXI+EVEXX,xD,xD
T62 T6201,5Eh,TDIVSS,EVEXM+EVEXYW+EVEXR+EVEXX,xD,xD
T62 T62W2,$E6,TCVT?Q2PD,EVEX2+EVEXO+EVEXR+EVEXM+EVEXE+EVEXB+EVEXV,xO,xD
T62 T6201,5Ah,TCVTSS2SD,EVEXM+EVEXX+EVEXYW,xD,xD
T62 T6213,2Dh,TCVTSS2SI,EVEXM+EVEXR+EVEXX+EVEXW0+EVEXV,xQ,xQ
T62 T6214,2Ah,TCVTSI2SS,EVEXU+EVEXR+EVEXM+EVEXX+EVEXNW+EVEXYW,xD,xD
T62 T6213,79h,TCVTSS2USI,EVEXM+EVEXX+EVEXW0+EVEXV,xD,xD
T62 T6213,2Ch,TCVTTSS2SI,EVEXM+EVEXX+EVEXW0+EVEXV,xQ,xQ
T62 T6213,78h,TCVTTSS2USI,EVEXM+EVEXX+EVEXW0+EVEXV,xD,xD
T62 T6204,$5B,TCVTTPS2DQ,EVEXM+EVEXYW+EVEXV,xO,xD
T62 T6206,$7A,TCVTU?Q2PD,EVEXM+EVEXO+EVEXR+EVEXE+EVEXV,xO,xQ
T62 T6214,7Bh,TCVTUSI2SS,EVEXU+EVEXR+EVEXX+EVEXM+EVEXNW+EVEXYW,xD,xD
T62 T6201,5Fh,TMAXSS,EVEXM+EVEXX+EVEXYW,xD,xD
T62 T6201,5Dh,TMINSS,EVEXM+EVEXX+EVEXYW,xD,xD
T62 T6204,7Eh,TMOVQ,EVEXM+EVEXNW+EVEXV,xQ,xQ
T62 T6204,6Fh,TMOVDQU?2,EVEXM+EVEXE+EVEXV,xO,xO
T62 T620B,7Fh,TMOVDQU?2,EVEXM+EVEXE+EVEXV,xO,xO
T62 T6204,16h,TMOVSHDUP,EVEXM+EVEXV+EVEXYW,xO,xO
T62 T6204,12h,TMOVSLDUP,EVEXM+EVEXV+EVEXYW,xO,xO
T62 T6216,10h,TMOVSS,EVEXM+EVEXX+EVEXYW,xD,xD
T62 T6217,11h,TMOVSS,EVEXM+EVEXX+EVEXYW,xD,xD
T62 T6204,70h,TPSHUFHW,EVEXM+EVEXI+EVEXV,xO,xO
T62 T6201,51h,TSQRTSS,EVEXX+EVEXM+EVEXYW+EVEXR+EVEXX,xD,xD
dd -1
T6200F2:
T62 T6201,5Ch,TSUBSD,EVEXM+EVEXNW+EVEXR+EVEXX,xQ,xQ
T62 T6201,58h,TADDSD,EVEXM+EVEXNW+EVEXR+EVEXX,xQ,xQ
T62 T6201,59h,TMULSD,EVEXM+EVEXNW+EVEXR+EVEXX,xQ,xQ
T62 T6202,$C2,TCMPSD,EVEXM+EVEXNW+EVEXI+EVEXX,xQ,xQ
T62 T6201,5Eh,TDIVSD,EVEXM+EVEXNW+EVEXR+EVEXX,xQ,xQ
T62 T6205,$E6,TCVTPD2DQ,EVEXM+EVEXR+EVEXNW+EVEXV,xO,xQ
T62 T6213,2Dh,TCVTSD2SI,EVEXM+EVEXR+EVEXX+EVEXW0+EVEXV,xQ,xQ
T62 T6213,79h,TCVTSD2USI,EVEXM+EVEXR+EVEXX+EVEXW0+EVEXV,xQ,xQ
T62 T6201,5Ah,TCVTSD2SS,EVEXM+EVEXR+EVEXNW,xQ,xQ
T62 T6214,2Ah,TCVTSI2SD,EVEXU+EVEXR+EVEXM+EVEXX+EVEXNW+EVEXYW,xD,xD
T62 T6213,2Ch,TCVTTSD2SI,EVEXM+EVEXX+EVEXW0+EVEXV,xQ,xQ
T62 T6213,78h,TCVTTSD2USI,EVEXM+EVEXX+EVEXW0+EVEXV,xQ,xQ
T62 T62W1,7Ah,TCVTU?Q2PS,EVEX2+EVEXR+EVEXM+EVEXE+EVEXV,xO,xQ
T62 T6214,7Bh,TCVTUSI2SD,EVEXU+EVEXR+EVEXX+EVEXM+EVEXNW+EVEXYW,xD,xD
T62 T6201,5Fh,TMAXSD,EVEXM+EVEXNW,xQ,xQ
T62 T6201,5Dh,TMINSD,EVEXM+EVEXNW,xQ,xQ
T62 T6218,12h,TMOVDDUP,EVEXM+EVEXNW+EVEXV,xQ,xQ
T62 T6204,6Fh,TMOVDQU??,EVEXM+EVEXE+EVEXV,xO,xO
T62 T620B,7Fh,TMOVDQU??,EVEXM+EVEXE+EVEXV,xO,xO
T62 T6216,10h,TMOVSD,EVEXM+EVEXX+EVEXNW,xQ,xQ
T62 T6217,11h,TMOVSD,EVEXM+EVEXX+EVEXNW,xQ,xQ
T62 T6204,70h,TPSHUFLW,EVEXM+EVEXI+EVEXV,xO,xO
T62 T6201,51h,TSQRTSD,EVEXM+EVEXNW+EVEXR+EVEXX,xQ,xQ
dd -1
T623800:
dd -1
T623866:
T62 T6201,64h,TPBLENDMD,EVEXB+EVEXM+EVEXQ1+EVEX0,xX,xD
T62 T6201,65h,TBLENDMPS,EVEXB+EVEXM+EVEXD1,xX,xD
T62 T6201,66h,TPBLENDM?,EVEXM+EVEXE,xX,0
T62 T6203,19h,TBROADCAST??,EVEXL0+EVEXE+EVEX0,xQ,xQ
T62 T6203,18h,TBROADCASTSS,EVEXYW,xD,xD
T62 T6219,1Ah,TBROADCASTF??X2,EVEXL0+EVEXE+EVEXV,xO,xO
T62 T621A,1Bh,TBROADCASTF??X?,EVEXLL+EVEXE+EVEXV,xY,xY
T62 T62RB,7Ah,TPBROADCASTB,EVEXYW+EVEXV,xN,xN
T62 T62RW,7Bh,TPBROADCASTW,EVEXYW+EVEXV,xN,xN
T62 T62RD,7Ch,TPBROADCASTD,EVEXQ1+EVEXV,xN,xN
T62 T6203,78h,TPBROADCASTB,EVEXYW+EVEXV,xB,xB
T62 T6203,79h,TPBROADCASTW,EVEXYW+EVEXV,xW,xW
T62 T6203,58h,TPBROADCASTD,EVEXYW+EVEXV,xD,xD
T62 T6203,59h,TBROADCASTI??,EVEXE+EVEXV,xQ,xQ
T62 T6219,5Ah,TBROADCASTI??X2,EVEXL0+EVEXE+EVEXV,xX,xX
T62 T621A,5Bh,TBROADCASTI??X?,EVEXLL+EVEXE+EVEXV,xY,xY
T62 T620B,8Ah,TCOMPRESSPS,EVEXM+EVEXD1+EVEXV,xO,xO
T62 T6207,13h,TCVTPH2PS,EVEXM+EVEXYW+EVEXV,xQ,xQ
T62 T6204,88h,TEXPANDPS,EVEXM+EVEXD1+EVEXV,xO,xO
T62 T6201,98h,TFMADD132PS,EVEXR+EVEXB+EVEXM+EVEXD1,xX,xD
T62 T6201,$A8,TFMADD213PS,EVEXR+EVEXB+EVEXM+EVEXD1,xX,xD
T62 T6201,$B8,TFMADD231PS,EVEXR+EVEXB+EVEXM+EVEXD1,xX,xD
T62 T6201,$96,TFMADDSUB132PS,EVEXR+EVEXB+EVEXM+EVEXD1,xX,xD
T62 T6201,$A6,TFMADDSUB213PS,EVEXR+EVEXB+EVEXM+EVEXD1,xX,xD
T62 T6201,$B6,TFMADDSUB231PS,EVEXR+EVEXB+EVEXM+EVEXD1,xX,xD
T62 T6201,$97,TFMSUBADD132PS,EVEXR+EVEXB+EVEXM+EVEXD1,xX,xD
T62 T6201,$A7,TFMSUBADD213PS,EVEXR+EVEXB+EVEXM+EVEXD1,xX,xD
T62 T6201,$B7,TFMSUBADD231PS,EVEXR+EVEXB+EVEXM+EVEXD1,xX,xD
T62 T6201,$9A,TFMSUB132PS,EVEXR+EVEXB+EVEXM+EVEXD1,xX,xD
T62 T6201,$AA,TFMSUB213PS,EVEXR+EVEXB+EVEXM+EVEXD1,xX,xD
T62 T6201,$BA,TFMSUB231PS,EVEXR+EVEXB+EVEXM+EVEXD1,xX,xD
T62 T6201,$9C,TFNMADD132PS,EVEXR+EVEXB+EVEXM+EVEXD1,xX,xD
T62 T6201,$AC,TFNMADD213PS,EVEXR+EVEXB+EVEXM+EVEXD1,xX,xD
T62 T6201,$BC,TFNMADD231PS,EVEXR+EVEXB+EVEXM+EVEXD1,xX,xD
T62 T6201,$9E,TFNMSUB132PS,EVEXR+EVEXB+EVEXM+EVEXD1,xX,xD
T62 T6201,$AE,TFNMSUB213PS,EVEXR+EVEXB+EVEXM+EVEXD1,xX,xD
T62 T6201,$BE,TFNMSUB231PS,EVEXR+EVEXB+EVEXM+EVEXD1,xX,xD
T62 T6201,$99,TFMADD132SS,EVEXR+EVEXU+EVEXX+EVEXM+EVEXD1,xD,xD
T62 T6201,$A9,TFMADD213SS,EVEXR+EVEXU+EVEXX+EVEXM+EVEXD1,xD,xD
T62 T6201,$B9,TFMADD231SS,EVEXR+EVEXU+EVEXX+EVEXM+EVEXD1,xD,xD
T62 T6201,$9B,TFMSUB132SS,EVEXR+EVEXU+EVEXX+EVEXM+EVEXD1,xD,xD
T62 T6201,$AB,TFMSUB213SS,EVEXR+EVEXU+EVEXX+EVEXM+EVEXD1,xD,xD
T62 T6201,$BB,TFMSUB231SS,EVEXR+EVEXU+EVEXX+EVEXM+EVEXD1,xD,xD
T62 T6201,$9D,TFNMADD132SS,EVEXR+EVEXU+EVEXX+EVEXM+EVEXD1,xD,xD
T62 T6201,$AD,TFNMADD213SS,EVEXR+EVEXU+EVEXX+EVEXM+EVEXD1,xD,xD
T62 T6201,$BD,TFNMADD231SS,EVEXR+EVEXU+EVEXX+EVEXM+EVEXD1,xD,xD
T62 T6201,$9F,TFNMSUB132SS,EVEXR+EVEXU+EVEXX+EVEXM+EVEXD1,xD,xD
T62 T6201,$AF,TFNMSUB213SS,EVEXR+EVEXU+EVEXX+EVEXM+EVEXD1,xD,xD
T62 T6201,$BF,TFNMSUB231SS,EVEXR+EVEXU+EVEXX+EVEXM+EVEXD1,xD,xD
T62 T6200,$90,TPGATHERDD,EVEXM+EVEXQ1,xN,xN
T62 T621B,$91,TPGATHERQD,EVEXM+EVEXQ1,xN,xN
T62 T6200,$92,TGATHERDPS,EVEXM+EVEXD1,xN,xN
T62 T621B,$93,TGATHERQPS,EVEXM+EVEXD1,xN,xN
T62 T6204,$42,TGETEXPPS,EVEXB+EVEXM+EVEXD1+EVEXV,xO,xD
T62 T6201,$43,TGETEXPSS,EVEXU+EVEXX+EVEXM+EVEXD1,xD,xD
T62 T621C,2Ah,TMOVNTDQA,EVEXM+EVEXV+EVEXYW,xO,xO
T62 T6204,1Ch,TPABSB,EVEXM+EVEXV,xO,xO
T62 T6204,1Dh,TPABSW,EVEXM+EVEXV,xO,xO
T62 T6204,1Eh,TPABSD,EVEXM+EVEXR+EVEXYW+EVEXV,xO,xD
T62 T6204,1Fh,TPABSQ,EVEXM+EVEXR+EVEXNW+EVEXV,xO,xQ
T62 T6201,2Bh,TPACKUSDW,EVEXM+EVEXR+EVEXYW,xO,xD
T62 T6202,29h,TPCMPEQQ,EVEXM+EVEXNW,xO,xQ
T62 T6202,37h,TPCMPGTQ,EVEXM+EVEXNW,xO,xQ
T62 T620B,8Bh,TPCOMPRESSD,EVEXM+EVEXQ1+EVEXV,xO,xO
T62 T6204,$C4,TPCONFLICTD,EVEXM+EVEXB+EVEXQ1+EVEXV,xO,xD
T62 T6201,8Dh,TPERM?,EVEXM+EVEXE,xO,xO
T62 T6201,36h,TPERMD,EVEXM+EVEXQ1+EVEXB+EVEXL0,xO,xD
T62 T6201,75h,TPERMI2?,EVEXM+EVEXE,xO,xO
T62 T6201,76h,TPERMI2D,EVEXM+EVEXB+EVEXQ1,xO,xD
T62 T6201,77h,TPERMI2PS,EVEXM+EVEXB+EVEXD1,xO,xD
T62 T6201,7Dh,TPERMI2?2,EVEXM+EVEXE,xO,xO
T62 T6201,7Eh,TPERMT2D,EVEXM+EVEXB+EVEXQ1,xO,xD
T62 T6201,7Fh,TPERMT2PS,EVEXM+EVEXB+EVEXD1,xO,xD
T62 T6201,0Dh,TPERMILPD,EVEXNW+EVEXM+EVEXB,xO,xD
T62 T6201,0Ch,TPERMILPS,EVEXYW+EVEXM+EVEXB,xO,xD
T62 T6201,16h,TPERMPS,EVEXD1+EVEXM+EVEXB,xO,xD
T62 T6204,89h,TPEXPANDD,EVEXM+EVEXQ1+EVEXV,xO,xO
T62 T6204,44h,TPLZCNTD,EVEXQ1+EVEXM+EVEXB+EVEXV,xO,xD
T62 T6201,04h,TPMADDUBSW,EVEXM,xO,xO
T62 T6201,$B4,TPMADD52LUQ,EVEXNW+EVEXM+EVEXB,xO,xD
T62 T6201,$B5,TPMADD52HUQ,EVEXNW+EVEXM+EVEXB,xO,xD
T62 T6201,3Ch,TPMAXSB,EVEXM,xO,xO
T62 T6201,3Dh,TPMAXSD,EVEXQ1+EVEXM+EVEXB,xO,xD
T62 T6201,3Eh,TPMAXUW,EVEXM,xO,xO
T62 T6201,3Fh,TPMAXUD,EVEXQ1+EVEXM+EVEXB,xO,xD
T62 T6201,38h,TPMINSB,EVEXM,xO,xO
T62 T6201,39h,TPMINSD,EVEXQ1+EVEXM+EVEXB,xO,xD
T62 T6201,3Ah,TPMINUW,EVEXM,xO,xO
T62 T6201,3Bh,TPMINUD,EVEXQ1+EVEXM+EVEXB,xO,xD
T62 T6207,20h,TPMOVSXBW,EVEXM+EVEXV,xQ,xQ
T62 T6207,23h,TPMOVSXWD,EVEXM+EVEXV,xQ,xQ
T62 T6207,25h,TPMOVSXDQ,EVEXYW+ EVEXM+EVEXV,xQ,xQ
T62 T6203,21h,TPMOVSXBD,EVEXM+EVEXV,xD,xD
T62 T6203,22h,TPMOVSXBQ,EVEXM+EVEXV,xW,xW
T62 T6203,24h,TPMOVSXWQ,EVEXM+EVEXV,xD,xD
T62 T6207,30h,TPMOVZXBW,EVEXM+EVEXV,xQ,xQ
T62 T6207,33h,TPMOVZXWD,EVEXM+EVEXV,xQ,xQ
T62 T6207,35h,TPMOVZXDQ,EVEXYW+EVEXM+EVEXV,xQ,xQ
T62 T6203,31h,TPMOVZXBD,EVEXM+EVEXV,xD,xD
T62 T6203,32h,TPMOVZXBQ,EVEXM+EVEXV,xW,xW
T62 T6203,34h,TPMOVZXWQ,EVEXM+EVEXV,xD,xD
T62 T6201,28h,TPMULDQ,EVEXM+EVEXNW,xO,xQ
T62 T6201,0Bh,TPMULHRSW,EVEXM,xO,xO
T62 T6201,40h,TPMULLD,EVEXQ1+EVEXM+EVEXB,xO,xD
T62 T6201,83h,TPMULTISHIFTQB,EVEXNW+EVEXM+EVEXB,xO,xD
T62 T6201,15h,TPROLVD,EVEXQ1+EVEXM+EVEXB,xO,xD
T62 T6201,14h,TPRORVD,EVEXQ1+EVEXM+EVEXB,xO,xD
T62 T62V1XYZ,$A0,TPSCATTERDD,EVEXM+EVEXQ1,xD,xD
T62 T62V2XYZ,$A1,TPSCATTERQD,EVEXM+EVEXQ1,xD,xD
T62 T6201,00h,TPSHUFB,EVEXM,xO,xO
T62 T6201,12h,TPSLLVW,EVEXNW+EVEXM,xO,xO
T62 T6201,47h,TPSLLVD,EVEXM+EVEXB+EVEXQ1,xO,xD
T62 T6201,10h,TPSRLVW,EVEXNW+EVEXM,xO,xO
T62 T6201,45h,TPSRLVD,EVEXM+EVEXB+EVEXQ1,xO,xD
T62 T6202,26h,TPTESTM?,EVEXM+EVEXE,xO,xO
T62 T6202,27h,TPTESTMD,EVEXQ1+EVEXM+EVEXB,xO,xD
T62 T6201,11h,TPSRAVW,EVEXM+EVEXNW,xO,xO
T62 T6201,46h,TPSRAVD,EVEXQ1+EVEXB+EVEXM,xO,xD
T62 T6204,4Ch,TRCP14PS,EVEXM+EVEXB+EVEXD1,xO,xD
T62 T6201,4Dh,TRCP14SS,EVEXX+EVEXM+EVEXU+EVEXD1,xD,xD
T62 T6204,4Eh,TRSQRT14PS,EVEXM+EVEXB+EVEXD1,xO,xD
T62 T6201,2Ch,TSCALEFPS,EVEXM+EVEXB+EVEXR+EVEXD1,xO,xD
T62 T6201,4Fh,TRSQRT14SS,EVEXX+EVEXU+EVEXM+EVEXD1,xD,xD
T62 T6201,2Dh,TSCALEFSS,EVEXX+EVEXU+EVEXM+EVEXR+EVEXD1,xD,xD
T62 T62V1XYZ,$A2,TSCATTERDPS,EVEXM+EVEXD1,xD,xD
T62 T62V2XYZ,$A3,TSCATTERQPS,EVEXM+EVEXD1,xD,xD
T62 T6204,$C8,TEXP2PS,EVEXLL+EVEXM+EVEXB+EVEXD1+EVEXV,xO,xD
T62 T6204,$CA,TRCP28PS,EVEXLL+EVEXM+EVEXB+EVEXD1+EVEXV,xO,xD
T62 T6204,$CC,TRSQRT28PS,EVEXLL+EVEXM+EVEXB+EVEXD1+EVEXV,xO,xD
T62 T6201,$CB,TRCP28SS,EVEXX+EVEXU+EVEXM+EVEXD1,xD,xD
T62 T6201,$CD,TRSQRT28SS,EVEXX+EVEXU+EVEXM+EVEXD1,xD,xD
T62 T62XYZVV1,$C6,TNULL,EVEXU,xD,xD
T62 T62XYZVV2,$C7,TNULL,EVEXU,xD,xD
T62 T6201,$CF,TGF2P8MULB,EVEXR+EVEXB+EVEXM+EVEXYW,xX,xD
T62 T6201,$DE,TAESDEC,EVEXM,xO,xO
T62 T6201,$DF,TAESDECLAST,EVEXM,xO,xO
T62 T6201,$DC,TAESENC,EVEXM,xO,xO
T62 T6201,$DD,TAESENCLAST,EVEXM,xO,xO
T62 T6201,50h,TPDPBUSD,EVEXM+EVEXB,xO,xD
T62 T6201,51h,TPDPBUSDS,EVEXM+EVEXB,xO,xD
T62 T6201,52h,TPDPWSSD,EVEXM+EVEXB,xO,xD
T62 T6201,53h,TPDPWSSDS,EVEXM+EVEXB,xO,xD
T62 T6204,54h,TPOPCNT?A,EVEXM+EVEXV+EVEXE,xO,xO
T62 T6204,55h,TPOPCNTD,EVEXM+EVEXV+EVEXQ1,xO,xO
T62 T6201,70h,TPSHLDVW,EVEXM+EVEXNW,xO,xQ
T62 T6201,71h,TPSHLDVD,EVEXM+EVEXB+EVEXQ1,xO,xD
T62 T6201,72h,TPSHRDVW,EVEXM+EVEXNW,xO,xQ
T62 T6201,73h,TPSHRDVD,EVEXM+EVEXB+EVEXQ1,xO,xD
T62 T6202,8Fh,TPSHUFBITQMB,EVEXM,xO,xO
T62 T6204,62h,TPEXPAND?,EVEXM+EVEXV+EVEXE,xO,xO
T62 T620B,63h,TPCOMPRESS?,EVEXM+EVEXV+EVEXE,xO,xO
dd -1
T6238F3:
T62 T621D,2Ah,TPBROADCASTMB2Q,EVEXV+EVEXM+EVEXNW,xN,xN
T62 T621D,3Ah,TPBROADCASTMW2D,EVEXV+EVEXM+EVEXYW,xN,xN
T62 T621D,28h,TPMOVM2?,EVEXE+EVEXV+EVEXM,xN,xN
T62 T621D,38h,TPMOVM2D,EVEXQ1+EVEXV+EVEXM,xN,xN
T62 T621E,29h,TPMOVB?2M,EVEXE+EVEXV+EVEXM,xN,xN
T62 T621E,39h,TPMOVD?2M,EVEXE+EVEXV+EVEXM,xN,xN
T62 T6220,12h,TPMOVUSQB,EVEXYW+EVEXV+EVEXM+EVEXB,xW,xW
T62 T6220,22h,TPMOVSQB,EVEXYW+EVEXV+EVEXM+EVEXB,xW,xW
T62 T6220,32h,TPMOVQB,EVEXYW+EVEXV+EVEXM+EVEXB,xW,xW
T62 T6220,14h,TPMOVUSQW,EVEXYW+EVEXV+EVEXM+EVEXB,xD,xD
T62 T6220,24h,TPMOVSQW,EVEXYW+EVEXV+EVEXM+EVEXB,xD,xD
T62 T6220,34h,TPMOVQW,EVEXYW+EVEXV+EVEXM+EVEXB,xD,xD
T62 T620A,15h,TPMOVUSQD,EVEXYW+EVEXV+EVEXM+EVEXB,xQ,xQ
T62 T620A,25h,TPMOVSQD,EVEXYW+EVEXV+EVEXM+EVEXB,xQ,xQ
T62 T620A,35h,TPMOVQD,EVEXYW+EVEXV+EVEXM+EVEXB,xQ,xQ
T62 T6220,11h,TPMOVUSDB,EVEXYW+EVEXV+EVEXM+EVEXB,xD,xD
T62 T6220,21h,TPMOVSDB,EVEXYW+EVEXV+EVEXM+EVEXB,xD,xD
T62 T6220,31h,TPMOVDB,EVEXYW+EVEXV+EVEXM+EVEXB,xD,xD
T62 T620A,13h,TPMOVUSDW,EVEXYW+EVEXV+EVEXM+EVEXB,xQ,xQ
T62 T620A,23h,TPMOVSDW,EVEXYW+EVEXV+EVEXM+EVEXB,xQ,xQ
T62 T620A,33h,TPMOVDW,EVEXYW+EVEXV+EVEXM+EVEXB,xQ,xQ
T62 T620A,10h,TPMOVUSWB,EVEXYW+EVEXV+EVEXM+EVEXB,xQ,xQ
T62 T620A,20h,TPMOVSWB,EVEXYW+EVEXV+EVEXM+EVEXB,xQ,xQ
T62 T620A,30h,TPMOVWB,EVEXYW+EVEXV+EVEXM+EVEXB,xQ,xQ
T62 T6202,26h,TPTESTNM?,EVEXM+EVEXE,xO,xO
T62 T6202,27h,TPTESTNMD,EVEXQ1+EVEXM+EVEXB,xO,xD
dd -1
T6238F2:
T62 T6244,9Ah,T4FMADDPS,EVEXYW+EVEXM+EVEXLL,xO,xO
T62 T6244,$AA,T4FNMADDPS,EVEXYW+EVEXM+EVEXLL,xO,xO
T62 T6244,9Bh,T4FMADDSS,EVEXYW+EVEXM+EVEXX,xO,xO
T62 T6244,$AB,T4FNMADDSS,EVEXYW+EVEXM+EVEXX,xO,xO
T62 T6244,53h,TP4DPWSSDS,EVEXYW+EVEXM+EVEXLL,xO,xO
T62 T6244,52h,TP4DPWSSD,EVEXYW+EVEXM+EVEXLL,xO,xO
dd -1
T623A00:
dd -1
T623A66:
T62 T6201,03h,TALIGND,EVEXB+EVEXM+EVEXQ1+EVEXI,xO,xD
T62 T620A,1Dh,TCVTPS2PH,EVEXM+EVEXI+EVEXYW+EVEXV,xQ,xQ
T62 T6201,42h,TDBPSADBW,EVEXM+EVEXYW+EVEXI,xO,xO
T62 T6221,19h,TEXTRACTF??X2,EVEXE+EVEXM+EVEXV+EVEXI,xO,xO
T62 T6222,1Bh,TEXTRACTF??X?,EVEXE+EVEXM+EVEXV+EVEXI,xY,xY
T62 T6221,39h,TEXTRACTI??X2,EVEXE+EVEXM+EVEXV+EVEXI,xO,xO
T62 T6222,3Bh,TEXTRACTI??X?,EVEXE+EVEXM+EVEXV+EVEXI,xY,xY
T62 T6223,17h,TEXTRACTPS,EVEXV+EVEXI,xD,xD
T62 T6201,54h,TFIXUPIMMPS,EVEXB+EVEXM+EVEXD1+EVEXI,xO,xD
T62 T6201,55h,TFIXUPIMMSS,EVEXU+EVEXX+EVEXM+EVEXD1+EVEXI,xD,xD
T62 T621F,66h,TFPCLASSPS,EVEXB+EVEXM+EVEXD1+EVEXV+EVEXI,xO,xD
T62 T621F,67h,TFPCLASSSS,EVEXU+EVEXX+EVEXM+EVEXD1+EVEXV+EVEXI,xD,xD
T62 T6204,26h,TGETMANTPS,EVEXB+EVEXM+EVEXD1+EVEXV+EVEXI,xO,xD
T62 T6201,$27,TGETMANTSS,EVEXU+EVEXX+EVEXM+EVEXD1+EVEXI,xD,xD
T62 T6224,18h,TINSERTF??X?,EVEXE+EVEXM+EVEXI,xX,xX
T62 T6225,1Ah,TINSERTF??X2,EVEXE+EVEXM+EVEXI,xX,xX
T62 T6224,38h,TINSERTI??X2,EVEXE+EVEXM+EVEXI,xX,xX
T62 T6225,3Ah,TINSERTI??X?,EVEXE+EVEXM+EVEXI,xX,xX
T62 T6201,$21,TINSERTPS,EVEXU+EVEXM+EVEXD1+EVEXYW+EVEXI,xD,xD
T62 T6201,0Fh,TPALIGNR,EVEXM+EVEXI,xO,xO
T62 T6202,3Fh,TPCMP?,EVEXM+EVEXE+EVEXI,xO,xO
T62 T6202,3Eh,TPCMPU?,EVEXM+EVEXE+EVEXI,xO,xO
T62 T6202,1Fh,TPCMPD,EVEXQ1+EVEXB+EVEXM+EVEXI,xO,xD
T62 T6202,1Eh,TPCMPUD,EVEXQ1+EVEXB+EVEXM+EVEXI,xO,xD
T62 T6204,05h,TPERMILPD,EVEXNW+EVEXV+EVEXB+EVEXM+EVEXI,xO,xD
T62 T6204,04h,TPERMILPS,EVEXYW+EVEXB+EVEXM+EVEXV+EVEXI,xO,xD
T62 T6204,01h,TPERMPD,EVEXNW+EVEXL0+EVEXV+EVEXB+EVEXM+EVEXI,xO,xD
T62 T6204,00h,TPERMQ,EVEXNW+EVEXL0+EVEXV+EVEXB+EVEXM+EVEXI,xO,xD
T62 T6212,14h,TPEXTRB,EVEXV+EVEXI+EVEXM+EVEXLX,xB,xB
T62 T6212,15h,TPEXTRW,EVEXV+EVEXI+EVEXM+EVEXLX,xW,xW
T62 T6212,16h,TPEXTRD,EVEXV+EVEXI+EVEXM+EVEXLX+EVEXU+EVEXQ1,xD,xD
T62 T6214,20h,TPINSRB,EVEXM+EVEXLX+EVEXI,xB,xB
T62 T6214,22h,TPINSRD,EVEXQ1+EVEXU+EVEXM+EVEXLX+EVEXI,xD,xD
T62 T6201,23h,TSHUFF?,EVEXE+EVEXM+EVEXL0+EVEXB+EVEXI,xO,xD
T62 T6201,43h,TSHUFI?,EVEXE+EVEXM+EVEXL0+EVEXB+EVEXI,xO,xD
T62 T6201,25h,TPTERNLOGD,EVEXM+EVEXB+EVEXQ1+EVEXI,xO,xD
T62 T6201,50h,TRANGEPS,EVEXM+EVEXB+EVEXD1+EVEXI,xO,xD
T62 T6201,51h,TRANGESS,EVEXX+EVEXM+EVEXU+EVEXD1+EVEXI,xD,xD
T62 T6204,56h,TREDUCEPS,EVEXD1+EVEXB+EVEXM+EVEXI+EVEXV,xO,xD
T62 T6201,57h,TREDUCESS,EVEXX+EVEXM+EVEXU+EVEXD1+EVEXI,xD,xD
T62 T6204,09h,TRNDSCALEPD,EVEXB+EVEXM+EVEXNW+EVEXI+EVEXV,xO,xD
T62 T6204,08h,TRNDSCALEPS,EVEXB+EVEXM+EVEXYW+EVEXI+EVEXV,xO,xD
T62 T6201,0Bh,TRNDSCALESD,EVEXX+EVEXM+EVEXNW+EVEXI,xQ,xQ
T62 T6201,0Ah,TRNDSCALESS,EVEXX+EVEXM+EVEXYW+EVEXI,xD,xD
T62 T6201,$CE,TGF2P8AFFINEQB,EVEXM+EVEXNW+EVEXI,xO,xQ
T62 T6201,$CF,TGF2P8AFFINEINVQB,EVEXM+EVEXNW+EVEXI,xO,xQ
T62 T6201,44h,TPCLMULQDQ,EVEXM+EVEXI,xO,xO
T62 T6201,70h,TPSHLDW,EVEXM+EVEXNW+EVEXI,xO,xQ
T62 T6201,71h,TPSHLDD,EVEXM+EVEXB+EVEXI+EVEXQ1,xO,xD
T62 T6201,72h,TPSHRDW,EVEXM+EVEXNW+EVEXI,xO,xQ
T62 T6201,73h,TPSHRDD,EVEXM+EVEXB+EVEXI+EVEXQ1,xO,xD
dd -1
T623AF3:
dd -1
T623AF2:
dd -1
;-----------------------------------------------------------------------------
T62Names:
TEXTRACTI??X?: dw TEXTRACTI32X8 ,TEXTRACTI64X4
TEXTRACTF??X?: dw TEXTRACTF32X8 ,TEXTRACTF64X4
TEXTRACTF??X2: dw TEXTRACTF32X4 ,TEXTRACTF64X2
TEXTRACTI??X2: dw TEXTRACTI32X4 ,TEXTRACTI64X2
TINSERTI??X?: dw TINSERTI32X8 ,TINSERTI64X4
TINSERTI??X2: dw TINSERTI32X4 ,TINSERTI64X2
TINSERTF??X?: dw TINSERTF32X4 ,TINSERTF64X2
TINSERTF??X2: dw TINSERTF32X8 ,TINSERTF64X4
TMOVDQA??: dw TMOVDQA32 ,TMOVDQA64
TCVTTP?2UDQ: dw TCVTTPS2UDQ ,TCVTTPD2UDQ
TMOVDQU??: dw TMOVDQU8 ,TMOVDQU16
TMOVDQU?2: dw TMOVDQU32 ,TMOVDQU64
TCVT?Q2PS: dw TCVTDQ2PS ,TCVTQQ2PS
TCVTP?2QQ: dw TCVTPS2QQ ,TCVTPD2QQ
TCVTTP?2QQ: dw TCVTTPS2QQ ,TCVTTPD2QQ
TCVTTP?2UQQ: dw TCVTTPS2UQQ ,TCVTTPD2UQQ
TCVTU?Q2PD: dw TCVTUDQ2PD ,TCVTUQQ2PD
TCVT?Q2PD: dw TCVTDQ2PD ,TCVTQQ2PD
TCVTP?2UQQ: dw TCVTPS2UQQ ,TCVTPD2UQQ
TCVTP?2UDQ: dw TCVTPS2UDQ ,TCVTPD2UDQ
TCVTU?Q2PS: dw TCVTUDQ2PS ,TCVTUQQ2PS
TBROADCASTI??: dw TBROADCASTI32X2 ,TPBROADCASTQ
TBROADCASTF??X?:dw TBROADCASTF32X8 ,TBROADCASTF64X4
TBROADCASTI??X?:dw TBROADCASTI32X8 ,TBROADCASTI64X4
TBROADCASTF??X2:dw TBROADCASTF32X4 ,TBROADCASTF64X2
TBROADCASTI??X2:dw TBROADCASTI32X4 ,TBROADCASTI64X2
TBROADCAST??: dw TBROADCASTF32X2 ,TBROADCASTSD
TPBLENDM?: dw TPBLENDMB ,TPBLENDMW
TPCMP?: dw TPCMPB ,TPCMPW
TPCMPU?: dw TPCMPUB ,TPCMPUW
TPERM?: dw TPERMB ,TPERMW
TPERMI2?: dw TPERMI2B ,TPERMI2W
TPERMI2?2: dw TPERMT2B ,TPERMT2W
TPMOVM2?: dw TPMOVM2B ,TPMOVM2W
TPMOVB?2M: dw TPMOVB2M ,TPMOVW2M
TPMOVD?2M: dw TPMOVD2M ,TPMOVQ2M
TPTESTNM?: dw TPTESTNMB ,TPTESTNMW
TPTESTM?: dw TPTESTMB ,TPTESTMW
TSHUFF?: dw TSHUFF32X4 ,TSHUFF64X2
TSHUFI?: dw TSHUFI32X4 ,TSHUFI64X2
TPOPCNT?A: dw TPOPCNTB ,TPOPCNTW
TPCOMPRESS?: dw TPCOMPRESSB ,TPCOMPRESSW
TPEXPAND?: dw TPEXPANDB ,TPEXPANDW
;-----------------------------------------------------------------------------
T62W0: dr T6204,T6205
T62W1: dr T6208,T6205
T62W2: dr T6209,T6204
;-----------------------------------------------------------------------------
/programs/develop/koldbg/fasm/assemble.inc
0,0 → 1,2240
 
; flat assembler core
; Copyright (c) 1999-2019, Tomasz Grysztar.
; All rights reserved.
 
assembler:
xor eax,eax
mov [stub_size],eax
mov [current_pass],ax
mov [resolver_flags],eax
mov [number_of_sections],eax
mov [actual_fixups_size],eax
assembler_loop:
mov eax,[labels_list]
mov [tagged_blocks],eax
mov eax,[additional_memory]
mov [free_additional_memory],eax
mov eax,[additional_memory_end]
mov [structures_buffer],eax
mov esi,[source_start]
mov edi,[code_start]
xor eax,eax
mov dword [adjustment],eax
mov dword [adjustment+4],eax
mov [addressing_space],eax
mov [error_line],eax
mov [counter],eax
mov [format_flags],eax
mov [number_of_relocations],eax
mov [undefined_data_end],eax
mov [file_extension],eax
mov [next_pass_needed],al
mov [output_format],al
mov [adjustment_sign],al
mov [evex_mode],al
;*mov [code_type],16
call init_addressing_space
pass_loop:
call assemble_line
jnc pass_loop
mov eax,[additional_memory_end]
cmp eax,[structures_buffer]
je pass_done
sub eax,18h
mov eax,[eax+4]
mov [current_line],eax
jmp missing_end_directive
pass_done:
call close_pass
mov eax,[labels_list]
check_symbols:
cmp eax,[memory_end]
jae symbols_checked
test byte [eax+8],8
jz symbol_defined_ok
mov cx,[current_pass]
cmp cx,[eax+18]
jne symbol_defined_ok
test byte [eax+8],1
jz symbol_defined_ok
sub cx,[eax+16]
cmp cx,1
jne symbol_defined_ok
and byte [eax+8],not 1
or [next_pass_needed],-1
symbol_defined_ok:
test byte [eax+8],10h
jz use_prediction_ok
mov cx,[current_pass]
and byte [eax+8],not 10h
test byte [eax+8],20h
jnz check_use_prediction
cmp cx,[eax+18]
jne use_prediction_ok
test byte [eax+8],8
jz use_prediction_ok
jmp use_misprediction
check_use_prediction:
test byte [eax+8],8
jz use_misprediction
cmp cx,[eax+18]
je use_prediction_ok
use_misprediction:
or [next_pass_needed],-1
use_prediction_ok:
test byte [eax+8],40h
jz check_next_symbol
and byte [eax+8],not 40h
test byte [eax+8],4
jnz define_misprediction
mov cx,[current_pass]
test byte [eax+8],80h
jnz check_define_prediction
cmp cx,[eax+16]
jne check_next_symbol
test byte [eax+8],1
jz check_next_symbol
jmp define_misprediction
check_define_prediction:
test byte [eax+8],1
jz define_misprediction
cmp cx,[eax+16]
je check_next_symbol
define_misprediction:
or [next_pass_needed],-1
check_next_symbol:
add eax,LABEL_STRUCTURE_SIZE
jmp check_symbols
symbols_checked:
cmp [next_pass_needed],0
jne next_pass
mov eax,[error_line]
or eax,eax
jz assemble_ok
mov [current_line],eax
cmp [error],undefined_symbol
jne error_confirmed
mov eax,[error_info]
or eax,eax
jz error_confirmed
test byte [eax+8],1
jnz next_pass
error_confirmed:
call error_handler
error_handler:
mov eax,[error]
sub eax,error_handler
add [esp],eax
ret
next_pass:
inc [current_pass]
mov ax,[current_pass]
cmp ax,[passes_limit]
je code_cannot_be_generated
jmp assembler_loop
assemble_ok:
ret
 
create_addressing_space:
mov ebx,[addressing_space]
test ebx,ebx
jz init_addressing_space
test byte [ebx+0Ah],1
jnz illegal_instruction
mov eax,edi
sub eax,[ebx+18h]
mov [ebx+1Ch],eax
init_addressing_space:
mov ebx,[tagged_blocks]
mov dword [ebx-4],10h
mov dword [ebx-8],24h
sub ebx,8+24h
cmp ebx,edi
jbe out_of_memory
mov [tagged_blocks],ebx
mov [addressing_space],ebx
xor eax,eax
mov [ebx],edi
mov [ebx+4],eax
mov [ebx+8],eax
mov [ebx+10h],eax
mov [ebx+14h],eax
mov [ebx+18h],edi
mov [ebx+1Ch],eax
mov [ebx+20h],eax
mov eax,[OriginPtr+0] ;*
sub [ebx+0],eax ;*
mov eax,[OriginPtr+4] ;*
sbb [ebx+4],eax ;*
sbb [ebx+8],byte 0 ;*
ret
 
assemble_line:
mov eax,[tagged_blocks]
sub eax,100h
cmp edi,eax
ja out_of_memory
lods byte [esi]
cmp al,1
je assemble_instruction
jb source_end
cmp al,3
jb define_label
je define_constant
cmp al,4
je label_addressing_space
cmp al,0Fh
je new_line
cmp al,13h
je code_type_setting
cmp al,10h
jne illegal_instruction
lods byte [esi]
jmp segment_prefix
code_type_setting:
lods byte [esi]
mov [code_type],al
jmp instruction_assembled
new_line:
lods dword [esi]
mov [current_line],eax
and [prefix_flags],0
cmp [symbols_file],0
je continue_line
cmp [next_pass_needed],0
jne continue_line
mov ebx,[tagged_blocks]
mov dword [ebx-4],1
mov dword [ebx-8],14h
sub ebx,8+14h
cmp ebx,edi
jbe out_of_memory
mov [tagged_blocks],ebx
mov [ebx],eax
mov [ebx+4],edi
mov eax,[addressing_space]
mov [ebx+8],eax
mov al,[code_type]
mov [ebx+10h],al
continue_line:
cmp byte [esi],0Fh
je line_assembled
jmp assemble_line
define_label:
lods dword [esi]
cmp eax,0Fh
jb invalid_use_of_symbol
je reserved_word_used_as_symbol
mov ebx,eax
lods byte [esi]
mov [label_size],al
call make_label
jmp continue_line
make_label:
mov eax,edi
xor edx,edx
xor cl,cl
mov ebp,[addressing_space]
sub eax,[ds:ebp]
sbb edx,[ds:ebp+4]
sbb cl,[ds:ebp+8]
jp label_value_ok
call recoverable_overflow
label_value_ok:
mov [address_sign],cl
test byte [ds:ebp+0Ah],1
jnz make_virtual_label
or byte [ebx+9],1
xchg eax,[ebx]
xchg edx,[ebx+4]
mov ch,[ebx+9]
shr ch,1
and ch,1
neg ch
sub eax,[ebx]
sbb edx,[ebx+4]
sbb ch,cl
mov dword [adjustment],eax
mov dword [adjustment+4],edx
mov [adjustment_sign],ch
or al,ch
or eax,edx
setnz ah
jmp finish_label
make_virtual_label:
and byte [ebx+9],not 1
cmp eax,[ebx]
mov [ebx],eax
setne ah
cmp edx,[ebx+4]
mov [ebx+4],edx
setne al
or ah,al
finish_label:
mov ebp,[addressing_space]
mov ch,[ds:ebp+9]
mov cl,[label_size]
mov edx,[ds:ebp+14h]
mov ebp,[ds:ebp+10h]
finish_label_symbol:
mov al,[address_sign]
xor al,[ebx+9]
and al,10b
or ah,al
xor [ebx+9],al
cmp cl,[ebx+10]
mov [ebx+10],cl
setne al
or ah,al
cmp ch,[ebx+11]
mov [ebx+11],ch
setne al
or ah,al
cmp ebp,[ebx+12]
mov [ebx+12],ebp
setne al
or ah,al
or ch,ch
jz label_symbol_ok
cmp edx,[ebx+20]
mov [ebx+20],edx
setne al
or ah,al
label_symbol_ok:
mov cx,[current_pass]
xchg [ebx+16],cx
mov edx,[current_line]
mov [ebx+28],edx
and byte [ebx+8],not 2
test byte [ebx+8],1
jz new_label
cmp cx,[ebx+16]
je symbol_already_defined
btr dword [ebx+8],10
jc requalified_label
inc cx
sub cx,[ebx+16]
setnz al
or ah,al
jz label_made
test byte [ebx+8],8
jz label_made
mov cx,[current_pass]
cmp cx,[ebx+18]
jne label_made
requalified_label:
or [next_pass_needed],-1
label_made:
ret
new_label:
or byte [ebx+8],1
ret
define_constant:
lods dword [esi]
inc esi
cmp eax,0Fh
jb invalid_use_of_symbol
je reserved_word_used_as_symbol
push eax
or [operand_flags],1
call get_value
pop ebx
xor cl,cl
mov ch,[value_type]
cmp ch,3
je invalid_use_of_symbol
make_constant:
and byte [ebx+9],not 1
cmp eax,[ebx]
mov [ebx],eax
setne ah
cmp edx,[ebx+4]
mov [ebx+4],edx
setne al
or ah,al
mov al,[value_sign]
xor al,[ebx+9]
and al,10b
or ah,al
xor [ebx+9],al
cmp cl,[ebx+10]
mov [ebx+10],cl
setne al
or ah,al
cmp ch,[ebx+11]
mov [ebx+11],ch
setne al
or ah,al
xor edx,edx
cmp edx,[ebx+12]
mov [ebx+12],edx
setne al
or ah,al
or ch,ch
jz constant_symbol_ok
mov edx,[symbol_identifier]
cmp edx,[ebx+20]
mov [ebx+20],edx
setne al
or ah,al
constant_symbol_ok:
mov cx,[current_pass]
xchg [ebx+16],cx
mov edx,[current_line]
mov [ebx+28],edx
test byte [ebx+8],1
jz new_constant
cmp cx,[ebx+16]
jne redeclare_constant
test byte [ebx+8],2
jz symbol_already_defined
or byte [ebx+8],4
and byte [ebx+9],not 4
jmp instruction_assembled
redeclare_constant:
btr dword [ebx+8],10
jc requalified_constant
inc cx
sub cx,[ebx+16]
setnz al
or ah,al
jz instruction_assembled
test byte [ebx+8],4
jnz instruction_assembled
test byte [ebx+8],8
jz instruction_assembled
mov cx,[current_pass]
cmp cx,[ebx+18]
jne instruction_assembled
requalified_constant:
or [next_pass_needed],-1
jmp instruction_assembled
new_constant:
or byte [ebx+8],1+2
jmp instruction_assembled
label_addressing_space:
lods dword [esi]
cmp eax,0Fh
jb invalid_use_of_symbol
je reserved_word_used_as_symbol
mov cx,[current_pass]
test byte [eax+8],1
jz make_addressing_space_label
cmp cx,[eax+16]
je symbol_already_defined
test byte [eax+9],4
jnz make_addressing_space_label
or [next_pass_needed],-1
make_addressing_space_label:
mov dx,[eax+8]
and dx,not (2 or 100h)
or dx,1 or 4 or 400h
mov [eax+8],dx
mov [eax+16],cx
mov edx,[current_line]
mov [eax+28],edx
mov ebx,[addressing_space]
mov [eax],ebx
or byte [ebx+0Ah],2
jmp continue_line
assemble_instruction:
; mov [operand_size],0
; mov [operand_flags],0
; mov [operand_prefix],0
; mov [rex_prefix],0
and dword [operand_size],0
; mov [opcode_prefix],0
; mov [vex_required],0
; mov [vex_register],0
; mov [immediate_size],0
and dword [opcode_prefix],0
call instruction_handler
instruction_handler:
movzx ebx,word [esi]
mov al,[esi+2]
add esi,3
add [esp],ebx
ret
instruction_assembled:
test [prefix_flags],not 1
jnz illegal_instruction
mov al,[esi]
cmp al,0Fh
je line_assembled
or al,al
jnz extra_characters_on_line
line_assembled:
clc
ret
source_end:
dec esi
stc
ret
 
org_directive:
lods byte [esi]
cmp al,'('
jne invalid_argument
cmp byte [esi],'.'
je invalid_value
call get_qword_value
mov cl,[value_type]
test cl,1
jnz invalid_use_of_symbol
push eax
mov ebx,[addressing_space]
mov eax,edi
sub eax,[ebx+18h]
mov [ebx+1Ch],eax
test byte [ebx+0Ah],1
jnz in_virtual
call init_addressing_space
jmp org_space_ok
in_virtual:
call close_virtual_addressing_space
call init_addressing_space
or byte [ebx+0Ah],1
org_space_ok:
pop eax
mov [ebx+9],cl
mov cl,[value_sign]
sub [ebx],eax
sbb [ebx+4],edx
sbb byte [ebx+8],cl
jp org_value_ok
call recoverable_overflow
org_value_ok:
mov edx,[symbol_identifier]
mov [ebx+14h],edx
cmp [output_format],1
ja instruction_assembled
cmp edi,[code_start]
jne instruction_assembled
cmp eax,100h
jne instruction_assembled
bts [format_flags],0
jmp instruction_assembled
label_directive:
lods byte [esi]
cmp al,2
jne invalid_argument
lods dword [esi]
cmp eax,0Fh
jb invalid_use_of_symbol
je reserved_word_used_as_symbol
inc esi
mov ebx,eax
mov [label_size],0
lods byte [esi]
cmp al,':'
je get_label_size
dec esi
cmp al,11h
jne label_size_ok
get_label_size:
lods word [esi]
cmp al,11h
jne invalid_argument
mov [label_size],ah
label_size_ok:
cmp byte [esi],80h
je get_free_label_value
call make_label
jmp instruction_assembled
get_free_label_value:
inc esi
lods byte [esi]
cmp al,'('
jne invalid_argument
push ebx ecx
or byte [ebx+8],4
cmp byte [esi],'.'
je invalid_value
call get_address_value
or bh,bh
setnz ch
xchg ch,cl
mov bp,cx
shl ebp,16
xchg bl,bh
mov bp,bx
pop ecx ebx
and byte [ebx+8],not 4
mov ch,[value_type]
test ch,1
jnz invalid_use_of_symbol
make_free_label:
and byte [ebx+9],not 1
cmp eax,[ebx]
mov [ebx],eax
setne ah
cmp edx,[ebx+4]
mov [ebx+4],edx
setne al
or ah,al
mov edx,[address_symbol]
mov cl,[label_size]
call finish_label_symbol
jmp instruction_assembled
load_directive:
lods byte [esi]
cmp al,2
jne invalid_argument
lods dword [esi]
cmp eax,0Fh
jb invalid_use_of_symbol
je reserved_word_used_as_symbol
inc esi
push eax
mov al,1
cmp byte [esi],11h
jne load_size_ok
lods byte [esi]
lods byte [esi]
load_size_ok:
cmp al,8
ja invalid_value
mov [operand_size],al
and dword [value],0
and dword [value+4],0
lods byte [esi]
cmp al,82h
jne invalid_argument
call get_data_point
jc value_loaded
push esi edi
mov esi,ebx
mov edi,value
rep movs byte [edi],[esi]
pop edi esi
value_loaded:
mov [value_sign],0
mov eax,dword [value]
mov edx,dword [value+4]
pop ebx
xor cx,cx
jmp make_constant
get_data_point:
lods byte [esi]
cmp al,':'
je get_data_offset
cmp al,'('
jne invalid_argument
mov ebx,[addressing_space]
mov ecx,edi
sub ecx,[ebx+18h]
mov [ebx+1Ch],ecx
cmp byte [esi],11h
jne get_data_address
cmp word [esi+1+4],'):'
jne get_data_address
inc esi
lods dword [esi]
add esi,2
cmp byte [esi],'('
jne invalid_argument
inc esi
cmp eax,0Fh
jbe reserved_word_used_as_symbol
mov edx,undefined_symbol
test byte [eax+8],1
jz addressing_space_unavailable
mov edx,symbol_out_of_scope
mov cx,[eax+16]
cmp cx,[current_pass]
jne addressing_space_unavailable
test byte [eax+9],4
jz invalid_use_of_symbol
mov ebx,eax
mov ax,[current_pass]
mov [ebx+18],ax
or byte [ebx+8],8
call store_label_reference
get_addressing_space:
mov ebx,[ebx]
get_data_address:
push ebx
cmp byte [esi],'.'
je invalid_value
or [operand_flags],1
call get_address_value
pop ebp
call calculate_relative_offset
cmp [next_pass_needed],0
jne data_address_type_ok
cmp [value_type],0
jne invalid_use_of_symbol
data_address_type_ok:
mov ebx,edi
xor ecx,ecx
add ebx,eax
adc edx,ecx
mov eax,ebx
sub eax,[ds:ebp+18h]
sbb edx,ecx
jnz bad_data_address
mov cl,[operand_size]
add eax,ecx
cmp eax,[ds:ebp+1Ch]
ja bad_data_address
clc
ret
addressing_space_unavailable:
cmp [error_line],0
jne get_data_address
push [current_line]
pop [error_line]
mov [error],edx
mov [error_info],eax
jmp get_data_address
bad_data_address:
call recoverable_overflow
stc
ret
get_data_offset:
cmp [output_format],2
jae invalid_operand
lods byte [esi]
cmp al,'('
jne invalid_argument
cmp byte [esi],'.'
je invalid_value
call get_dword_value
cmp [value_type],0
je data_offset_ok
call recoverable_invalid_address
data_offset_ok:
add eax,[code_start]
jc bad_data_address
mov ebx,eax
movzx ecx,[operand_size]
add eax,ecx
jc bad_data_address
mov edx,[addressing_space]
test byte [edx+0Ah],1
jnz data_offset_from_virtual
cmp eax,edi
ja bad_data_address
clc
ret
data_offset_from_virtual:
cmp eax,[undefined_data_end]
ja bad_data_address
clc
ret
 
store_directive:
cmp byte [esi],11h
je sized_store
lods byte [esi]
cmp al,'('
jne invalid_argument
call get_byte_value
xor edx,edx
movzx eax,al
mov [operand_size],1
jmp store_value_ok
sized_store:
or [operand_flags],1
call get_value
store_value_ok:
cmp [value_type],0
jne invalid_use_of_symbol
mov dword [value],eax
mov dword [value+4],edx
lods byte [esi]
cmp al,80h
jne invalid_argument
call get_data_point
jc instruction_assembled
push esi edi
mov esi,value
mov edi,ebx
rep movs byte [edi],[esi]
mov eax,edi
pop edi esi
cmp ebx,[undefined_data_end]
jae instruction_assembled
cmp eax,[undefined_data_start]
jbe instruction_assembled
mov [undefined_data_start],eax
jmp instruction_assembled
 
display_directive:
lods byte [esi]
cmp al,'('
jne invalid_argument
cmp byte [esi],0
jne display_byte
inc esi
lods dword [esi]
mov ecx,eax
push edi
mov edi,[tagged_blocks]
sub edi,8
sub edi,eax
cmp edi,[esp]
jbe out_of_memory
mov [tagged_blocks],edi
rep movs byte [edi],[esi]
stos dword [edi]
xor eax,eax
stos dword [edi]
pop edi
inc esi
jmp display_next
display_byte:
call get_byte_value
push edi
mov edi,[tagged_blocks]
sub edi,8+1
mov [tagged_blocks],edi
stos byte [edi]
mov eax,1
stos dword [edi]
dec eax
stos dword [edi]
pop edi
display_next:
cmp edi,[tagged_blocks]
ja out_of_memory
lods byte [esi]
cmp al,','
je display_directive
dec esi
jmp instruction_assembled
show_display_buffer:
mov eax,[tagged_blocks]
or eax,eax
jz display_done
mov esi,[labels_list]
cmp esi,eax
je display_done
display_messages:
sub esi,8
mov eax,[esi+4]
mov ecx,[esi]
sub esi,ecx
cmp eax,10h
je write_addressing_space
test eax,eax
jnz skip_block
push esi
call display_block
pop esi
skip_block:
cmp esi,[tagged_blocks]
jne display_messages
display_done:
ret
write_addressing_space:
mov ecx,[esi+20h]
jecxz skip_block
push esi
mov edi,[free_additional_memory]
mov esi,[output_file]
test esi,esi
jz addressing_space_written
xor ebx,ebx
copy_output_path:
lodsb
cmp edi,[structures_buffer]
jae out_of_memory
stosb
test al,al
jz output_path_copied
cmp al,'/'
je new_path_segment
cmp al,'\'
je new_path_segment
cmp al,'.'
jne copy_output_path
mov ebx,edi
jmp copy_output_path
new_path_segment:
xor ebx,ebx
jmp copy_output_path
output_path_copied:
test ebx,ebx
jnz append_extension
mov byte [edi-1],'.'
mov ebx,edi
append_extension:
mov edi,ebx
add ebx,ecx
inc ebx
cmp ebx,[structures_buffer]
jae out_of_memory
mov esi,[esp]
mov esi,[esi+18h]
sub esi,ecx
rep movs byte [edi],[esi]
xor al,al
stos byte [edi]
mov edx,[free_additional_memory]
call create
jc write_failed
mov esi,[esp]
mov edx,[esi+18h]
mov ecx,[esi+1Ch]
call write
jc write_failed
call close
addressing_space_written:
pop esi
jmp skip_block
 
times_directive:
lods byte [esi]
cmp al,'('
jne invalid_argument
cmp byte [esi],'.'
je invalid_value
call get_count_value
cmp eax,0
je zero_times
cmp byte [esi],':'
jne times_argument_ok
inc esi
times_argument_ok:
push [counter]
push [counter_limit]
mov [counter_limit],eax
mov [counter],1
times_loop:
mov eax,esp
sub eax,[stack_limit]
cmp eax,100h
jb stack_overflow
push esi
or [prefix_flags],1
call continue_line
mov eax,[counter_limit]
cmp [counter],eax
je times_done
inc [counter]
pop esi
jmp times_loop
times_done:
pop eax
pop [counter_limit]
pop [counter]
jmp instruction_assembled
zero_times:
call skip_symbol
jnc zero_times
jmp instruction_assembled
 
virtual_directive:
lods byte [esi]
cmp al,'('
je continue_virtual_area
cmp al,80h
jne virtual_at_current
lods byte [esi]
cmp al,'('
jne invalid_argument
cmp byte [esi],'.'
je invalid_value
call get_address_value
mov ebp,[address_symbol]
or bh,bh
setnz ch
jmp set_virtual
virtual_at_current:
dec esi
virtual_fallback:
mov ebp,[addressing_space]
mov al,[ds:ebp+9]
mov [value_type],al
mov eax,edi
xor edx,edx
xor cl,cl
sub eax,[ds:ebp]
sbb edx,[ds:ebp+4]
sbb cl,[ds:ebp+8]
mov [address_sign],cl
mov bx,[ds:ebp+10h]
mov cx,[ds:ebp+10h+2]
xchg bh,bl
xchg ch,cl
mov ebp,[ds:ebp+14h]
set_virtual:
xchg bl,bh
xchg cl,ch
shl ecx,16
mov cx,bx
push ecx eax
mov ebx,[addressing_space]
test byte [ebx+0Ah],1
jnz non_virtual_end_ok
mov eax,edi
xchg eax,[undefined_data_end]
cmp eax,edi
je non_virtual_end_ok
mov [undefined_data_start],edi
non_virtual_end_ok:
call allocate_virtual_structure_data
call init_addressing_space
or byte [ebx+0Ah],1
cmp byte [esi],86h
jne addressing_space_extension_ok
cmp word [esi+1],'('
jne invalid_argument
mov ecx,[esi+3]
add esi,3+4
add [ebx+18h],ecx
mov [ebx+20h],ecx
or byte [ebx+0Ah],2
push ebx
mov ebx,characters
get_extension:
lods byte [esi]
stos byte [edi]
xlat byte [ebx]
test al,al
jz invalid_argument
loop get_extension
inc esi
pop ebx
addressing_space_extension_ok:
pop eax
mov cl,[address_sign]
not eax
not edx
not cl
add eax,1
adc edx,0
adc cl,0
add eax,edi
adc edx,0
adc cl,0
mov [ebx],eax
mov [ebx+4],edx
mov [ebx+8],cl
pop dword [ebx+10h]
mov [ebx+14h],ebp
mov al,[value_type]
test al,1
jnz invalid_use_of_symbol
mov [ebx+9],al
jmp instruction_assembled
allocate_structure_data:
mov ebx,[structures_buffer]
sub ebx,18h
cmp ebx,[free_additional_memory]
jb out_of_memory
mov [structures_buffer],ebx
ret
find_structure_data:
mov ebx,[structures_buffer]
scan_structures:
cmp ebx,[additional_memory_end]
je no_such_structure
cmp ax,[ebx]
je structure_data_found
add ebx,18h
jmp scan_structures
structure_data_found:
ret
no_such_structure:
stc
ret
allocate_virtual_structure_data:
call allocate_structure_data
mov word [ebx],virtual_directive-instruction_handler
mov ecx,[addressing_space]
mov [ebx+12],ecx
mov [ebx+8],edi
mov ecx,[current_line]
mov [ebx+4],ecx
mov ebx,[addressing_space]
mov eax,edi
sub eax,[ebx+18h]
mov [ebx+1Ch],eax
ret
continue_virtual_area:
cmp byte [esi],11h
jne invalid_argument
cmp byte [esi+1+4],')'
jne invalid_argument
inc esi
lods dword [esi]
inc esi
cmp eax,0Fh
jbe reserved_word_used_as_symbol
mov edx,undefined_symbol
test byte [eax+8],1
jz virtual_area_unavailable
mov edx,symbol_out_of_scope
mov cx,[eax+16]
cmp cx,[current_pass]
jne virtual_area_unavailable
mov edx,invalid_use_of_symbol
test byte [eax+9],4
jz virtual_area_unavailable
mov ebx,eax
mov ax,[current_pass]
mov [ebx+18],ax
or byte [ebx+8],8
call store_label_reference
mov ebx,[ebx]
test byte [ebx+0Ah],4
jz virtual_area_unavailable
and byte [ebx+0Ah],not 4
mov edx,ebx
call allocate_virtual_structure_data
mov [addressing_space],edx
push esi
mov esi,[edx+18h]
mov ecx,[edx+1Ch]
mov eax,[edx+20h]
sub esi,eax
add ecx,eax
lea eax,[edi+ecx]
cmp eax,[tagged_blocks]
jae out_of_memory
mov eax,esi
sub eax,edi
sub [edx+18h],eax
sub [edx],eax
sbb dword [edx+4],0
sbb byte [edx+8],0
mov al,cl
shr ecx,2
rep movs dword [edi],[esi]
mov cl,al
and cl,11b
rep movs byte [edi],[esi]
pop esi
jmp instruction_assembled
virtual_area_unavailable:
cmp [error_line],0
jne virtual_fallback
push [current_line]
pop [error_line]
mov [error],edx
mov [error_info],eax
jmp virtual_fallback
end_virtual:
call find_structure_data
jc unexpected_instruction
push ebx
call close_virtual_addressing_space
pop ebx
mov eax,[ebx+12]
mov [addressing_space],eax
mov edi,[ebx+8]
remove_structure_data:
push esi edi
mov ecx,ebx
sub ecx,[structures_buffer]
shr ecx,2
lea esi,[ebx-4]
lea edi,[esi+18h]
std
rep movs dword [edi],[esi]
cld
add [structures_buffer],18h
pop edi esi
ret
close_virtual_addressing_space:
mov ebx,[addressing_space]
mov eax,edi
sub eax,[ebx+18h]
mov [ebx+1Ch],eax
add eax,[ebx+20h]
test byte [ebx+0Ah],2
jz addressing_space_closed
or byte [ebx+0Ah],4
push esi edi ecx edx
mov ecx,eax
mov eax,[tagged_blocks]
mov dword [eax-4],11h
mov dword [eax-8],ecx
sub eax,8
sub eax,ecx
mov [tagged_blocks],eax
lea edi,[eax+ecx-1]
add eax,[ebx+20h]
xchg eax,[ebx+18h]
sub eax,[ebx+20h]
lea esi,[eax+ecx-1]
mov eax,edi
sub eax,esi
std
shr ecx,1
jnc virtual_byte_ok
movs byte [edi],[esi]
virtual_byte_ok:
dec esi
dec edi
shr ecx,1
jnc virtual_word_ok
movs word [edi],[esi]
virtual_word_ok:
sub esi,2
sub edi,2
rep movs dword [edi],[esi]
cld
xor edx,edx
add [ebx],eax
adc dword [ebx+4],edx
adc byte [ebx+8],dl
pop edx ecx edi esi
addressing_space_closed:
ret
repeat_directive:
test [prefix_flags],1
jnz unexpected_instruction
lods byte [esi]
cmp al,'('
jne invalid_argument
cmp byte [esi],'.'
je invalid_value
call get_count_value
cmp eax,0
je zero_repeat
call allocate_structure_data
mov word [ebx],repeat_directive-instruction_handler
xchg eax,[counter_limit]
mov [ebx+10h],eax
mov eax,1
xchg eax,[counter]
mov [ebx+14h],eax
mov [ebx+8],esi
mov eax,[current_line]
mov [ebx+4],eax
jmp instruction_assembled
end_repeat:
test [prefix_flags],1
jnz unexpected_instruction
call find_structure_data
jc unexpected_instruction
mov eax,[counter_limit]
inc [counter]
cmp [counter],eax
jbe continue_repeating
stop_repeat:
mov eax,[ebx+10h]
mov [counter_limit],eax
mov eax,[ebx+14h]
mov [counter],eax
call remove_structure_data
jmp instruction_assembled
continue_repeating:
mov esi,[ebx+8]
jmp instruction_assembled
zero_repeat:
mov al,[esi]
or al,al
jz missing_end_directive
cmp al,0Fh
jne extra_characters_on_line
call find_end_repeat
jmp instruction_assembled
find_end_repeat:
call find_structure_end
cmp ax,repeat_directive-instruction_handler
jne unexpected_instruction
ret
while_directive:
test [prefix_flags],1
jnz unexpected_instruction
call allocate_structure_data
mov word [ebx],while_directive-instruction_handler
mov eax,1
xchg eax,[counter]
mov [ebx+10h],eax
mov [ebx+8],esi
mov eax,[current_line]
mov [ebx+4],eax
do_while:
push ebx
call calculate_logical_expression
or al,al
jnz while_true
mov al,[esi]
or al,al
jz missing_end_directive
cmp al,0Fh
jne extra_characters_on_line
stop_while:
call find_end_while
pop ebx
mov eax,[ebx+10h]
mov [counter],eax
call remove_structure_data
jmp instruction_assembled
while_true:
pop ebx
jmp instruction_assembled
end_while:
test [prefix_flags],1
jnz unexpected_instruction
call find_structure_data
jc unexpected_instruction
mov eax,[ebx+4]
mov [current_line],eax
inc [counter]
jz too_many_repeats
mov esi,[ebx+8]
jmp do_while
find_end_while:
call find_structure_end
cmp ax,while_directive-instruction_handler
jne unexpected_instruction
ret
if_directive:
test [prefix_flags],1
jnz unexpected_instruction
call calculate_logical_expression
mov dl,al
mov al,[esi]
or al,al
jz missing_end_directive
cmp al,0Fh
jne extra_characters_on_line
or dl,dl
jnz if_true
call find_else
jc instruction_assembled
mov al,[esi]
cmp al,1
jne else_true
cmp word [esi+1],if_directive-instruction_handler
jne else_true
add esi,4
jmp if_directive
if_true:
xor al,al
make_if_structure:
call allocate_structure_data
mov word [ebx],if_directive-instruction_handler
mov byte [ebx+2],al
mov eax,[current_line]
mov [ebx+4],eax
jmp instruction_assembled
else_true:
or al,al
jz missing_end_directive
cmp al,0Fh
jne extra_characters_on_line
or al,-1
jmp make_if_structure
else_directive:
test [prefix_flags],1
jnz unexpected_instruction
mov ax,if_directive-instruction_handler
call find_structure_data
jc unexpected_instruction
cmp byte [ebx+2],0
jne unexpected_instruction
found_else:
mov al,[esi]
cmp al,1
jne skip_else
cmp word [esi+1],if_directive-instruction_handler
jne skip_else
add esi,4
call find_else
jnc found_else
call remove_structure_data
jmp instruction_assembled
skip_else:
or al,al
jz missing_end_directive
cmp al,0Fh
jne extra_characters_on_line
call find_end_if
call remove_structure_data
jmp instruction_assembled
end_if:
test [prefix_flags],1
jnz unexpected_instruction
call find_structure_data
jc unexpected_instruction
call remove_structure_data
jmp instruction_assembled
find_else:
call find_structure_end
cmp ax,else_directive-instruction_handler
je else_found
cmp ax,if_directive-instruction_handler
jne unexpected_instruction
stc
ret
else_found:
clc
ret
find_end_if:
call find_structure_end
cmp ax,if_directive-instruction_handler
jne unexpected_instruction
ret
find_structure_end:
push [error_line]
mov eax,[current_line]
mov [error_line],eax
find_end_directive:
call skip_symbol
jnc find_end_directive
lods byte [esi]
cmp al,0Fh
jne no_end_directive
lods dword [esi]
mov [current_line],eax
skip_labels:
cmp byte [esi],2
jne labels_ok
add esi,6
jmp skip_labels
labels_ok:
cmp byte [esi],1
jne find_end_directive
mov ax,[esi+1]
cmp ax,prefix_instruction-instruction_handler
je find_end_directive
add esi,4
cmp ax,repeat_directive-instruction_handler
je skip_repeat
cmp ax,while_directive-instruction_handler
je skip_while
cmp ax,if_directive-instruction_handler
je skip_if
cmp ax,else_directive-instruction_handler
je structure_end
cmp ax,end_directive-instruction_handler
jne find_end_directive
cmp byte [esi],1
jne find_end_directive
mov ax,[esi+1]
add esi,4
cmp ax,repeat_directive-instruction_handler
je structure_end
cmp ax,while_directive-instruction_handler
je structure_end
cmp ax,if_directive-instruction_handler
jne find_end_directive
structure_end:
pop [error_line]
ret
no_end_directive:
mov eax,[error_line]
mov [current_line],eax
jmp missing_end_directive
skip_repeat:
call find_end_repeat
jmp find_end_directive
skip_while:
call find_end_while
jmp find_end_directive
skip_if:
call skip_if_block
jmp find_end_directive
skip_if_block:
call find_else
jc if_block_skipped
cmp byte [esi],1
jne skip_after_else
cmp word [esi+1],if_directive-instruction_handler
jne skip_after_else
add esi,4
jmp skip_if_block
skip_after_else:
call find_end_if
if_block_skipped:
ret
end_directive:
lods byte [esi]
cmp al,1
jne invalid_argument
lods word [esi]
inc esi
cmp ax,virtual_directive-instruction_handler
je end_virtual
cmp ax,repeat_directive-instruction_handler
je end_repeat
cmp ax,while_directive-instruction_handler
je end_while
cmp ax,if_directive-instruction_handler
je end_if
cmp ax,data_directive-instruction_handler
je end_data
jmp invalid_argument
break_directive:
mov ebx,[structures_buffer]
mov al,[esi]
or al,al
jz find_breakable_structure
cmp al,0Fh
jne extra_characters_on_line
find_breakable_structure:
cmp ebx,[additional_memory_end]
je unexpected_instruction
mov ax,[ebx]
cmp ax,repeat_directive-instruction_handler
je break_repeat
cmp ax,while_directive-instruction_handler
je break_while
cmp ax,if_directive-instruction_handler
je break_if
add ebx,18h
jmp find_breakable_structure
break_if:
push [current_line]
mov eax,[ebx+4]
mov [current_line],eax
call remove_structure_data
call skip_if_block
pop [current_line]
mov ebx,[structures_buffer]
jmp find_breakable_structure
break_repeat:
push ebx
call find_end_repeat
pop ebx
jmp stop_repeat
break_while:
push ebx
jmp stop_while
 
define_data:
cmp edi,[tagged_blocks]
jae out_of_memory
cmp byte [esi],'('
jne simple_data_value
mov ebx,esi
inc esi
call skip_expression
xchg esi,ebx
cmp byte [ebx],81h
jne simple_data_value
inc esi
call get_count_value
inc esi
or eax,eax
jz duplicate_zero_times
cmp byte [esi],91h
jne duplicate_single_data_value
inc esi
duplicate_data:
push eax esi
duplicated_values:
cmp edi,[tagged_blocks]
jae out_of_memory
clc
call near dword [esp+8]
lods byte [esi]
cmp al,','
je duplicated_values
cmp al,92h
jne invalid_argument
pop ebx eax
dec eax
jz data_defined
mov esi,ebx
jmp duplicate_data
duplicate_single_data_value:
cmp edi,[tagged_blocks]
jae out_of_memory
push eax esi
clc
call near dword [esp+8]
pop ebx eax
dec eax
jz data_defined
mov esi,ebx
jmp duplicate_single_data_value
duplicate_zero_times:
cmp byte [esi],91h
jne skip_single_data_value
inc esi
skip_data_value:
call skip_symbol
jc invalid_argument
cmp byte [esi],92h
jne skip_data_value
inc esi
jmp data_defined
skip_single_data_value:
call skip_symbol
jmp data_defined
simple_data_value:
cmp edi,[tagged_blocks]
jae out_of_memory
clc
call near dword [esp]
data_defined:
lods byte [esi]
cmp al,','
je define_data
dec esi
stc
ret
data_bytes:
call define_data
jc instruction_assembled
lods byte [esi]
cmp al,'('
je get_byte
cmp al,'?'
jne invalid_argument
mov eax,edi
mov byte [edi],0
inc edi
jmp undefined_data
get_byte:
cmp byte [esi],0
je get_string
call get_byte_value
stos byte [edi]
ret
get_string:
inc esi
lods dword [esi]
mov ecx,eax
lea eax,[edi+ecx]
cmp eax,[tagged_blocks]
ja out_of_memory
rep movs byte [edi],[esi]
inc esi
ret
undefined_data:
mov ebp,[addressing_space]
test byte [ds:ebp+0Ah],1
jz mark_undefined_data
ret
mark_undefined_data:
cmp eax,[undefined_data_end]
je undefined_data_ok
mov [undefined_data_start],eax
undefined_data_ok:
mov [undefined_data_end],edi
ret
data_unicode:
or [base_code],-1
jmp define_words
data_words:
mov [base_code],0
define_words:
call define_data
jc instruction_assembled
lods byte [esi]
cmp al,'('
je get_word
cmp al,'?'
jne invalid_argument
mov eax,edi
and word [edi],0
scas word [edi]
jmp undefined_data
ret
get_word:
cmp [base_code],0
je word_data_value
cmp byte [esi],0
je word_string
word_data_value:
call get_word_value
call mark_relocation
stos word [edi]
ret
word_string:
inc esi
lods dword [esi]
mov ecx,eax
jecxz word_string_ok
lea eax,[edi+ecx*2]
cmp eax,[tagged_blocks]
ja out_of_memory
xor ah,ah
copy_word_string:
lods byte [esi]
stos word [edi]
loop copy_word_string
word_string_ok:
inc esi
ret
data_dwords:
call define_data
jc instruction_assembled
lods byte [esi]
cmp al,'('
je get_dword
cmp al,'?'
jne invalid_argument
mov eax,edi
and dword [edi],0
scas dword [edi]
jmp undefined_data
get_dword:
push esi
call get_dword_value
pop ebx
cmp byte [esi],':'
je complex_dword
call mark_relocation
stos dword [edi]
ret
complex_dword:
mov esi,ebx
cmp byte [esi],'.'
je invalid_value
call get_word_value
push eax
inc esi
lods byte [esi]
cmp al,'('
jne invalid_operand
mov al,[value_type]
push eax
cmp byte [esi],'.'
je invalid_value
call get_word_value
call mark_relocation
stos word [edi]
pop eax
mov [value_type],al
pop eax
call mark_relocation
stos word [edi]
ret
data_pwords:
call define_data
jc instruction_assembled
lods byte [esi]
cmp al,'('
je get_pword
cmp al,'?'
jne invalid_argument
mov eax,edi
and dword [edi],0
scas dword [edi]
and word [edi],0
scas word [edi]
jmp undefined_data
get_pword:
push esi
call get_pword_value
pop ebx
cmp byte [esi],':'
je complex_pword
call mark_relocation
stos dword [edi]
mov ax,dx
stos word [edi]
ret
complex_pword:
mov esi,ebx
cmp byte [esi],'.'
je invalid_value
call get_word_value
push eax
inc esi
lods byte [esi]
cmp al,'('
jne invalid_operand
mov al,[value_type]
push eax
cmp byte [esi],'.'
je invalid_value
call get_dword_value
call mark_relocation
stos dword [edi]
pop eax
mov [value_type],al
pop eax
call mark_relocation
stos word [edi]
ret
data_qwords:
call define_data
jc instruction_assembled
lods byte [esi]
cmp al,'('
je get_qword
cmp al,'?'
jne invalid_argument
mov eax,edi
and dword [edi],0
scas dword [edi]
and dword [edi],0
scas dword [edi]
jmp undefined_data
get_qword:
call get_qword_value
call mark_relocation
stos dword [edi]
mov eax,edx
stos dword [edi]
ret
data_twords:
call define_data
jc instruction_assembled
lods byte [esi]
cmp al,'('
je get_tword
cmp al,'?'
jne invalid_argument
mov eax,edi
and dword [edi],0
scas dword [edi]
and dword [edi],0
scas dword [edi]
and word [edi],0
scas word [edi]
jmp undefined_data
get_tword:
cmp byte [esi],'.'
jne complex_tword
inc esi
cmp word [esi+8],8000h
je fp_zero_tword
mov eax,[esi]
stos dword [edi]
mov eax,[esi+4]
stos dword [edi]
mov ax,[esi+8]
add ax,3FFFh
jo value_out_of_range
cmp ax,7FFFh
jge value_out_of_range
cmp ax,0
jg tword_exp_ok
mov cx,ax
neg cx
inc cx
cmp cx,64
jae value_out_of_range
cmp cx,32
ja large_shift
mov eax,[esi]
mov edx,[esi+4]
mov ebx,edx
shr edx,cl
shrd eax,ebx,cl
jmp tword_mantissa_shift_done
large_shift:
sub cx,32
xor edx,edx
mov eax,[esi+4]
shr eax,cl
tword_mantissa_shift_done:
jnc store_shifted_mantissa
add eax,1
adc edx,0
store_shifted_mantissa:
mov [edi-8],eax
mov [edi-4],edx
xor ax,ax
test edx,1 shl 31
jz tword_exp_ok
inc ax
tword_exp_ok:
mov bl,[esi+11]
shl bx,15
or ax,bx
stos word [edi]
add esi,13
ret
fp_zero_tword:
xor eax,eax
stos dword [edi]
stos dword [edi]
mov al,[esi+11]
shl ax,15
stos word [edi]
add esi,13
ret
complex_tword:
call get_word_value
push eax
cmp byte [esi],':'
jne invalid_operand
inc esi
lods byte [esi]
cmp al,'('
jne invalid_operand
mov al,[value_type]
push eax
cmp byte [esi],'.'
je invalid_value
call get_qword_value
call mark_relocation
stos dword [edi]
mov eax,edx
stos dword [edi]
pop eax
mov [value_type],al
pop eax
call mark_relocation
stos word [edi]
ret
data_file:
lods word [esi]
cmp ax,'('
jne invalid_argument
add esi,4
call open_binary_file
mov eax,[esi-4]
lea esi,[esi+eax+1]
mov al,2
xor edx,edx
call lseek
push eax
xor edx,edx
cmp byte [esi],':'
jne position_ok
inc esi
cmp byte [esi],'('
jne invalid_argument
inc esi
cmp byte [esi],'.'
je invalid_value
push ebx
call get_count_value
pop ebx
mov edx,eax
sub [esp],edx
jc value_out_of_range
position_ok:
cmp byte [esi],','
jne size_ok
inc esi
cmp byte [esi],'('
jne invalid_argument
inc esi
cmp byte [esi],'.'
je invalid_value
push ebx edx
call get_count_value
pop edx ebx
cmp eax,[esp]
ja value_out_of_range
mov [esp],eax
size_ok:
xor al,al
call lseek
pop ecx
mov edx,edi
add edi,ecx
jc out_of_memory
cmp edi,[tagged_blocks]
ja out_of_memory
call read
jc error_reading_file
call close
lods byte [esi]
cmp al,','
je data_file
dec esi
jmp instruction_assembled
open_binary_file:
push esi
push edi
mov eax,[current_line]
find_current_source_path:
mov esi,[eax]
test byte [eax+7],80h
jz get_current_path
mov eax,[eax+8]
jmp find_current_source_path
get_current_path:
lodsb
stosb
or al,al
jnz get_current_path
cut_current_path:
cmp edi,[esp]
je current_path_ok
cmp byte [edi-1],'\'
je current_path_ok
cmp byte [edi-1],'/'
je current_path_ok
dec edi
jmp cut_current_path
current_path_ok:
mov esi,[esp+4]
call expand_path
pop edx
mov esi,edx
call open
jnc file_opened
mov edx,[include_paths]
search_in_include_paths:
push edx esi
mov edi,esi
mov esi,[esp+4]
call get_include_directory
mov [esp+4],esi
mov esi,[esp+8]
call expand_path
pop edx
mov esi,edx
call open
pop edx
jnc file_opened
cmp byte [edx],0
jne search_in_include_paths
mov edi,esi
mov esi,[esp]
push edi
call expand_path
pop edx
mov esi,edx
call open
jc file_not_found
file_opened:
mov edi,esi
pop esi
ret
reserve_bytes:
lods byte [esi]
cmp al,'('
jne invalid_argument
cmp byte [esi],'.'
je invalid_value
call get_count_value
mov ecx,eax
mov edx,ecx
add edx,edi
jc out_of_memory
cmp edx,[tagged_blocks]
ja out_of_memory
push edi
cmp [next_pass_needed],0
je zero_bytes
add edi,ecx
jmp reserved_data
zero_bytes:
xor eax,eax
shr ecx,1
jnc bytes_stosb_ok
stos byte [edi]
bytes_stosb_ok:
shr ecx,1
jnc bytes_stosw_ok
stos word [edi]
bytes_stosw_ok:
rep stos dword [edi]
reserved_data:
pop eax
call undefined_data
jmp instruction_assembled
reserve_words:
lods byte [esi]
cmp al,'('
jne invalid_argument
cmp byte [esi],'.'
je invalid_value
call get_count_value
mov ecx,eax
mov edx,ecx
shl edx,1
jc out_of_memory
add edx,edi
jc out_of_memory
cmp edx,[tagged_blocks]
ja out_of_memory
push edi
cmp [next_pass_needed],0
je zero_words
lea edi,[edi+ecx*2]
jmp reserved_data
zero_words:
xor eax,eax
shr ecx,1
jnc words_stosw_ok
stos word [edi]
words_stosw_ok:
rep stos dword [edi]
jmp reserved_data
reserve_dwords:
lods byte [esi]
cmp al,'('
jne invalid_argument
cmp byte [esi],'.'
je invalid_value
call get_count_value
mov ecx,eax
mov edx,ecx
shl edx,1
jc out_of_memory
shl edx,1
jc out_of_memory
add edx,edi
jc out_of_memory
cmp edx,[tagged_blocks]
ja out_of_memory
push edi
cmp [next_pass_needed],0
je zero_dwords
lea edi,[edi+ecx*4]
jmp reserved_data
zero_dwords:
xor eax,eax
rep stos dword [edi]
jmp reserved_data
reserve_pwords:
lods byte [esi]
cmp al,'('
jne invalid_argument
cmp byte [esi],'.'
je invalid_value
call get_count_value
mov ecx,eax
shl ecx,1
jc out_of_memory
add ecx,eax
mov edx,ecx
shl edx,1
jc out_of_memory
add edx,edi
jc out_of_memory
cmp edx,[tagged_blocks]
ja out_of_memory
push edi
cmp [next_pass_needed],0
je zero_words
lea edi,[edi+ecx*2]
jmp reserved_data
reserve_qwords:
lods byte [esi]
cmp al,'('
jne invalid_argument
cmp byte [esi],'.'
je invalid_value
call get_count_value
mov ecx,eax
shl ecx,1
jc out_of_memory
mov edx,ecx
shl edx,1
jc out_of_memory
shl edx,1
jc out_of_memory
add edx,edi
jc out_of_memory
cmp edx,[tagged_blocks]
ja out_of_memory
push edi
cmp [next_pass_needed],0
je zero_dwords
lea edi,[edi+ecx*4]
jmp reserved_data
reserve_twords:
lods byte [esi]
cmp al,'('
jne invalid_argument
cmp byte [esi],'.'
je invalid_value
call get_count_value
mov ecx,eax
shl ecx,2
jc out_of_memory
add ecx,eax
mov edx,ecx
shl edx,1
jc out_of_memory
add edx,edi
jc out_of_memory
cmp edx,[tagged_blocks]
ja out_of_memory
push edi
cmp [next_pass_needed],0
je zero_words
lea edi,[edi+ecx*2]
jmp reserved_data
align_directive:
lods byte [esi]
cmp al,'('
jne invalid_argument
cmp byte [esi],'.'
je invalid_value
call get_count_value
mov edx,eax
dec edx
test eax,edx
jnz invalid_align_value
or eax,eax
jz invalid_align_value
cmp eax,1
je instruction_assembled
mov ecx,edi
mov ebp,[addressing_space]
sub ecx,[ds:ebp]
cmp dword [ds:ebp+10h],0
jne section_not_aligned_enough
cmp byte [ds:ebp+9],0
je make_alignment
cmp [output_format],3
je pe_alignment
cmp [output_format],5
jne object_alignment
test [format_flags],1
jnz pe_alignment
object_alignment:
mov ebx,[ds:ebp+14h]
cmp byte [ebx],0
jne section_not_aligned_enough
cmp eax,[ebx+10h]
jbe make_alignment
jmp section_not_aligned_enough
pe_alignment:
cmp eax,1000h
ja section_not_aligned_enough
make_alignment:
dec eax
and ecx,eax
jz instruction_assembled
neg ecx
add ecx,eax
inc ecx
mov edx,ecx
add edx,edi
jc out_of_memory
cmp edx,[tagged_blocks]
ja out_of_memory
push edi
cmp [next_pass_needed],0
je nops
add edi,ecx
jmp reserved_data
invalid_align_value:
cmp [error_line],0
jne instruction_assembled
mov eax,[current_line]
mov [error_line],eax
mov [error],invalid_value
jmp instruction_assembled
nops:
mov eax,90909090h
shr ecx,1
jnc nops_stosb_ok
stos byte [edi]
nops_stosb_ok:
shr ecx,1
jnc nops_stosw_ok
stos word [edi]
nops_stosw_ok:
rep stos dword [edi]
jmp reserved_data
err_directive:
mov al,[esi]
cmp al,0Fh
je invoked_error
or al,al
jz invoked_error
jmp extra_characters_on_line
assert_directive:
call calculate_logical_expression
or al,al
jnz instruction_assembled
cmp [error_line],0
jne instruction_assembled
mov eax,[current_line]
mov [error_line],eax
mov [error],assertion_failed
jmp instruction_assembled
/programs/develop/koldbg/fasm/avx.inc
0,0 → 1,3425
 
; flat assembler core
; Copyright (c) 1999-2019, Tomasz Grysztar.
; All rights reserved.
 
avx_single_source_pd_instruction_er_evex:
or [vex_required],8
avx_single_source_pd_instruction_er:
or [operand_flags],2+4+8
jmp avx_pd_instruction
avx_single_source_pd_instruction_sae_evex:
or [vex_required],8
or [operand_flags],2+4
jmp avx_pd_instruction
avx_pd_instruction_imm8:
mov [immediate_size],1
jmp avx_pd_instruction
avx_pd_instruction_er:
or [operand_flags],8
avx_pd_instruction_sae:
or [operand_flags],4
avx_pd_instruction:
mov [opcode_prefix],66h
or [rex_prefix],80h
mov cx,0800h
jmp avx_instruction_with_broadcast
avx_pd_instruction_38_evex:
or [vex_required],8
mov [supplemental_code],al
mov al,38h
jmp avx_pd_instruction
avx_cvtps2dq_instruction:
mov [opcode_prefix],66h
jmp avx_single_source_ps_instruction_er
avx_cvtudq2ps_instruction:
mov [opcode_prefix],0F2h
avx_single_source_ps_instruction_er_evex:
or [vex_required],8
avx_single_source_ps_instruction_er:
or [operand_flags],2+4+8
jmp avx_ps_instruction
avx_single_source_ps_instruction_noevex:
or [operand_flags],2
or [vex_required],2
jmp avx_ps_instruction
avx_ps_instruction_imm8:
mov [immediate_size],1
jmp avx_ps_instruction
avx_ps_instruction_er:
or [operand_flags],8
avx_ps_instruction_sae:
or [operand_flags],4
avx_ps_instruction:
mov cx,0400h
jmp avx_instruction_with_broadcast
avx_ps_instruction_66_38_evex:
or [vex_required],8
mov [opcode_prefix],66h
mov [supplemental_code],al
mov al,38h
jmp avx_ps_instruction
avx_sd_instruction_er:
or [operand_flags],8
avx_sd_instruction_sae:
or [operand_flags],4
avx_sd_instruction:
mov [opcode_prefix],0F2h
or [rex_prefix],80h
mov cl,8
jmp avx_instruction
avx_ss_instruction_er:
or [operand_flags],8
avx_ss_instruction_sae:
or [operand_flags],4
avx_ss_instruction:
mov [opcode_prefix],0F3h
mov cl,4
jmp avx_instruction
avx_ss_instruction_noevex:
or [vex_required],2
jmp avx_ss_instruction
avx_single_source_q_instruction_38_evex:
or [operand_flags],2
avx_q_instruction_38_evex:
or [vex_required],8
avx_q_instruction_38:
mov [supplemental_code],al
mov al,38h
jmp avx_q_instruction
avx_q_instruction_38_w1_evex:
or [vex_required],8
avx_q_instruction_38_w1:
or [rex_prefix],8
jmp avx_q_instruction_38
avx_q_instruction_3a_imm8_w1:
or [rex_prefix],8
jmp avx_q_instruction_3a_imm8
avx_q_instruction_3a_imm8_evex:
or [vex_required],8
avx_q_instruction_3a_imm8:
mov [immediate_size],1
mov [supplemental_code],al
mov al,3Ah
jmp avx_q_instruction
avx_q_instruction_evex:
or [vex_required],8
avx_q_instruction:
or [rex_prefix],80h
mov ch,8
jmp avx_pi_instruction
avx_single_source_d_instruction_38_evex_w1:
or [rex_prefix],8
avx_single_source_d_instruction_38_evex:
or [vex_required],8
avx_single_source_d_instruction_38:
or [operand_flags],2
jmp avx_d_instruction_38
avx_d_instruction_38_evex:
or [vex_required],8
avx_d_instruction_38:
mov [supplemental_code],al
mov al,38h
jmp avx_d_instruction
avx_d_instruction_3a_imm8_evex:
mov [immediate_size],1
or [vex_required],8
mov [supplemental_code],al
mov al,3Ah
jmp avx_d_instruction
avx_single_source_d_instruction_imm8:
or [operand_flags],2
mov [immediate_size],1
jmp avx_d_instruction
avx_d_instruction_evex:
or [vex_required],8
avx_d_instruction:
mov ch,4
jmp avx_pi_instruction
avx_bw_instruction_3a_imm8_w1_evex:
or [rex_prefix],8
avx_bw_instruction_3a_imm8_evex:
mov [immediate_size],1
or [vex_required],8
mov [supplemental_code],al
mov al,3Ah
jmp avx_bw_instruction
avx_single_source_bw_instruction_38:
or [operand_flags],2
avx_bw_instruction_38:
mov [supplemental_code],al
mov al,38h
avx_bw_instruction:
xor ch,ch
avx_pi_instruction:
mov [opcode_prefix],66h
xor cl,cl
jmp avx_instruction_with_broadcast
avx_bw_instruction_38_w1_evex:
or [rex_prefix],8
avx_bw_instruction_38_evex:
or [vex_required],8
jmp avx_bw_instruction_38
avx_pd_instruction_noevex:
xor cl,cl
or [vex_required],2
mov [opcode_prefix],66h
jmp avx_instruction
avx_ps_instruction_noevex:
or [vex_required],2
mov [opcode_prefix],0F2h
xor cl,cl
jmp avx_instruction
avx_instruction:
xor ch,ch
avx_instruction_with_broadcast:
mov [mmx_size],cl
mov [broadcast_size],ch
mov [base_code],0Fh
mov [extended_code],al
avx_xop_common:
or [vex_required],1
lods byte [esi]
call get_size_operator
cmp al,10h
jne invalid_operand
avx_reg:
lods byte [esi]
call convert_avx_register
mov [postbyte_register],al
call take_avx512_mask
avx_vex_reg:
test [operand_flags],2
jnz avx_vex_reg_ok
lods byte [esi]
cmp al,','
jne invalid_operand
call take_avx_register
mov [vex_register],al
avx_vex_reg_ok:
mov al,[mmx_size]
or al,al
jz avx_regs_size_ok
mov ah,[operand_size]
or ah,ah
jz avx_regs_size_ok
cmp al,ah
je avx_regs_size_ok
ja invalid_operand_size
cmp ah,16
jne invalid_operand_size
avx_regs_size_ok:
lods byte [esi]
cmp al,','
jne invalid_operand
avx_regs_rm:
call take_avx_rm
jc avx_regs_reg
mov al,[immediate_size]
cmp al,1
je mmx_imm8
jb instruction_ready
cmp al,-4
je sse_cmp_mem_ok
cmp byte [esi],','
jne invalid_operand
inc esi
call take_avx_register
shl al,4
jc invalid_operand
or byte [value],al
test al,80h
jz avx_regs_mem_reg_store
cmp [code_type],64
jne invalid_operand
avx_regs_mem_reg_store:
call take_imm4_if_needed
call store_instruction_with_imm8
jmp instruction_assembled
avx_regs_reg:
mov bl,al
call take_avx512_rounding
mov al,[immediate_size]
cmp al,1
je mmx_nomem_imm8
jb nomem_instruction_ready
cmp al,-4
je sse_cmp_nomem_ok
lods byte [esi]
cmp al,','
jne invalid_operand
mov al,bl
shl al,4
jc invalid_operand
or byte [value],al
test al,80h
jz avx_regs_reg_
cmp [code_type],64
jne invalid_operand
avx_regs_reg_:
call take_avx_rm
jc avx_regs_reg_reg
cmp [immediate_size],-2
jg invalid_operand
or [rex_prefix],8
call take_imm4_if_needed
call store_instruction_with_imm8
jmp instruction_assembled
avx_regs_reg_reg:
shl al,4
jc invalid_operand
and byte [value],1111b
or byte [value],al
call take_imm4_if_needed
call store_nomem_instruction
mov al,byte [value]
stos byte [edi]
jmp instruction_assembled
take_avx_rm:
xor cl,cl
xchg cl,[operand_size]
lods byte [esi]
call get_size_operator
cmp al,'['
je take_avx_mem
cmp al,10h
jne invalid_operand
mov [operand_size],cl
lods byte [esi]
call convert_avx_register
or cl,cl
jnz avx_reg_ok
or cl,[mmx_size]
jz avx_reg_ok
cmp ah,cl
je avx_reg_ok
jb invalid_operand_size
cmp ah,16
jne invalid_operand_size
avx_reg_ok:
stc
ret
take_avx_mem:
push ecx
call get_address
cmp byte [esi],'{'
jne avx_mem_ok
inc esi
lods byte [esi]
cmp al,1Fh
jne invalid_operand
mov al,[esi]
shr al,4
cmp al,1
jne invalid_operand
mov al,[mmx_size]
or al,al
jnz avx_mem_broadcast_check
mov eax,[esp]
or al,al
jnz avx_mem_broadcast_check
mov al,[broadcast_size]
mov [mmx_size],al
mov ah,cl
lods byte [esi]
and al,1111b
mov cl,al
mov al,[broadcast_size]
shl al,cl
mov [esp],al
mov cl,ah
jmp avx_mem_broadcast_ok
avx_mem_broadcast_check:
bsf eax,eax
xchg al,[broadcast_size]
mov [mmx_size],al
bsf eax,eax
jz invalid_operand
mov ah,[broadcast_size]
sub ah,al
lods byte [esi]
and al,1111b
cmp al,ah
jne invalid_operand_size
avx_mem_broadcast_ok:
or [vex_required],40h
lods byte [esi]
cmp al,'}'
jne invalid_operand
avx_mem_ok:
pop eax
or al,al
jz avx_mem_size_deciding
xchg al,[operand_size]
cmp [mmx_size],0
jne avx_mem_size_enforced
or al,al
jz avx_mem_size_ok
cmp al,[operand_size]
jne operand_sizes_do_not_match
avx_mem_size_ok:
clc
ret
avx_mem_size_deciding:
mov al,[operand_size]
cmp [mmx_size],0
jne avx_mem_size_enforced
cmp al,16
je avx_mem_size_ok
cmp al,32
je avx_mem_size_ok
cmp al,64
je avx_mem_size_ok
or al,al
jnz invalid_operand_size
call recoverable_unknown_size
avx_mem_size_enforced:
or al,al
jz avx_mem_size_ok
cmp al,[mmx_size]
je avx_mem_size_ok
jmp invalid_operand_size
take_imm4_if_needed:
cmp [immediate_size],-3
jne imm4_ok
push ebx ecx edx
lods byte [esi]
cmp al,','
jne invalid_operand
lods byte [esi]
cmp al,'('
jne invalid_operand
call get_byte_value
test al,11110000b
jnz value_out_of_range
or byte [value],al
pop edx ecx ebx
imm4_ok:
ret
take_avx512_mask:
cmp byte [esi],'{'
jne avx512_masking_ok
test [operand_flags],10h
jnz invalid_operand
inc esi
lods byte [esi]
cmp al,14h
jne invalid_operand
lods byte [esi]
mov ah,al
shr ah,4
cmp ah,5
jne invalid_operand
and al,111b
or al,al
jz invalid_operand
mov [mask_register],al
or [vex_required],20h
lods byte [esi]
cmp al,'}'
jne invalid_operand
cmp byte [esi],'{'
jne avx512_masking_ok
test [operand_flags],20h
jnz invalid_operand
inc esi
lods byte [esi]
cmp al,1Fh
jne invalid_operand
lods byte [esi]
or al,al
jnz invalid_operand
or [mask_register],80h
lods byte [esi]
cmp al,'}'
jne invalid_operand
avx512_masking_ok:
retn
take_avx512_rounding:
test [operand_flags],4+8
jz avx512_rounding_done
test [operand_flags],8
jz avx512_rounding_allowed
cmp [mmx_size],0
jne avx512_rounding_allowed
cmp [operand_size],64
jne avx512_rounding_done
avx512_rounding_allowed:
cmp byte [esi],','
jne avx512_rounding_done
cmp byte [esi+1],'{'
jne avx512_rounding_done
add esi,2
mov [rounding_mode],0
or [vex_required],40h
test [operand_flags],8
jz take_sae
or [vex_required],80h
lods byte [esi]
cmp al,1Fh
jne invalid_operand
lods byte [esi]
mov ah,al
shr ah,4
cmp ah,2
jne invalid_operand
and al,11b
mov [rounding_mode],al
lods byte [esi]
cmp al,'-'
jne invalid_operand
take_sae:
lods byte [esi]
cmp al,1Fh
jne invalid_operand
lods byte [esi]
cmp al,30h
jne invalid_operand
lods byte [esi]
cmp al,'}'
jne invalid_operand
avx512_rounding_done:
retn
 
avx_movdqu_instruction:
mov ah,0F3h
jmp avx_movdq_instruction
avx_movdqa_instruction:
mov ah,66h
avx_movdq_instruction:
mov [opcode_prefix],ah
or [vex_required],2
jmp avx_movps_instruction
avx512_movdqu16_instruction:
or [rex_prefix],8
avx512_movdqu8_instruction:
mov ah,0F2h
jmp avx_movdq_instruction_evex
avx512_movdqu64_instruction:
or [rex_prefix],8
avx512_movdqu32_instruction:
mov ah,0F3h
jmp avx_movdq_instruction_evex
avx512_movdqa64_instruction:
or [rex_prefix],8
avx512_movdqa32_instruction:
mov ah,66h
avx_movdq_instruction_evex:
mov [opcode_prefix],ah
or [vex_required],8
jmp avx_movps_instruction
avx_movpd_instruction:
mov [opcode_prefix],66h
or [rex_prefix],80h
avx_movps_instruction:
or [operand_flags],2
mov [base_code],0Fh
mov [extended_code],al
or [vex_required],1
xor al,al
mov [mmx_size],al
mov [broadcast_size],al
lods byte [esi]
call get_size_operator
cmp al,10h
je avx_reg
inc [extended_code]
test [extended_code],1
jnz avx_mem
add [extended_code],-1+10h
avx_mem:
cmp al,'['
jne invalid_operand
call get_address
or [operand_flags],20h
call take_avx512_mask
lods byte [esi]
cmp al,','
jne invalid_operand
call take_avx_register
mov [postbyte_register],al
jmp instruction_ready
avx_movntpd_instruction:
or [rex_prefix],80h
avx_movntdq_instruction:
mov [opcode_prefix],66h
avx_movntps_instruction:
mov [base_code],0Fh
mov [extended_code],al
or [vex_required],1
or [operand_flags],10h
mov [mmx_size],0
lods byte [esi]
call get_size_operator
jmp avx_mem
avx_compress_q_instruction:
or [rex_prefix],8
avx_compress_d_instruction:
or [vex_required],8
mov [mmx_size],0
call setup_66_0f_38
lods byte [esi]
call get_size_operator
cmp al,10h
jne avx_mem
lods byte [esi]
call convert_avx_register
mov bl,al
call take_avx512_mask
lods byte [esi]
cmp al,','
jne invalid_operand
call take_avx_register
mov [postbyte_register],al
jmp nomem_instruction_ready
avx_lddqu_instruction:
mov ah,0F2h
or [vex_required],2
avx_load_instruction:
mov [opcode_prefix],ah
mov [base_code],0Fh
mov [extended_code],al
mov [mmx_size],0
or [vex_required],1
call take_avx_register
mov [postbyte_register],al
lods byte [esi]
cmp al,','
jne invalid_operand
lods byte [esi]
call get_size_operator
cmp al,'['
jne invalid_operand
call get_address
jmp instruction_ready
avx_movntdqa_instruction:
mov [supplemental_code],al
mov al,38h
mov ah,66h
jmp avx_load_instruction
avx_movq_instruction:
or [rex_prefix],8
mov [mmx_size],8
jmp avx_mov_instruction
avx_movd_instruction:
mov [mmx_size],4
avx_mov_instruction:
or [vex_required],1
mov [opcode_prefix],66h
mov [base_code],0Fh
mov [extended_code],7Eh
lods byte [esi]
call get_size_operator
cmp al,10h
je avx_movd_reg
cmp al,'['
jne invalid_operand
call get_address
mov al,[mmx_size]
not al
and [operand_size],al
jnz invalid_operand_size
lods byte [esi]
cmp al,','
jne invalid_operand
lods byte [esi]
call get_size_operator
cmp al,10h
jne invalid_operand
lods byte [esi]
call convert_avx_register
cmp ah,16
jne invalid_operand_size
mov [postbyte_register],al
cmp [mmx_size],8
jne instruction_ready
and [rex_prefix],not 8
or [rex_prefix],80h
mov [extended_code],0D6h
jmp instruction_ready
avx_movd_reg:
lods byte [esi]
cmp al,0C0h
jae avx_movd_xmmreg
call convert_register
cmp ah,[mmx_size]
jne invalid_operand_size
mov [operand_size],0
mov bl,al
lods byte [esi]
cmp al,','
jne invalid_operand
lods byte [esi]
call get_size_operator
cmp al,10h
jne invalid_operand
lods byte [esi]
call convert_avx_register
cmp ah,16
jne invalid_operand_size
mov [postbyte_register],al
avx_movd_reg_ready:
test [rex_prefix],8
jz nomem_instruction_ready
cmp [code_type],64
jne illegal_instruction
jmp nomem_instruction_ready
avx_movd_xmmreg:
sub [extended_code],10h
call convert_avx_register
cmp ah,16
jne invalid_operand_size
mov [postbyte_register],al
mov [operand_size],0
lods byte [esi]
cmp al,','
jne invalid_operand
lods byte [esi]
call get_size_operator
cmp al,10h
je avx_movd_xmmreg_reg
cmp al,'['
jne invalid_operand
call get_address
mov al,[mmx_size]
cmp al,8
jne avx_movd_xmmreg_mem_ready
call avx_movq_xmmreg_xmmreg_opcode
avx_movd_xmmreg_mem_ready:
not al
test [operand_size],al
jnz invalid_operand_size
jmp instruction_ready
avx_movd_xmmreg_reg:
lods byte [esi]
cmp al,0C0h
jae avx_movq_xmmreg_xmmreg
call convert_register
cmp ah,[mmx_size]
jne invalid_operand_size
mov bl,al
jmp avx_movd_reg_ready
avx_movq_xmmreg_xmmreg:
cmp [mmx_size],8
jne invalid_operand
call avx_movq_xmmreg_xmmreg_opcode
call convert_avx_register
cmp ah,16
jne invalid_operand_size
mov bl,al
jmp nomem_instruction_ready
avx_movq_xmmreg_xmmreg_opcode:
and [rex_prefix],not 8
or [rex_prefix],80h
add [extended_code],10h
mov [opcode_prefix],0F3h
ret
avx_movddup_instruction:
or [vex_required],1
mov [opcode_prefix],0F2h
mov [base_code],0Fh
mov [extended_code],al
or [rex_prefix],80h
xor al,al
mov [mmx_size],al
mov [broadcast_size],al
lods byte [esi]
call get_size_operator
cmp al,10h
jne invalid_operand
lods byte [esi]
call convert_avx_register
mov [postbyte_register],al
cmp ah,16
ja avx_movddup_size_ok
mov [mmx_size],8
avx_movddup_size_ok:
call take_avx512_mask
jmp avx_vex_reg_ok
avx_movlpd_instruction:
mov [opcode_prefix],66h
or [rex_prefix],80h
avx_movlps_instruction:
mov [base_code],0Fh
mov [extended_code],al
mov [mmx_size],8
mov [broadcast_size],0
or [vex_required],1
lods byte [esi]
call get_size_operator
cmp al,10h
jne avx_movlps_mem
lods byte [esi]
call convert_avx_register
mov [postbyte_register],al
lods byte [esi]
cmp al,','
jne invalid_operand
call take_avx_register
mov [vex_register],al
cmp [operand_size],16
jne invalid_operand
mov [operand_size],0
lods byte [esi]
cmp al,','
jne invalid_operand
call take_avx_rm
jc invalid_operand
jmp instruction_ready
avx_movlps_mem:
cmp al,'['
jne invalid_operand
call get_address
avx_movlps_mem_:
mov al,[operand_size]
or al,al
jz avx_movlps_mem_size_ok
cmp al,[mmx_size]
jne invalid_operand_size
mov [operand_size],0
avx_movlps_mem_size_ok:
lods byte [esi]
cmp al,','
jne invalid_operand
call take_avx_register
cmp ah,16
jne invalid_operand
mov [postbyte_register],al
inc [extended_code]
jmp instruction_ready
avx_movhlps_instruction:
mov [base_code],0Fh
mov [extended_code],al
or [vex_required],1
call take_avx_register
cmp ah,16
jne invalid_operand
mov [postbyte_register],al
lods byte [esi]
cmp al,','
jne invalid_operand
call take_avx_register
mov [vex_register],al
lods byte [esi]
cmp al,','
jne invalid_operand
call take_avx_register
mov bl,al
jmp nomem_instruction_ready
avx_movsd_instruction:
mov al,0F2h
mov cl,8
or [rex_prefix],80h
jmp avx_movs_instruction
avx_movss_instruction:
mov al,0F3h
mov cl,4
avx_movs_instruction:
mov [opcode_prefix],al
mov [mmx_size],cl
or [vex_required],1
mov [base_code],0Fh
mov [extended_code],10h
lods byte [esi]
call get_size_operator
cmp al,10h
jne avx_movs_mem
lods byte [esi]
call convert_avx_register
cmp ah,16
jne invalid_operand
mov [postbyte_register],al
call take_avx512_mask
xor cl,cl
xchg cl,[operand_size]
lods byte [esi]
cmp al,','
jne invalid_operand
lods byte [esi]
call get_size_operator
cmp al,10h
jne avx_movs_reg_mem
mov [operand_size],cl
lods byte [esi]
call convert_avx_register
mov [vex_register],al
lods byte [esi]
cmp al,','
jne invalid_operand
call take_avx_register
mov bl,al
cmp bl,8
jb nomem_instruction_ready
inc [extended_code]
xchg bl,[postbyte_register]
jmp nomem_instruction_ready
avx_movs_reg_mem:
cmp al,'['
jne invalid_operand
call get_address
mov al,[operand_size]
or al,al
jz avx_movs_reg_mem_ok
cmp al,[mmx_size]
jne invalid_operand_size
avx_movs_reg_mem_ok:
jmp instruction_ready
avx_movs_mem:
cmp al,'['
jne invalid_operand
call get_address
or [operand_flags],20h
call take_avx512_mask
jmp avx_movlps_mem_
 
avx_comiss_instruction:
or [operand_flags],2+4+10h
mov cl,4
jmp avx_instruction
avx_comisd_instruction:
or [operand_flags],2+4+10h
mov [opcode_prefix],66h
or [rex_prefix],80h
mov cl,8
jmp avx_instruction
avx_movshdup_instruction:
or [operand_flags],2
mov [opcode_prefix],0F3h
xor cl,cl
jmp avx_instruction
avx_cvtqq2pd_instruction:
mov [opcode_prefix],0F3h
or [vex_required],8
or [operand_flags],2+4+8
or [rex_prefix],8
mov cx,0800h
jmp avx_instruction_with_broadcast
avx_pshuf_w_instruction:
mov [opcode_prefix],al
or [operand_flags],2
mov [immediate_size],1
mov al,70h
xor cl,cl
jmp avx_instruction
avx_single_source_128bit_instruction_38_noevex:
or [operand_flags],2
avx_128bit_instruction_38_noevex:
mov cl,16
jmp avx_instruction_38_noevex
avx_single_source_instruction_38_noevex:
or [operand_flags],2
jmp avx_pi_instruction_38_noevex
avx_pi_instruction_38_noevex:
xor cl,cl
avx_instruction_38_noevex:
or [vex_required],2
avx_instruction_38:
mov [opcode_prefix],66h
mov [supplemental_code],al
mov al,38h
jmp avx_instruction
avx_ss_instruction_3a_imm8_noevex:
mov cl,4
jmp avx_instruction_3a_imm8_noevex
avx_sd_instruction_3a_imm8_noevex:
mov cl,8
jmp avx_instruction_3a_imm8_noevex
avx_single_source_128bit_instruction_3a_imm8_noevex:
or [operand_flags],2
avx_128bit_instruction_3a_imm8_noevex:
mov cl,16
jmp avx_instruction_3a_imm8_noevex
avx_triple_source_instruction_3a_noevex:
xor cl,cl
mov [immediate_size],-1
mov byte [value],0
jmp avx_instruction_3a_noevex
avx_single_source_instruction_3a_imm8_noevex:
or [operand_flags],2
avx_pi_instruction_3a_imm8_noevex:
xor cl,cl
avx_instruction_3a_imm8_noevex:
mov [immediate_size],1
avx_instruction_3a_noevex:
or [vex_required],2
avx_instruction_3a:
mov [opcode_prefix],66h
mov [supplemental_code],al
mov al,3Ah
jmp avx_instruction
avx_pi_instruction_3a_imm8:
xor cl,cl
mov [immediate_size],1
jmp avx_instruction_3a
avx_pclmulqdq_instruction:
mov byte [value],al
mov [immediate_size],-4
xor cl,cl
mov al,44h
or [operand_flags],10h
jmp avx_instruction_3a
avx_instruction_38_nomask:
or [operand_flags],10h
xor cl,cl
jmp avx_instruction_38
 
avx512_single_source_pd_instruction_sae_imm8:
or [operand_flags],2
avx512_pd_instruction_sae_imm8:
or [rex_prefix],8
mov cx,0800h
jmp avx512_instruction_sae_imm8
avx512_single_source_ps_instruction_sae_imm8:
or [operand_flags],2
avx512_ps_instruction_sae_imm8:
mov cx,0400h
jmp avx512_instruction_sae_imm8
avx512_sd_instruction_sae_imm8:
or [rex_prefix],8
mov cx,0008h
jmp avx512_instruction_sae_imm8
avx512_ss_instruction_sae_imm8:
mov cx,0004h
avx512_instruction_sae_imm8:
or [operand_flags],4
avx512_instruction_imm8:
or [vex_required],8
mov [opcode_prefix],66h
mov [immediate_size],1
mov [supplemental_code],al
mov al,3Ah
jmp avx_instruction_with_broadcast
avx512_pd_instruction_er:
or [operand_flags],4+8
jmp avx512_pd_instruction
avx512_single_source_pd_instruction_sae:
or [operand_flags],4
avx512_single_source_pd_instruction:
or [operand_flags],2
avx512_pd_instruction:
or [rex_prefix],8
mov cx,0800h
jmp avx512_instruction
avx512_ps_instruction_er:
or [operand_flags],4+8
jmp avx512_ps_instruction
avx512_single_source_ps_instruction_sae:
or [operand_flags],4
avx512_single_source_ps_instruction:
or [operand_flags],2
avx512_ps_instruction:
mov cx,0400h
jmp avx512_instruction
avx512_sd_instruction_er:
or [operand_flags],8
avx512_sd_instruction_sae:
or [operand_flags],4
avx512_sd_instruction:
or [rex_prefix],8
mov cx,0008h
jmp avx512_instruction
avx512_ss_instruction_er:
or [operand_flags],8
avx512_ss_instruction_sae:
or [operand_flags],4
avx512_ss_instruction:
mov cx,0004h
avx512_instruction:
or [vex_required],8
mov [opcode_prefix],66h
mov [supplemental_code],al
mov al,38h
jmp avx_instruction_with_broadcast
avx512_exp2pd_instruction:
or [rex_prefix],8
or [operand_flags],2+4
mov cx,0840h
jmp avx512_instruction
avx512_exp2ps_instruction:
or [operand_flags],2+4
mov cx,0440h
jmp avx512_instruction
 
fma_instruction_pd:
or [rex_prefix],8
mov cx,0800h
jmp fma_instruction
fma_instruction_ps:
mov cx,0400h
jmp fma_instruction
fma_instruction_sd:
or [rex_prefix],8
mov cx,0008h
jmp fma_instruction
fma_instruction_ss:
mov cx,0004h
fma_instruction:
or [operand_flags],4+8
mov [opcode_prefix],66h
mov [supplemental_code],al
mov al,38h
jmp avx_instruction_with_broadcast
 
fma4_instruction_p:
xor cl,cl
jmp fma4_instruction
fma4_instruction_sd:
mov cl,8
jmp fma4_instruction
fma4_instruction_ss:
mov cl,4
fma4_instruction:
mov [immediate_size],-2
mov byte [value],0
jmp avx_instruction_3a_noevex
 
avx_cmp_pd_instruction:
mov [opcode_prefix],66h
or [rex_prefix],80h
mov cx,0800h
jmp avx_cmp_instruction
avx_cmp_ps_instruction:
mov cx,0400h
jmp avx_cmp_instruction
avx_cmp_sd_instruction:
mov [opcode_prefix],0F2h
or [rex_prefix],80h
mov cx,0008h
jmp avx_cmp_instruction
avx_cmp_ss_instruction:
mov [opcode_prefix],0F3h
mov cx,0004h
avx_cmp_instruction:
mov byte [value],al
mov [immediate_size],-4
or [operand_flags],4+20h
mov al,0C2h
jmp avx_cmp_common
avx_cmpeqq_instruction:
or [rex_prefix],80h
mov ch,8
mov [supplemental_code],al
mov al,38h
jmp avx_cmp_pi_instruction
avx_cmpeqd_instruction:
mov ch,4
jmp avx_cmp_pi_instruction
avx_cmpeqb_instruction:
xor ch,ch
jmp avx_cmp_pi_instruction
avx512_cmp_uq_instruction:
or [rex_prefix],8
mov ch,8
mov ah,1Eh
jmp avx_cmp_pi_instruction_evex
avx512_cmp_ud_instruction:
mov ch,4
mov ah,1Eh
jmp avx_cmp_pi_instruction_evex
avx512_cmp_q_instruction:
or [rex_prefix],8
mov ch,8
mov ah,1Fh
jmp avx_cmp_pi_instruction_evex
avx512_cmp_d_instruction:
mov ch,4
mov ah,1Fh
jmp avx_cmp_pi_instruction_evex
avx512_cmp_uw_instruction:
or [rex_prefix],8
avx512_cmp_ub_instruction:
xor ch,ch
mov ah,3Eh
jmp avx_cmp_pi_instruction_evex
avx512_cmp_w_instruction:
or [rex_prefix],8
avx512_cmp_b_instruction:
xor ch,ch
mov ah,3Fh
avx_cmp_pi_instruction_evex:
mov byte [value],al
mov [immediate_size],-4
mov [supplemental_code],ah
mov al,3Ah
or [vex_required],8
avx_cmp_pi_instruction:
xor cl,cl
or [operand_flags],20h
mov [opcode_prefix],66h
avx_cmp_common:
mov [mmx_size],cl
mov [broadcast_size],ch
mov [extended_code],al
mov [base_code],0Fh
lods byte [esi]
call get_size_operator
cmp al,14h
je avx_maskreg
cmp al,10h
jne invalid_operand
or [vex_required],2
jmp avx_reg
avx_maskreg:
cmp [operand_size],0
jne invalid_operand_size
or [vex_required],8
lods byte [esi]
call convert_mask_register
mov [postbyte_register],al
call take_avx512_mask
jmp avx_vex_reg
avx512_fpclasspd_instruction:
or [rex_prefix],8
mov cx,0800h
jmp avx_fpclass_instruction
avx512_fpclassps_instruction:
mov cx,0400h
jmp avx_fpclass_instruction
avx512_fpclasssd_instruction:
or [rex_prefix],8
mov cx,0008h
jmp avx_fpclass_instruction
avx512_fpclassss_instruction:
mov cx,0004h
avx_fpclass_instruction:
mov [broadcast_size],ch
mov [mmx_size],cl
or [operand_flags],2
call setup_66_0f_3a
mov [immediate_size],1
lods byte [esi]
cmp al,14h
je avx_maskreg
jmp invalid_operand
avx512_ptestnmd_instruction:
mov ch,4
jmp avx512_ptestnm_instruction
avx512_ptestnmq_instruction:
or [rex_prefix],8
mov ch,8
jmp avx512_ptestnm_instruction
avx512_ptestnmw_instruction:
or [rex_prefix],8
avx512_ptestnmb_instruction:
xor ch,ch
avx512_ptestnm_instruction:
mov ah,0F3h
jmp avx512_ptest_instruction
avx512_ptestmd_instruction:
mov ch,4
jmp avx512_ptestm_instruction
avx512_ptestmq_instruction:
or [rex_prefix],8
mov ch,8
jmp avx512_ptestm_instruction
avx512_ptestmw_instruction:
or [rex_prefix],8
avx512_ptestmb_instruction:
xor ch,ch
avx512_ptestm_instruction:
mov ah,66h
avx512_ptest_instruction:
xor cl,cl
mov [opcode_prefix],ah
mov [supplemental_code],al
mov al,38h
or [vex_required],8
jmp avx_cmp_common
 
mask_shift_instruction_q:
or [rex_prefix],8
mask_shift_instruction_d:
or [operand_flags],2
or [immediate_size],1
mov [opcode_prefix],66h
mov [supplemental_code],al
mov al,3Ah
jmp mask_instruction
mask_instruction_single_source_b:
mov [opcode_prefix],66h
jmp mask_instruction_single_source_w
mask_instruction_single_source_d:
mov [opcode_prefix],66h
mask_instruction_single_source_q:
or [rex_prefix],8
mask_instruction_single_source_w:
or [operand_flags],2
jmp mask_instruction
mask_instruction_b:
mov [opcode_prefix],66h
jmp mask_instruction_w
mask_instruction_d:
mov [opcode_prefix],66h
mask_instruction_q:
or [rex_prefix],8
mask_instruction_w:
mov [operand_size],32
mask_instruction:
or [vex_required],1
mov [base_code],0Fh
mov [extended_code],al
call take_mask_register
mov [postbyte_register],al
test [operand_flags],2
jnz mask_instruction_nds_ok
lods byte [esi]
cmp al,','
jne invalid_operand
call take_mask_register
mov [vex_register],al
mask_instruction_nds_ok:
lods byte [esi]
cmp al,','
jne invalid_operand
call take_mask_register
mov bl,al
cmp [immediate_size],0
jne mmx_nomem_imm8
jmp nomem_instruction_ready
take_mask_register:
lods byte [esi]
cmp al,14h
jne invalid_operand
lods byte [esi]
convert_mask_register:
mov ah,al
shr ah,4
cmp ah,5
jne invalid_operand
and al,1111b
ret
kmov_instruction:
mov [mmx_size],al
or [vex_required],1
mov [base_code],0Fh
mov [extended_code],90h
lods byte [esi]
cmp al,14h
je kmov_maskreg
cmp al,10h
je kmov_reg
call get_size_operator
inc [extended_code]
cmp al,'['
jne invalid_argument
call get_address
lods byte [esi]
cmp al,','
jne invalid_operand
call take_mask_register
mov [postbyte_register],al
kmov_with_mem:
mov ah,[mmx_size]
mov al,[operand_size]
or al,al
jz kmov_mem_size_ok
cmp al,ah
jne invalid_operand_size
kmov_mem_size_ok:
call setup_kmov_prefix
jmp instruction_ready
setup_kmov_prefix:
cmp ah,4
jb kmov_w_ok
or [rex_prefix],8
kmov_w_ok:
test ah,1 or 4
jz kmov_prefix_ok
mov [opcode_prefix],66h
kmov_prefix_ok:
ret
kmov_maskreg:
lods byte [esi]
call convert_mask_register
mov [postbyte_register],al
lods byte [esi]
cmp al,','
jne invalid_operand
lods byte [esi]
cmp al,14h
je kmov_maskreg_maskreg
cmp al,10h
je kmov_maskreg_reg
call get_size_operator
cmp al,'['
jne invalid_argument
call get_address
jmp kmov_with_mem
kmov_maskreg_maskreg:
lods byte [esi]
call convert_mask_register
mov bl,al
mov ah,[mmx_size]
call setup_kmov_prefix
jmp nomem_instruction_ready
kmov_maskreg_reg:
add [extended_code],2
lods byte [esi]
call convert_register
kmov_with_reg:
mov bl,al
mov al,[mmx_size]
mov ah,4
cmp al,ah
jbe kmov_reg_size_check
mov ah,al
kmov_reg_size_check:
cmp ah,[operand_size]
jne invalid_operand_size
cmp al,8
je kmov_f2_w1
cmp al,2
ja kmov_f2
je nomem_instruction_ready
mov [opcode_prefix],66h
jmp nomem_instruction_ready
kmov_f2_w1:
or [rex_prefix],8
cmp [code_type],64
jne illegal_instruction
kmov_f2:
mov [opcode_prefix],0F2h
jmp nomem_instruction_ready
kmov_reg:
add [extended_code],3
lods byte [esi]
call convert_register
mov [postbyte_register],al
lods byte [esi]
cmp al,','
jne invalid_operand
call take_mask_register
jmp kmov_with_reg
avx512_pmov_m2_instruction_w1:
or [rex_prefix],8
avx512_pmov_m2_instruction:
or [vex_required],8
call setup_f3_0f_38
call take_avx_register
mov [postbyte_register],al
lods byte [esi]
cmp al,','
jne invalid_operand
call take_mask_register
mov bl,al
jmp nomem_instruction_ready
avx512_pmov_2m_instruction_w1:
or [rex_prefix],8
avx512_pmov_2m_instruction:
or [vex_required],8
call setup_f3_0f_38
call take_mask_register
mov [postbyte_register],al
lods byte [esi]
cmp al,','
jne invalid_operand
call take_avx_register
mov bl,al
jmp nomem_instruction_ready
setup_f3_0f_38:
mov [extended_code],38h
mov [supplemental_code],al
mov [base_code],0Fh
mov [opcode_prefix],0F3h
ret
 
vzeroall_instruction:
mov [operand_size],32
vzeroupper_instruction:
mov [base_code],0Fh
mov [extended_code],al
and [displacement_compression],0
call store_vex_instruction_code
jmp instruction_assembled
vldmxcsr_instruction:
or [vex_required],2
jmp fxsave_instruction
 
avx_perm2f128_instruction:
or [vex_required],2
xor ch,ch
avx_instruction_imm8_without_128bit:
mov [immediate_size],1
mov ah,3Ah
jmp avx_instruction_without_128bit
avx512_shuf_q_instruction:
or [rex_prefix],8
or [vex_required],8
mov ch,8
jmp avx_instruction_imm8_without_128bit
avx512_shuf_d_instruction:
or [vex_required],8
mov ch,4
jmp avx_instruction_imm8_without_128bit
avx_permd_instruction:
mov ah,38h
mov ch,4
avx_instruction_without_128bit:
xor cl,cl
call setup_avx_66_supplemental
call take_avx_register
cmp ah,32
jb invalid_operand_size
mov [postbyte_register],al
call take_avx512_mask
jmp avx_vex_reg
setup_avx_66_supplemental:
mov [opcode_prefix],66h
mov [broadcast_size],ch
mov [mmx_size],cl
mov [base_code],0Fh
mov [extended_code],ah
mov [supplemental_code],al
or [vex_required],1
ret
avx_permq_instruction:
or [rex_prefix],8
mov ch,8
jmp avx_permil_instruction
avx_permilpd_instruction:
or [rex_prefix],80h
mov ch,8
jmp avx_permil_instruction
avx_permilps_instruction:
mov ch,4
avx_permil_instruction:
or [operand_flags],2
xor cl,cl
mov ah,3Ah
call setup_avx_66_supplemental
call take_avx_register
cmp [supplemental_code],4
jae avx_permil_size_ok
cmp ah,32
jb invalid_operand_size
avx_permil_size_ok:
mov [postbyte_register],al
call take_avx512_mask
lods byte [esi]
cmp al,','
jne invalid_operand
call take_avx_rm
jnc mmx_imm8
mov bl,al
cmp byte [esi],','
jne invalid_operand
mov al,[esi+1]
cmp al,11h
jne avx_permil_rm_or_imm8
mov al,[esi+3]
avx_permil_rm_or_imm8:
cmp al,'('
je mmx_nomem_imm8
mov [vex_register],bl
inc esi
mov [extended_code],38h
mov al,[supplemental_code]
cmp al,4
jb avx_permq_rm
add [supplemental_code],8
jmp avx_regs_rm
avx_permq_rm:
or [vex_required],8
shl al,5
neg al
add al,36h
mov [supplemental_code],al
jmp avx_regs_rm
vpermil_2pd_instruction:
mov [immediate_size],-2
mov byte [value],al
mov al,49h
jmp vpermil2_instruction_setup
vpermil_2ps_instruction:
mov [immediate_size],-2
mov byte [value],al
mov al,48h
jmp vpermil2_instruction_setup
vpermil2_instruction:
mov [immediate_size],-3
mov byte [value],0
vpermil2_instruction_setup:
or [vex_required],2
mov [base_code],0Fh
mov [supplemental_code],al
mov al,3Ah
xor cl,cl
jmp avx_instruction
 
avx_shift_q_instruction_evex:
or [vex_required],8
avx_shift_q_instruction:
or [rex_prefix],80h
mov cl,8
jmp avx_shift_instruction
avx_shift_d_instruction:
mov cl,4
jmp avx_shift_instruction
avx_shift_bw_instruction:
xor cl,cl
avx_shift_instruction:
mov [broadcast_size],cl
mov [mmx_size],0
mov [opcode_prefix],66h
mov [base_code],0Fh
mov [extended_code],al
or [vex_required],1
call take_avx_register
mov [postbyte_register],al
call take_avx512_mask
lods byte [esi]
cmp al,','
jne invalid_operand
xor cl,cl
xchg cl,[operand_size]
lods byte [esi]
call get_size_operator
cmp al,'['
je avx_shift_reg_mem
mov [operand_size],cl
cmp al,10h
jne invalid_operand
lods byte [esi]
call convert_avx_register
mov [vex_register],al
lods byte [esi]
cmp al,','
jne invalid_operand
push esi
xor cl,cl
xchg cl,[operand_size]
lods byte [esi]
call get_size_operator
cmp al,10h
je avx_shift_reg_reg_reg
pop esi
cmp al,'['
je avx_shift_reg_reg_mem
xchg cl,[operand_size]
test cl,not 1
jnz invalid_operand_size
dec esi
call convert_avx_shift_opcode
mov bl,al
jmp mmx_nomem_imm8
convert_avx_shift_opcode:
mov al,[extended_code]
mov ah,al
and ah,1111b
add ah,70h
mov [extended_code],ah
shr al,4
sub al,0Ch
shl al,1
xchg al,[postbyte_register]
xchg al,[vex_register]
ret
avx_shift_reg_reg_reg:
pop eax
lods byte [esi]
call convert_xmm_register
xchg cl,[operand_size]
mov bl,al
jmp nomem_instruction_ready
avx_shift_reg_reg_mem:
mov [mmx_size],16
push ecx
lods byte [esi]
call get_size_operator
call get_address
pop eax
xchg al,[operand_size]
test al,al
jz instruction_ready
cmp al,16
jne invalid_operand_size
jmp instruction_ready
avx_shift_reg_mem:
or [vex_required],8
call take_avx_mem
call convert_avx_shift_opcode
jmp mmx_imm8
avx_shift_dq_instruction:
mov [postbyte_register],al
mov [opcode_prefix],66h
mov [base_code],0Fh
mov [extended_code],73h
or [vex_required],1
mov [mmx_size],0
call take_avx_register
mov [vex_register],al
lods byte [esi]
cmp al,','
jne invalid_operand
lods byte [esi]
call get_size_operator
cmp al,'['
je avx_shift_dq_reg_mem
cmp al,10h
jne invalid_operand
lods byte [esi]
call convert_avx_register
mov bl,al
jmp mmx_nomem_imm8
avx_shift_dq_reg_mem:
or [vex_required],8
call get_address
jmp mmx_imm8
avx512_rotate_q_instruction:
mov cl,8
or [rex_prefix],cl
jmp avx512_rotate_instruction
avx512_rotate_d_instruction:
mov cl,4
avx512_rotate_instruction:
mov [broadcast_size],cl
mov [postbyte_register],al
mov [opcode_prefix],66h
mov [base_code],0Fh
mov [extended_code],72h
or [vex_required],8
mov [mmx_size],0
mov [immediate_size],1
call take_avx_register
mov [vex_register],al
call take_avx512_mask
jmp avx_vex_reg_ok
 
avx_pmovsxbq_instruction:
mov cl,2
jmp avx_pmovsx_instruction
avx_pmovsxbd_instruction:
mov cl,4
jmp avx_pmovsx_instruction
avx_pmovsxbw_instruction:
mov cl,8
avx_pmovsx_instruction:
mov [mmx_size],cl
or [vex_required],1
call setup_66_0f_38
call take_avx_register
mov [postbyte_register],al
call take_avx512_mask
lods byte [esi]
cmp al,','
jne invalid_operand
xor al,al
xchg al,[operand_size]
bsf ecx,eax
sub cl,4
shl [mmx_size],cl
push eax
lods byte [esi]
call get_size_operator
cmp al,10h
je avx_pmovsx_reg_reg
cmp al,'['
jne invalid_operand
call get_address
pop eax
xchg al,[operand_size]
or al,al
jz instruction_ready
cmp al,[mmx_size]
jne invalid_operand_size
jmp instruction_ready
avx_pmovsx_reg_reg:
lods byte [esi]
call convert_avx_register
mov bl,al
cmp ah,[mmx_size]
je avx_pmovsx_xmmreg_reg_size_ok
jb invalid_operand_size
cmp ah,16
jne invalid_operand_size
avx_pmovsx_xmmreg_reg_size_ok:
pop eax
mov [operand_size],al
jmp nomem_instruction_ready
avx512_pmovqb_instruction:
mov cl,2
jmp avx512_pmov_instruction
avx512_pmovdb_instruction:
mov cl,4
jmp avx512_pmov_instruction
avx512_pmovwb_instruction:
mov cl,8
avx512_pmov_instruction:
mov [mmx_size],cl
or [vex_required],8
mov [extended_code],38h
mov [supplemental_code],al
mov [base_code],0Fh
mov [opcode_prefix],0F3h
lods byte [esi]
call get_size_operator
cmp al,10h
je avx512_pmov_reg
cmp al,'['
jne invalid_operand
call get_address
or [operand_flags],20h
call avx512_pmov_common
or al,al
jz instruction_ready
cmp al,[mmx_size]
jne invalid_operand_size
jmp instruction_ready
avx512_pmov_common:
call take_avx512_mask
xor al,al
xchg al,[operand_size]
push eax
lods byte [esi]
cmp al,','
jne invalid_operand
call take_avx_register
mov [postbyte_register],al
mov al,ah
mov ah,cl
bsf ecx,eax
sub cl,4
shl [mmx_size],cl
mov cl,ah
pop eax
ret
avx512_pmov_reg:
lods byte [esi]
call convert_avx_register
mov bl,al
call avx512_pmov_common
cmp al,[mmx_size]
je nomem_instruction_ready
jb invalid_operand_size
cmp al,16
jne invalid_operand_size
jmp nomem_instruction_ready
 
avx_broadcast_128_instruction_noevex:
or [vex_required],2
mov cl,10h
jmp avx_broadcast_instruction
avx512_broadcast_32x2_instruction:
mov cl,08h
jmp avx_broadcast_instruction_evex
avx512_broadcast_32x4_instruction:
mov cl,10h
jmp avx_broadcast_instruction_evex
avx512_broadcast_32x8_instruction:
mov cl,20h
jmp avx_broadcast_instruction_evex
avx512_broadcast_64x2_instruction:
mov cl,10h
jmp avx_broadcast_instruction_w1_evex
avx512_broadcast_64x4_instruction:
mov cl,20h
avx_broadcast_instruction_w1_evex:
or [rex_prefix],8
avx_broadcast_instruction_evex:
or [vex_required],8
jmp avx_broadcast_instruction
avx_broadcastss_instruction:
mov cl,4
jmp avx_broadcast_instruction
avx_broadcastsd_instruction:
or [rex_prefix],80h
mov cl,8
jmp avx_broadcast_instruction
avx_pbroadcastb_instruction:
mov cl,1
jmp avx_broadcast_pi_instruction
avx_pbroadcastw_instruction:
mov cl,2
jmp avx_broadcast_pi_instruction
avx_pbroadcastd_instruction:
mov cl,4
jmp avx_broadcast_pi_instruction
avx_pbroadcastq_instruction:
mov cl,8
or [rex_prefix],80h
avx_broadcast_pi_instruction:
or [operand_flags],40h
avx_broadcast_instruction:
mov [opcode_prefix],66h
mov [supplemental_code],al
mov al,38h
mov [mmx_size],cl
mov [base_code],0Fh
mov [extended_code],al
or [vex_required],1
call take_avx_register
cmp ah,[mmx_size]
je invalid_operand_size
test [operand_flags],40h
jnz avx_broadcast_destination_size_ok
cmp [mmx_size],4
je avx_broadcast_destination_size_ok
cmp [supplemental_code],59h
je avx_broadcast_destination_size_ok
cmp ah,16
je invalid_operand_size
avx_broadcast_destination_size_ok:
xor ah,ah
xchg ah,[operand_size]
push eax
call take_avx512_mask
lods byte [esi]
cmp al,','
jne invalid_operand
lods byte [esi]
call get_size_operator
cmp al,10h
je avx_broadcast_reg_reg
cmp al,'['
jne invalid_operand
call get_address
pop eax
xchg ah,[operand_size]
mov [postbyte_register],al
mov al,[broadcast_size]
mov al,[mmx_size]
cmp al,ah
je instruction_ready
or al,al
jz instruction_ready
or ah,ah
jz instruction_ready
jmp invalid_operand_size
avx_broadcast_reg_reg:
lods byte [esi]
test [operand_flags],40h
jz avx_broadcast_reg_avx_reg
cmp al,60h
jb avx_broadcast_reg_general_reg
cmp al,80h
jb avx_broadcast_reg_avx_reg
cmp al,0C0h
jb avx_broadcast_reg_general_reg
avx_broadcast_reg_avx_reg:
call convert_avx_register
mov bl,al
mov al,[mmx_size]
or al,al
jz avx_broadcast_reg_avx_reg_size_ok
cmp ah,16
jne invalid_operand_size
cmp al,ah
jae invalid_operand
avx_broadcast_reg_avx_reg_size_ok:
pop eax
xchg ah,[operand_size]
mov [postbyte_register],al
test [vex_required],2
jnz invalid_operand
jmp nomem_instruction_ready
avx_broadcast_reg_general_reg:
call convert_register
mov bl,al
mov al,[mmx_size]
or al,al
jz avx_broadcast_reg_general_reg_size_ok
cmp al,ah
je avx_broadcast_reg_general_reg_size_ok
ja invalid_operand_size
cmp ah,4
jne invalid_operand_size
avx_broadcast_reg_general_reg_size_ok:
cmp al,4
jb avx_broadcast_reg_general_reg_ready
cmp al,8
mov al,3
jne avx_broadcast_reg_general_reg_ready
or [rex_prefix],8
avx_broadcast_reg_general_reg_ready:
add al,7Ah-1
mov [supplemental_code],al
or [vex_required],8
pop eax
xchg ah,[operand_size]
mov [postbyte_register],al
jmp nomem_instruction_ready
 
avx512_extract_64x4_instruction:
or [rex_prefix],8
avx512_extract_32x8_instruction:
or [vex_required],8
mov cl,32
jmp avx_extractf_instruction
avx512_extract_64x2_instruction:
or [rex_prefix],8
avx512_extract_32x4_instruction:
or [vex_required],8
mov cl,16
jmp avx_extractf_instruction
avx_extractf128_instruction:
or [vex_required],2
mov cl,16
avx_extractf_instruction:
mov [mmx_size],cl
call setup_66_0f_3a
lods byte [esi]
call get_size_operator
cmp al,10h
je avx_extractf_reg
cmp al,'['
jne invalid_operand
call get_address
xor al,al
xchg al,[operand_size]
or al,al
jz avx_extractf_mem_size_ok
cmp al,[mmx_size]
jne invalid_operand_size
avx_extractf_mem_size_ok:
call take_avx512_mask
lods byte [esi]
cmp al,','
jne invalid_operand
call take_avx_register
cmp ah,[mmx_size]
jbe invalid_operand_size
mov [postbyte_register],al
jmp mmx_imm8
avx_extractf_reg:
lods byte [esi]
call convert_avx_register
cmp ah,[mmx_size]
jne invalid_operand_size
push eax
call take_avx512_mask
mov [operand_size],0
lods byte [esi]
cmp al,','
jne invalid_operand
call take_avx_register
cmp ah,[mmx_size]
jbe invalid_operand_size
mov [postbyte_register],al
pop ebx
jmp mmx_nomem_imm8
avx512_insert_64x4_instruction:
or [rex_prefix],8
avx512_insert_32x8_instruction:
or [vex_required],8
mov cl,32
jmp avx_insertf_instruction
avx512_insert_64x2_instruction:
or [rex_prefix],8
avx512_insert_32x4_instruction:
or [vex_required],8
mov cl,16
jmp avx_insertf_instruction
avx_insertf128_instruction:
or [vex_required],2
mov cl,16
avx_insertf_instruction:
mov [mmx_size],cl
mov [broadcast_size],0
call setup_66_0f_3a
call take_avx_register
cmp ah,[mmx_size]
jbe invalid_operand
mov [postbyte_register],al
call take_avx512_mask
lods byte [esi]
cmp al,','
jne invalid_operand
call take_avx_register
mov [vex_register],al
mov al,[mmx_size]
xchg al,[operand_size]
push eax
lods byte [esi]
cmp al,','
jne invalid_operand
lods byte [esi]
call get_size_operator
cmp al,10h
je avx_insertf_reg_reg_reg
cmp al,'['
jne invalid_operand
call get_address
pop eax
mov [operand_size],al
jmp mmx_imm8
avx_insertf_reg_reg_reg:
lods byte [esi]
call convert_avx_register
mov bl,al
pop eax
mov [operand_size],al
jmp mmx_nomem_imm8
avx_extract_b_instruction:
mov cl,1
jmp avx_extract_instruction
avx_extract_w_instruction:
mov cl,2
jmp avx_extract_instruction
avx_extract_q_instruction:
or [rex_prefix],8
mov cl,8
jmp avx_extract_instruction
avx_extract_d_instruction:
mov cl,4
avx_extract_instruction:
mov [mmx_size],cl
call setup_66_0f_3a
or [vex_required],1
lods byte [esi]
call get_size_operator
cmp al,10h
je avx_extractps_reg
cmp al,'['
jne invalid_operand
call get_address
mov al,[mmx_size]
not al
and [operand_size],al
jnz invalid_operand_size
lods byte [esi]
cmp al,','
jne invalid_operand
lods byte [esi]
call get_size_operator
cmp al,10h
jne invalid_operand
lods byte [esi]
call convert_avx_register
cmp ah,16
jne invalid_operand_size
mov [postbyte_register],al
jmp mmx_imm8
avx_extractps_reg:
lods byte [esi]
call convert_register
mov bl,al
mov al,[mmx_size]
cmp ah,al
jb invalid_operand_size
cmp ah,4
je avx_extractps_reg_size_ok
cmp ah,8
jne invalid_operand_size
cmp [code_type],64
jne invalid_operand
cmp al,4
jae avx_extractps_reg_size_ok
or [rex_prefix],8
avx_extractps_reg_size_ok:
mov [operand_size],0
lods byte [esi]
cmp al,','
jne invalid_operand
lods byte [esi]
call get_size_operator
cmp al,10h
jne invalid_operand
lods byte [esi]
call convert_avx_register
cmp ah,16
jne invalid_operand_size
mov [postbyte_register],al
cmp [supplemental_code],15h
jne mmx_nomem_imm8
mov [extended_code],0C5h
xchg bl,[postbyte_register]
jmp mmx_nomem_imm8
avx_insertps_instruction:
mov [immediate_size],1
or [operand_flags],10h
mov [opcode_prefix],66h
mov [supplemental_code],al
mov al,3Ah
mov cl,4
jmp avx_instruction
avx_pinsrb_instruction:
mov cl,1
jmp avx_pinsr_instruction_3a
avx_pinsrw_instruction:
mov cl,2
jmp avx_pinsr_instruction
avx_pinsrd_instruction:
mov cl,4
jmp avx_pinsr_instruction_3a
avx_pinsrq_instruction:
cmp [code_type],64
jne illegal_instruction
mov cl,8
or [rex_prefix],8
avx_pinsr_instruction_3a:
mov [supplemental_code],al
mov al,3Ah
avx_pinsr_instruction:
mov [opcode_prefix],66h
mov [base_code],0Fh
mov [extended_code],al
mov [mmx_size],cl
or [vex_required],1
call take_avx_register
cmp ah,16
jne invalid_operand_size
mov [postbyte_register],al
lods byte [esi]
cmp al,','
jne invalid_operand
call take_avx_register
mov [vex_register],al
jmp pinsr_xmmreg
 
avx_cvtudq2pd_instruction:
or [vex_required],8
avx_cvtdq2pd_instruction:
mov [opcode_prefix],0F3h
mov cl,4
jmp avx_cvt_d_instruction
avx_cvtps2qq_instruction:
or [operand_flags],8
avx_cvttps2qq_instruction:
or [operand_flags],4
or [vex_required],8
mov [opcode_prefix],66h
mov cl,4
jmp avx_cvt_d_instruction
avx_cvtps2pd_instruction:
or [operand_flags],4
mov cl,4
avx_cvt_d_instruction:
mov [base_code],0Fh
mov [extended_code],al
or [vex_required],1
mov [broadcast_size],cl
call take_avx_register
mov [postbyte_register],al
call take_avx512_mask
lods byte [esi]
cmp al,','
jne invalid_operand
xor ecx,ecx
xchg cl,[operand_size]
mov al,cl
shr al,1
mov [mmx_size],al
lods byte [esi]
call get_size_operator
cmp al,'['
je avx_cvt_d_reg_mem
cmp al,10h
jne invalid_operand
mov [operand_size],0
lods byte [esi]
call convert_avx_register
cmp ah,[mmx_size]
je avx_cvt_d_reg_reg_size_ok
jb invalid_operand_size
cmp ah,16
jne invalid_operand_size
avx_cvt_d_reg_reg_size_ok:
mov bl,al
mov [operand_size],cl
call take_avx512_rounding
jmp nomem_instruction_ready
avx_cvt_d_reg_mem:
call take_avx_mem
jmp instruction_ready
avx_cvtpd2dq_instruction:
or [operand_flags],4+8
mov [opcode_prefix],0F2h
jmp avx_cvt_q_instruction
avx_cvtuqq2ps_instruction:
mov [opcode_prefix],0F2h
avx_cvtpd2udq_instruction:
or [operand_flags],8
avx_cvttpd2udq_instruction:
or [operand_flags],4
or [vex_required],8
jmp avx_cvt_q_instruction
avx_cvtpd2ps_instruction:
or [operand_flags],8
avx_cvttpd2dq_instruction:
or [operand_flags],4
mov [opcode_prefix],66h
avx_cvt_q_instruction:
mov [broadcast_size],8
mov [base_code],0Fh
mov [extended_code],al
or [vex_required],1
or [rex_prefix],80h
call take_avx_register
mov [postbyte_register],al
push eax
call take_avx512_mask
lods byte [esi]
cmp al,','
jne invalid_operand
xor al,al
mov [operand_size],al
mov [mmx_size],al
call take_avx_rm
jnc avx_cvt_q_reg_mem
mov bl,al
pop eax
call avx_cvt_q_check_size
call take_avx512_rounding
jmp nomem_instruction_ready
avx_cvt_q_reg_mem:
pop eax
call avx_cvt_q_check_size
jmp instruction_ready
avx_cvt_q_check_size:
mov al,[operand_size]
or al,al
jz avx_cvt_q_size_not_specified
cmp al,64
ja invalid_operand_size
shr al,1
cmp al,ah
je avx_cvt_q_size_ok
ja invalid_operand_size
cmp ah,16
jne invalid_operand_size
avx_cvt_q_size_ok:
ret
avx_cvt_q_size_not_specified:
cmp ah,64 shr 1
jne recoverable_unknown_size
mov [operand_size],64
ret
avx_cvttps2udq_instruction:
or [vex_required],8
or [operand_flags],2+4
mov cx,0400h
jmp avx_instruction_with_broadcast
avx_cvttps2dq_instruction:
mov [opcode_prefix],0F3h
or [operand_flags],2+4
mov cx,0400h
jmp avx_instruction_with_broadcast
avx_cvtph2ps_instruction:
mov [opcode_prefix],66h
mov [supplemental_code],al
or [operand_flags],4
mov al,38h
xor cl,cl
jmp avx_cvt_d_instruction
avx_cvtps2ph_instruction:
call setup_66_0f_3a
or [vex_required],1
or [operand_flags],4
lods byte [esi]
call get_size_operator
cmp al,10h
je vcvtps2ph_reg
cmp al,'['
jne invalid_operand
call get_address
call take_avx512_mask
lods byte [esi]
cmp al,','
jne invalid_operand
shl [operand_size],1
call take_avx_register
mov [postbyte_register],al
shr ah,1
mov [mmx_size],ah
jmp mmx_imm8
vcvtps2ph_reg:
lods byte [esi]
call convert_avx_register
mov bl,al
call take_avx512_mask
xor cl,cl
xchg cl,[operand_size]
shl cl,1
lods byte [esi]
cmp al,','
jne invalid_operand
call take_avx_register
mov [postbyte_register],al
or cl,cl
jz vcvtps2ph_reg_size_ok
cmp cl,ah
je vcvtps2ph_reg_size_ok
jb invalid_operand_size
cmp ah,16
jne invalid_operand_size
vcvtps2ph_reg_size_ok:
call take_avx512_rounding
jmp mmx_nomem_imm8
 
avx_cvtsd2usi_instruction:
or [operand_flags],8
avx_cvttsd2usi_instruction:
or [vex_required],8
jmp avx_cvttsd2si_instruction
avx_cvtsd2si_instruction:
or [operand_flags],8
avx_cvttsd2si_instruction:
mov ah,0F2h
mov cl,8
jmp avx_cvt_2si_instruction
avx_cvtss2usi_instruction:
or [operand_flags],8
avx_cvttss2usi_instruction:
or [vex_required],8
jmp avx_cvttss2si_instruction
avx_cvtss2si_instruction:
or [operand_flags],8
avx_cvttss2si_instruction:
mov ah,0F3h
mov cl,4
avx_cvt_2si_instruction:
or [operand_flags],2+4
mov [mmx_size],cl
mov [broadcast_size],0
mov [opcode_prefix],ah
mov [base_code],0Fh
mov [extended_code],al
or [vex_required],1
lods byte [esi]
call get_size_operator
cmp al,10h
jne invalid_operand
lods byte [esi]
call convert_register
mov [postbyte_register],al
mov [operand_size],0
cmp ah,4
je avx_cvt_2si_reg
cmp ah,8
jne invalid_operand_size
call operand_64bit
avx_cvt_2si_reg:
lods byte [esi]
cmp al,','
jne invalid_operand
call take_avx_rm
jnc instruction_ready
mov bl,al
call take_avx512_rounding
jmp nomem_instruction_ready
avx_cvtusi2sd_instruction:
or [vex_required],8
avx_cvtsi2sd_instruction:
mov ah,0F2h
mov cl,8
jmp avx_cvtsi_instruction
avx_cvtusi2ss_instruction:
or [vex_required],8
avx_cvtsi2ss_instruction:
mov ah,0F3h
mov cl,4
avx_cvtsi_instruction:
or [operand_flags],2+4+8
mov [mmx_size],cl
mov [opcode_prefix],ah
mov [base_code],0Fh
mov [extended_code],al
or [vex_required],1
call take_avx_register
cmp ah,16
jne invalid_operand_size
mov [postbyte_register],al
lods byte [esi]
cmp al,','
jne invalid_operand
call take_avx_register
mov [vex_register],al
lods byte [esi]
cmp al,','
jne invalid_operand
mov [operand_size],0
lods byte [esi]
call get_size_operator
cmp al,'['
je avx_cvtsi_reg_reg_mem
cmp al,10h
jne invalid_operand
lods byte [esi]
call convert_register
mov bl,al
cmp ah,4
je avx_cvtsi_reg_reg_reg32
cmp ah,8
jne invalid_operand_size
call operand_64bit
avx_cvtsi_rounding:
call take_avx512_rounding
jmp nomem_instruction_ready
avx_cvtsi_reg_reg_reg32:
cmp [mmx_size],8
jne avx_cvtsi_rounding
jmp nomem_instruction_ready
avx_cvtsi_reg_reg_mem:
call get_address
mov al,[operand_size]
mov [mmx_size],al
or al,al
jz single_mem_nosize
cmp al,4
je instruction_ready
cmp al,8
jne invalid_operand_size
call operand_64bit
jmp instruction_ready
 
avx_maskmov_w1_instruction:
or [rex_prefix],8
avx_maskmov_instruction:
call setup_66_0f_38
mov [mmx_size],0
or [vex_required],2
lods byte [esi]
call get_size_operator
cmp al,10h
jne avx_maskmov_mem
lods byte [esi]
call convert_avx_register
mov [postbyte_register],al
lods byte [esi]
cmp al,','
jne invalid_operand
call take_avx_register
mov [vex_register],al
lods byte [esi]
cmp al,','
jne invalid_operand
lods byte [esi]
call get_size_operator
cmp al,'['
jne invalid_operand
call get_address
jmp instruction_ready
avx_maskmov_mem:
cmp al,'['
jne invalid_operand
call get_address
lods byte [esi]
cmp al,','
jne invalid_operand
call take_avx_register
mov [vex_register],al
lods byte [esi]
cmp al,','
jne invalid_operand
call take_avx_register
mov [postbyte_register],al
add [supplemental_code],2
jmp instruction_ready
avx_movmskpd_instruction:
mov [opcode_prefix],66h
avx_movmskps_instruction:
mov [base_code],0Fh
mov [extended_code],50h
or [vex_required],2
lods byte [esi]
call get_size_operator
cmp al,10h
jne invalid_operand
lods byte [esi]
call convert_register
mov [postbyte_register],al
cmp ah,4
je avx_movmskps_reg_ok
cmp ah,8
jne invalid_operand_size
cmp [code_type],64
jne invalid_operand
avx_movmskps_reg_ok:
mov [operand_size],0
lods byte [esi]
cmp al,','
jne invalid_operand
call take_avx_register
mov bl,al
jmp nomem_instruction_ready
avx_maskmovdqu_instruction:
or [vex_required],2
jmp maskmovdqu_instruction
avx_pmovmskb_instruction:
or [vex_required],2
mov [opcode_prefix],66h
mov [base_code],0Fh
mov [extended_code],al
lods byte [esi]
call get_size_operator
cmp al,10h
jne invalid_operand
lods byte [esi]
call convert_register
cmp ah,4
je avx_pmovmskb_reg_size_ok
cmp [code_type],64
jne invalid_operand_size
cmp ah,8
jnz invalid_operand_size
avx_pmovmskb_reg_size_ok:
mov [postbyte_register],al
mov [operand_size],0
lods byte [esi]
cmp al,','
jne invalid_operand
call take_avx_register
mov bl,al
jmp nomem_instruction_ready
 
gather_pd_instruction:
or [rex_prefix],8
gather_ps_instruction:
call setup_66_0f_38
or [vex_required],4
or [operand_flags],20h
call take_avx_register
mov [postbyte_register],al
call take_avx512_mask
lods byte [esi]
cmp al,','
jne invalid_operand
xor cl,cl
xchg cl,[operand_size]
push ecx
lods byte [esi]
call get_size_operator
cmp al,'['
jne invalid_argument
call get_address
pop eax
xchg al,[operand_size]
gather_mem_size_check:
mov ah,4
test [rex_prefix],8
jz gather_elements_size_ok
add ah,ah
gather_elements_size_ok:
mov [mmx_size],ah
test al,al
jz gather_mem_size_ok
cmp al,ah
jne invalid_operand_size
gather_mem_size_ok:
cmp byte [esi],','
je gather_reg_mem_reg
test [vex_required],20h
jz invalid_operand
mov ah,[operand_size]
mov al,80h
jmp gather_arguments_ok
gather_reg_mem_reg:
or [vex_required],2
inc esi
call take_avx_register
gather_arguments_ok:
mov [vex_register],al
cmp al,[postbyte_register]
je disallowed_combination_of_registers
mov al,bl
and al,11111b
cmp al,[postbyte_register]
je disallowed_combination_of_registers
cmp al,[vex_register]
je disallowed_combination_of_registers
mov al,bl
shr al,5
cmp al,0Ch shr 1
je gather_vr128
mov ah,32
cmp al,6 shr 1
jne gather_regular
add ah,ah
gather_regular:
mov al,[rex_prefix]
shr al,3
xor al,[supplemental_code]
test al,1
jz gather_uniform
test [supplemental_code],1
jz gather_double
mov al,ah
xchg al,[operand_size]
add al,al
cmp al,ah
jne invalid_operand_size
jmp instruction_ready
gather_double:
add ah,ah
gather_uniform:
cmp ah,[operand_size]
jne invalid_operand_size
jmp instruction_ready
gather_vr128:
cmp ah,16
je instruction_ready
cmp ah,32
jne invalid_operand_size
test [supplemental_code],1
jnz invalid_operand_size
test [rex_prefix],8
jz invalid_operand_size
jmp instruction_ready
scatter_pd_instruction:
or [rex_prefix],8
scatter_ps_instruction:
call setup_66_0f_38
or [vex_required],4+8
or [operand_flags],20h
lods byte [esi]
call get_size_operator
cmp al,'['
jne invalid_argument
call get_address
call take_avx512_mask
lods byte [esi]
cmp al,','
jne invalid_operand
xor al,al
xchg al,[operand_size]
push eax
call take_avx_register
mov [postbyte_register],al
pop eax
jmp gather_mem_size_check
gatherpf_qpd_instruction:
mov ah,0C7h
jmp gatherpf_pd_instruction
gatherpf_dpd_instruction:
mov ah,0C6h
gatherpf_pd_instruction:
or [rex_prefix],8
mov cl,8
jmp gatherpf_instruction
gatherpf_qps_instruction:
mov ah,0C7h
jmp gatherpf_ps_instruction
gatherpf_dps_instruction:
mov ah,0C6h
gatherpf_ps_instruction:
mov cl,4
gatherpf_instruction:
mov [mmx_size],cl
mov [postbyte_register],al
mov al,ah
call setup_66_0f_38
or [vex_required],4+8
or [operand_flags],20h
lods byte [esi]
call get_size_operator
cmp al,'['
jne invalid_argument
call get_address
call take_avx512_mask
mov ah,[mmx_size]
mov al,[operand_size]
or al,al
jz gatherpf_mem_size_ok
cmp al,ah
jne invalid_operand_size
gatherpf_mem_size_ok:
mov [operand_size],64
mov al,6 shr 1
cmp ah,4
je gatherpf_check_vsib
cmp [supplemental_code],0C6h
jne gatherpf_check_vsib
mov al,0Eh shr 1
gatherpf_check_vsib:
mov ah,bl
shr ah,5
cmp al,ah
jne invalid_operand
jmp instruction_ready
 
bmi_instruction:
mov [base_code],0Fh
mov [extended_code],38h
mov [supplemental_code],0F3h
mov [postbyte_register],al
bmi_reg:
or [vex_required],2
lods byte [esi]
call get_size_operator
cmp al,10h
jne invalid_operand
lods byte [esi]
call convert_register
mov [vex_register],al
lods byte [esi]
cmp al,','
jne invalid_operand
lods byte [esi]
call get_size_operator
cmp al,10h
je bmi_reg_reg
cmp al,'['
jne invalid_argument
call get_address
call operand_32or64
jmp instruction_ready
bmi_reg_reg:
lods byte [esi]
call convert_register
mov bl,al
call operand_32or64
jmp nomem_instruction_ready
operand_32or64:
mov al,[operand_size]
cmp al,4
je operand_32or64_ok
cmp al,8
jne invalid_operand_size
cmp [code_type],64
jne invalid_operand
or [rex_prefix],8
operand_32or64_ok:
ret
pdep_instruction:
mov [opcode_prefix],0F2h
jmp andn_instruction
pext_instruction:
mov [opcode_prefix],0F3h
andn_instruction:
mov [base_code],0Fh
mov [extended_code],38h
mov [supplemental_code],al
or [vex_required],2
lods byte [esi]
call get_size_operator
cmp al,10h
jne invalid_operand
lods byte [esi]
call convert_register
mov [postbyte_register],al
lods byte [esi]
cmp al,','
jne invalid_operand
jmp bmi_reg
sarx_instruction:
mov [opcode_prefix],0F3h
jmp bzhi_instruction
shrx_instruction:
mov [opcode_prefix],0F2h
jmp bzhi_instruction
shlx_instruction:
mov [opcode_prefix],66h
bzhi_instruction:
mov [base_code],0Fh
mov [extended_code],38h
mov [supplemental_code],al
or [vex_required],2
call get_reg_mem
jc bzhi_reg_reg
call get_vex_source_register
jc invalid_operand
call operand_32or64
jmp instruction_ready
bzhi_reg_reg:
call get_vex_source_register
jc invalid_operand
call operand_32or64
jmp nomem_instruction_ready
get_vex_source_register:
lods byte [esi]
cmp al,','
jne invalid_operand
lods byte [esi]
call get_size_operator
cmp al,10h
jne no_vex_source_register
lods byte [esi]
call convert_register
mov [vex_register],al
clc
ret
no_vex_source_register:
stc
ret
bextr_instruction:
mov [base_code],0Fh
mov [extended_code],38h
mov [supplemental_code],al
or [vex_required],2
call get_reg_mem
jc bextr_reg_reg
call get_vex_source_register
jc bextr_reg_mem_imm32
call operand_32or64
jmp instruction_ready
bextr_reg_reg:
call get_vex_source_register
jc bextr_reg_reg_imm32
call operand_32or64
jmp nomem_instruction_ready
setup_bextr_imm_opcode:
mov [xop_opcode_map],0Ah
mov [base_code],10h
call operand_32or64
ret
bextr_reg_mem_imm32:
call get_imm32
call setup_bextr_imm_opcode
jmp store_instruction_with_imm32
bextr_reg_reg_imm32:
call get_imm32
call setup_bextr_imm_opcode
store_nomem_instruction_with_imm32:
call store_nomem_instruction
mov eax,dword [value]
call mark_relocation
stos dword [edi]
jmp instruction_assembled
get_imm32:
cmp al,'('
jne invalid_operand
push edx ebx ecx
call get_dword_value
mov dword [value],eax
pop ecx ebx edx
ret
rorx_instruction:
mov [opcode_prefix],0F2h
mov [base_code],0Fh
mov [extended_code],3Ah
mov [supplemental_code],al
or [vex_required],2
call get_reg_mem
jc rorx_reg_reg
call operand_32or64
jmp mmx_imm8
rorx_reg_reg:
call operand_32or64
jmp mmx_nomem_imm8
 
tbm_instruction:
mov [xop_opcode_map],9
mov ah,al
shr ah,4
and al,111b
mov [base_code],ah
mov [postbyte_register],al
jmp bmi_reg
 
llwpcb_instruction:
or [vex_required],2
mov [xop_opcode_map],9
mov [base_code],12h
mov [postbyte_register],al
lods byte [esi]
call get_size_operator
cmp al,10h
jne invalid_operand
lods byte [esi]
call convert_register
mov bl,al
call operand_32or64
jmp nomem_instruction_ready
lwpins_instruction:
or [vex_required],2
mov [xop_opcode_map],0Ah
mov [base_code],12h
mov [vex_register],al
lods byte [esi]
call get_size_operator
cmp al,10h
jne invalid_operand
lods byte [esi]
call convert_register
mov [postbyte_register],al
lods byte [esi]
cmp al,','
jne invalid_operand
xor cl,cl
xchg cl,[operand_size]
lods byte [esi]
call get_size_operator
cmp al,10h
je lwpins_reg_reg
cmp al,'['
jne invalid_argument
push ecx
call get_address
pop eax
xchg al,[operand_size]
test al,al
jz lwpins_reg_mem_size_ok
cmp al,4
jne invalid_operand_size
lwpins_reg_mem_size_ok:
call prepare_lwpins
jmp store_instruction_with_imm32
lwpins_reg_reg:
lods byte [esi]
call convert_register
cmp ah,4
jne invalid_operand_size
mov [operand_size],cl
mov bl,al
call prepare_lwpins
jmp store_nomem_instruction_with_imm32
prepare_lwpins:
lods byte [esi]
cmp al,','
jne invalid_operand
lods byte [esi]
call get_imm32
call operand_32or64
mov al,[vex_register]
xchg al,[postbyte_register]
mov [vex_register],al
ret
 
xop_single_source_sd_instruction:
or [operand_flags],2
mov [mmx_size],8
jmp xop_instruction_9
xop_single_source_ss_instruction:
or [operand_flags],2
mov [mmx_size],4
jmp xop_instruction_9
xop_single_source_instruction:
or [operand_flags],2
mov [mmx_size],0
xop_instruction_9:
mov [base_code],al
mov [xop_opcode_map],9
jmp avx_xop_common
xop_single_source_128bit_instruction:
or [operand_flags],2
mov [mmx_size],16
jmp xop_instruction_9
xop_triple_source_128bit_instruction:
mov [immediate_size],-1
mov byte [value],0
mov [mmx_size],16
jmp xop_instruction_8
xop_128bit_instruction:
mov [immediate_size],-2
mov byte [value],0
mov [mmx_size],16
xop_instruction_8:
mov [base_code],al
mov [xop_opcode_map],8
jmp avx_xop_common
xop_pcom_b_instruction:
mov ah,0CCh
jmp xop_pcom_instruction
xop_pcom_d_instruction:
mov ah,0CEh
jmp xop_pcom_instruction
xop_pcom_q_instruction:
mov ah,0CFh
jmp xop_pcom_instruction
xop_pcom_w_instruction:
mov ah,0CDh
jmp xop_pcom_instruction
xop_pcom_ub_instruction:
mov ah,0ECh
jmp xop_pcom_instruction
xop_pcom_ud_instruction:
mov ah,0EEh
jmp xop_pcom_instruction
xop_pcom_uq_instruction:
mov ah,0EFh
jmp xop_pcom_instruction
xop_pcom_uw_instruction:
mov ah,0EDh
xop_pcom_instruction:
mov byte [value],al
mov [immediate_size],-4
mov [mmx_size],16
mov [base_code],ah
mov [xop_opcode_map],8
jmp avx_xop_common
vpcmov_instruction:
or [vex_required],2
mov [immediate_size],-2
mov byte [value],0
mov [mmx_size],0
mov [base_code],al
mov [xop_opcode_map],8
jmp avx_xop_common
xop_shift_instruction:
mov [base_code],al
or [vex_required],2
mov [xop_opcode_map],9
call take_avx_register
cmp ah,16
jne invalid_operand
mov [postbyte_register],al
lods byte [esi]
cmp al,','
jne invalid_operand
lods byte [esi]
call get_size_operator
cmp al,'['
je xop_shift_reg_mem
cmp al,10h
jne invalid_operand
lods byte [esi]
call convert_xmm_register
mov [vex_register],al
lods byte [esi]
cmp al,','
jne invalid_operand
push esi
xor cl,cl
xchg cl,[operand_size]
lods byte [esi]
call get_size_operator
pop esi
xchg cl,[operand_size]
cmp al,'['
je xop_shift_reg_reg_mem
cmp al,10h
jne xop_shift_reg_reg_imm
call take_avx_register
mov bl,al
xchg bl,[vex_register]
jmp nomem_instruction_ready
xop_shift_reg_reg_mem:
or [rex_prefix],8
lods byte [esi]
call get_size_operator
call get_address
jmp instruction_ready
xop_shift_reg_reg_imm:
xor bl,bl
xchg bl,[vex_register]
cmp [base_code],94h
jae invalid_operand
add [base_code],30h
mov [xop_opcode_map],8
dec esi
jmp mmx_nomem_imm8
xop_shift_reg_mem:
call get_address
lods byte [esi]
cmp al,','
jne invalid_operand
push esi
xor cl,cl
xchg cl,[operand_size]
lods byte [esi]
call get_size_operator
pop esi
xchg cl,[operand_size]
cmp al,10h
jne xop_shift_reg_mem_imm
call take_avx_register
mov [vex_register],al
jmp instruction_ready
xop_shift_reg_mem_imm:
cmp [base_code],94h
jae invalid_operand
add [base_code],30h
mov [xop_opcode_map],8
dec esi
jmp mmx_imm8
 
avx512_4vnniw_instruction:
mov [opcode_prefix],0F2h
mov [base_code],0Fh
mov [extended_code],38h
mov [supplemental_code],al
mov [mmx_size],16
mov [broadcast_size],0
or [vex_required],8
call take_avx_register
mov [postbyte_register],al
call take_avx512_mask
lods byte [esi]
cmp al,','
jne invalid_operand
call take_avx_register
mov [vex_register],al
cmp byte [esi],'+'
jne reg4_ok
inc esi
cmp dword [esi],29030128h
jne invalid_operand
lods dword [esi]
reg4_ok:
cmp [operand_size],64
jne invalid_operand_size
mov [operand_size],0
lods byte [esi]
cmp al,','
jne invalid_operand
call take_avx_rm
jc invalid_operand
mov [operand_size],64
jmp instruction_ready
 
set_evex_mode:
mov [evex_mode],al
jmp instruction_assembled
 
take_avx_register:
lods byte [esi]
call get_size_operator
cmp al,10h
jne invalid_operand
lods byte [esi]
convert_avx_register:
mov ah,al
and al,1Fh
and ah,0E0h
sub ah,60h
jb invalid_operand
jz avx512_register_size
sub ah,60h
jb invalid_operand
jnz avx_register_size_ok
mov ah,16
jmp avx_register_size_ok
avx512_register_size:
mov ah,64
avx_register_size_ok:
cmp al,8
jb match_register_size
cmp [code_type],64
jne invalid_operand
jmp match_register_size
store_vex_instruction_code:
test [rex_prefix],10h
jnz invalid_operand
test [vex_required],0F8h
jnz store_evex_instruction_code
test [vex_register],10000b
jnz store_evex_instruction_code
cmp [operand_size],64
je store_evex_instruction_code
mov al,[base_code]
cmp al,0Fh
jne store_xop_instruction_code
test [vex_required],2
jnz prepare_vex
cmp [evex_mode],0
je prepare_vex
cmp [displacement_compression],1
jne prepare_vex
cmp edx,80h
jb prepare_vex
cmp edx,-80h
jae prepare_vex
mov al,bl
or al,bh
shr al,4
cmp al,2
je prepare_vex
call compress_displacement
cmp [displacement_compression],2
ja prepare_evex
jb prepare_vex
dec [displacement_compression]
mov edx,[uncompressed_displacement]
prepare_vex:
mov ah,[extended_code]
cmp ah,38h
je store_vex_0f38_instruction_code
cmp ah,3Ah
je store_vex_0f3a_instruction_code
test [rex_prefix],1011b
jnz store_vex_0f_instruction_code
mov [edi+2],ah
mov byte [edi],0C5h
mov al,[vex_register]
not al
shl al,3
mov ah,[rex_prefix]
shl ah,5
and ah,80h
xor al,ah
call get_vex_lpp_bits
mov [edi+1],al
call check_vex
add edi,3
ret
get_vex_lpp_bits:
cmp [operand_size],32
jne get_vex_pp_bits
or al,100b
get_vex_pp_bits:
mov ah,[opcode_prefix]
cmp ah,66h
je vex_66
cmp ah,0F3h
je vex_f3
cmp ah,0F2h
je vex_f2
test ah,ah
jnz disallowed_combination_of_registers
ret
vex_f2:
or al,11b
ret
vex_f3:
or al,10b
ret
vex_66:
or al,1
ret
store_vex_0f38_instruction_code:
mov al,11100010b
mov ah,[supplemental_code]
jmp make_c4_vex
store_vex_0f3a_instruction_code:
mov al,11100011b
mov ah,[supplemental_code]
jmp make_c4_vex
store_vex_0f_instruction_code:
mov al,11100001b
make_c4_vex:
mov [edi+3],ah
mov byte [edi],0C4h
mov ah,[rex_prefix]
shl ah,5
xor al,ah
mov [edi+1],al
call check_vex
mov al,[vex_register]
xor al,1111b
shl al,3
mov ah,[rex_prefix]
shl ah,4
and ah,80h
or al,ah
call get_vex_lpp_bits
mov [edi+2],al
add edi,4
ret
check_vex:
cmp [code_type],64
je vex_ok
not al
test al,11000000b
jnz invalid_operand
test [rex_prefix],40h
jnz invalid_operand
vex_ok:
ret
store_xop_instruction_code:
mov [edi+3],al
mov byte [edi],8Fh
mov al,[xop_opcode_map]
mov ah,[rex_prefix]
test ah,40h
jz xop_ok
cmp [code_type],64
jne invalid_operand
xop_ok:
not ah
shl ah,5
xor al,ah
mov [edi+1],al
mov al,[vex_register]
xor al,1111b
shl al,3
mov ah,[rex_prefix]
shl ah,4
and ah,80h
or al,ah
call get_vex_lpp_bits
mov [edi+2],al
add edi,4
ret
store_evex_instruction_code:
test [vex_required],2
jnz invalid_operand
cmp [base_code],0Fh
jne invalid_operand
cmp [displacement_compression],1
jne prepare_evex
call compress_displacement
prepare_evex:
mov ah,[extended_code]
cmp ah,38h
je store_evex_0f38_instruction_code
cmp ah,3Ah
je store_evex_0f3a_instruction_code
mov al,11110001b
make_evex:
mov [edi+4],ah
mov byte [edi],62h
mov ah,[rex_prefix]
shl ah,5
xor al,ah
mov ah,[vex_required]
and ah,10h
xor al,ah
mov [edi+1],al
call check_vex
mov al,[vex_register]
not al
and al,1111b
shl al,3
mov ah,[rex_prefix]
shl ah,4
or ah,[rex_prefix]
and ah,80h
or al,ah
or al,100b
call get_vex_pp_bits
mov [edi+2],al
mov al,[vex_register]
not al
shr al,1
and al,1000b
test [vex_required],80h
jne evex_rounding
mov ah,[operand_size]
cmp ah,16
jbe evex_l_ok
or al,ah
jmp evex_l_ok
evex_rounding:
mov ah,[rounding_mode]
shl ah,5
or al,ah
evex_l_ok:
test [vex_required],20h
jz evex_zaaa_ok
or al,[mask_register]
evex_zaaa_ok:
test [vex_required],40h
jz evex_b_ok
or al,10h
evex_b_ok:
mov [edi+3],al
add edi,5
ret
store_evex_0f38_instruction_code:
mov al,11110010b
mov ah,[supplemental_code]
jmp make_evex
store_evex_0f3a_instruction_code:
mov al,11110011b
mov ah,[supplemental_code]
jmp make_evex
compress_displacement:
mov ebp,ecx
mov [uncompressed_displacement],edx
or edx,edx
jz displacement_compressed
xor ecx,ecx
mov cl,[mmx_size]
test cl,cl
jnz calculate_displacement_scale
mov cl,[operand_size]
calculate_displacement_scale:
bsf ecx,ecx
jz displacement_compression_ok
xor eax,eax
shrd eax,edx,cl
jnz displacement_not_compressed
sar edx,cl
cmp edx,80h
jb displacement_compressed
cmp edx,-80h
jnb displacement_compressed
shl edx,cl
displacement_not_compressed:
inc [displacement_compression]
jmp displacement_compression_ok
displacement_compressed:
add [displacement_compression],2
displacement_compression_ok:
mov ecx,ebp
ret
/programs/develop/koldbg/fasm/errors.inc
0,0 → 1,194
 
; flat assembler core
; Copyright (c) 1999-2019, Tomasz Grysztar.
; All rights reserved.
 
out_of_memory:
push _out_of_memory
jmp fatal_error
stack_overflow:
push _stack_overflow
jmp fatal_error
main_file_not_found:
push _main_file_not_found
jmp fatal_error
write_failed:
push _write_failed
jmp fatal_error
 
unexpected_end_of_file:
push _unexpected_end_of_file
jmp general_error
code_cannot_be_generated:
push _code_cannot_be_generated
jmp general_error
format_limitations_exceeded:
push _format_limitations_exceeded
jmp general_error
invalid_definition:
push _invalid_definition
general_error:
cmp [symbols_file],0
je fatal_error
call dump_preprocessed_source
jmp fatal_error
 
file_not_found:
push _file_not_found
jmp error_with_source
error_reading_file:
push _error_reading_file
jmp error_with_source
invalid_file_format:
push _invalid_file_format
jmp error_with_source
invalid_macro_arguments:
push _invalid_macro_arguments
jmp error_with_source
incomplete_macro:
push _incomplete_macro
jmp error_with_source
unexpected_characters:
push _unexpected_characters
jmp error_with_source
invalid_argument:
push _invalid_argument
jmp error_with_source
illegal_instruction:
push _illegal_instruction
jmp error_with_source
invalid_operand:
push _invalid_operand
jmp error_with_source
invalid_operand_size:
push _invalid_operand_size
jmp error_with_source
operand_size_not_specified:
push _operand_size_not_specified
jmp error_with_source
operand_sizes_do_not_match:
push _operand_sizes_do_not_match
jmp error_with_source
invalid_address_size:
push _invalid_address_size
jmp error_with_source
address_sizes_do_not_agree:
push _address_sizes_do_not_agree
jmp error_with_source
disallowed_combination_of_registers:
push _disallowed_combination_of_registers
jmp error_with_source
long_immediate_not_encodable:
push _long_immediate_not_encodable
jmp error_with_source
relative_jump_out_of_range:
push _relative_jump_out_of_range
jmp error_with_source
invalid_expression:
push _invalid_expression
jmp error_with_source
invalid_address:
push _invalid_address
jmp error_with_source
invalid_value:
push _invalid_value
jmp error_with_source
value_out_of_range:
push _value_out_of_range
jmp error_with_source
undefined_symbol:
mov edi,message
mov esi,_undefined_symbol
call copy_asciiz
push message
cmp [error_info],0
je error_with_source
mov esi,[error_info]
mov esi,[esi+24]
or esi,esi
jz error_with_source
mov byte [edi-1],20h
call write_quoted_symbol_name
jmp error_with_source
copy_asciiz:
lods byte [esi]
stos byte [edi]
test al,al
jnz copy_asciiz
ret
write_quoted_symbol_name:
mov al,27h
stosb
movzx ecx,byte [esi-1]
rep movs byte [edi],[esi]
mov ax,27h
stosw
ret
symbol_out_of_scope:
mov edi,message
mov esi,_symbol_out_of_scope_1
call copy_asciiz
cmp [error_info],0
je finish_symbol_out_of_scope_message
mov esi,[error_info]
mov esi,[esi+24]
or esi,esi
jz finish_symbol_out_of_scope_message
mov byte [edi-1],20h
call write_quoted_symbol_name
finish_symbol_out_of_scope_message:
mov byte [edi-1],20h
mov esi,_symbol_out_of_scope_2
call copy_asciiz
push message
jmp error_with_source
invalid_use_of_symbol:
push _invalid_use_of_symbol
jmp error_with_source
name_too_long:
push _name_too_long
jmp error_with_source
invalid_name:
push _invalid_name
jmp error_with_source
reserved_word_used_as_symbol:
push _reserved_word_used_as_symbol
jmp error_with_source
symbol_already_defined:
push _symbol_already_defined
jmp error_with_source
missing_end_quote:
push _missing_end_quote
jmp error_with_source
missing_end_directive:
push _missing_end_directive
jmp error_with_source
unexpected_instruction:
push _unexpected_instruction
jmp error_with_source
extra_characters_on_line:
push _extra_characters_on_line
jmp error_with_source
section_not_aligned_enough:
push _section_not_aligned_enough
jmp error_with_source
setting_already_specified:
push _setting_already_specified
jmp error_with_source
data_already_defined:
push _data_already_defined
jmp error_with_source
too_many_repeats:
push _too_many_repeats
jmp error_with_source
assertion_failed:
push _assertion_failed
jmp error_with_source
invoked_error:
push _invoked_error
error_with_source:
cmp [symbols_file],0
je assembler_error
call dump_preprocessed_source
call restore_preprocessed_source
jmp assembler_error
/programs/develop/koldbg/fasm/exprcalc.inc
0,0 → 1,2270
 
; flat assembler core
; Copyright (c) 1999-2019, Tomasz Grysztar.
; All rights reserved.
 
calculate_expression:
mov [current_offset],edi
mov [value_undefined],0
cmp byte [esi],0
je get_string_value
cmp byte [esi],'.'
je convert_fp
calculation_loop:
mov eax,[tagged_blocks]
sub eax,0Ch
cmp eax,edi
jbe out_of_memory
lods byte [esi]
cmp al,1
je get_byte_number
cmp al,2
je get_word_number
cmp al,4
je get_dword_number
cmp al,8
je get_qword_number
cmp al,0Fh
je value_out_of_range
cmp al,10h
je get_register
cmp al,11h
je get_label
cmp al,')'
je expression_calculated
cmp al,']'
je expression_calculated
cmp al,'!'
je invalid_expression
sub edi,14h
mov ebx,edi
sub ebx,14h
cmp al,0F0h
je calculate_rva
cmp al,0F1h
je calculate_plt
cmp al,0D0h
je calculate_not
cmp al,0E0h
je calculate_bsf
cmp al,0E1h
je calculate_bsr
cmp al,083h
je calculate_neg
mov dx,[ebx+8]
or dx,[edi+8]
cmp al,80h
je calculate_add
cmp al,81h
je calculate_sub
mov ah,[ebx+12]
or ah,[edi+12]
jz absolute_values_calculation
call recoverable_misuse
absolute_values_calculation:
cmp al,90h
je calculate_mul
cmp al,91h
je calculate_div
or dx,dx
jnz invalid_expression
cmp al,0A0h
je calculate_mod
cmp al,0B0h
je calculate_and
cmp al,0B1h
je calculate_or
cmp al,0B2h
je calculate_xor
cmp al,0C0h
je calculate_shl
cmp al,0C1h
je calculate_shr
jmp invalid_expression
expression_calculated:
sub edi,14h
cmp [value_undefined],0
je expression_value_ok
xor eax,eax
mov [edi],eax
mov [edi+4],eax
mov [edi+12],eax
expression_value_ok:
ret
get_byte_number:
xor eax,eax
lods byte [esi]
stos dword [edi]
xor al,al
stos dword [edi]
got_number:
and word [edi-8+8],0
and word [edi-8+12],0
and dword [edi-8+16],0
add edi,0Ch
jmp calculation_loop
get_word_number:
xor eax,eax
lods word [esi]
stos dword [edi]
xor ax,ax
stos dword [edi]
jmp got_number
get_dword_number:
movs dword [edi],[esi]
xor eax,eax
stos dword [edi]
jmp got_number
get_qword_number:
movs dword [edi],[esi]
movs dword [edi],[esi]
jmp got_number
get_register:
mov byte [edi+9],0
and word [edi+12],0
lods byte [esi]
mov [edi+8],al
mov byte [edi+10],1
xor eax,eax
mov [edi+16],eax
stos dword [edi]
stos dword [edi]
add edi,0Ch
jmp calculation_loop
get_label:
xor eax,eax
mov [edi+8],eax
mov [edi+12],eax
mov [edi+20],eax
lods dword [esi]
cmp eax,0Fh
jb predefined_label
je reserved_word_used_as_symbol
mov ebx,eax
mov ax,[current_pass]
mov [ebx+18],ax
mov cl,[ebx+9]
shr cl,1
and cl,1
neg cl
or byte [ebx+8],8
test byte [ebx+8],1
jz label_undefined
cmp ax,[ebx+16]
je unadjusted_label
test byte [ebx+8],4
jnz label_out_of_scope
test byte [ebx+9],1
jz unadjusted_label
mov eax,[ebx]
sub eax,dword [adjustment]
stos dword [edi]
mov eax,[ebx+4]
sbb eax,dword [adjustment+4]
stos dword [edi]
sbb cl,[adjustment_sign]
mov [edi-8+13],cl
mov eax,dword [adjustment]
or al,[adjustment_sign]
or eax,dword [adjustment+4]
jz got_label
or [next_pass_needed],-1
jmp got_label
unadjusted_label:
mov eax,[ebx]
stos dword [edi]
mov eax,[ebx+4]
stos dword [edi]
mov [edi-8+13],cl
got_label:
test byte [ebx+9],4
jnz invalid_use_of_symbol
call store_label_reference
mov al,[ebx+11]
mov [edi-8+12],al
mov eax,[ebx+12]
mov [edi-8+8],eax
cmp al,ah
jne labeled_registers_ok
shr eax,16
add al,ah
jo labeled_registers_ok
xor ah,ah
mov [edi-8+10],ax
mov [edi-8+9],ah
labeled_registers_ok:
mov eax,[ebx+20]
mov [edi-8+16],eax
add edi,0Ch
mov al,[ebx+10]
or al,al
jz calculation_loop
test [operand_flags],1
jnz calculation_loop
check_size:
xchg [operand_size],al
or al,al
jz calculation_loop
cmp al,[operand_size]
jne operand_sizes_do_not_match
jmp calculation_loop
actual_file_offset_label:
mov eax,[undefined_data_end]
mov ebp,[addressing_space]
test byte [ds:ebp+0Ah],1
jnz use_undefined_data_offset
cmp eax,[current_offset]
jne use_current_offset
use_undefined_data_offset:
mov eax,[undefined_data_start]
jmp make_file_offset_label
current_file_offset_label:
mov ebp,[addressing_space]
test byte [ds:ebp+0Ah],1
jz use_current_offset
mov eax,[undefined_data_end]
jmp make_file_offset_label
use_current_offset:
mov eax,[current_offset]
make_file_offset_label:
cmp [output_format],2
jae invalid_use_of_symbol
sub eax,[code_start]
jmp make_dword_label_value
current_offset_label:
mov eax,[current_offset]
make_current_offset_label:
xor edx,edx
xor ch,ch
mov ebp,[addressing_space]
sub eax,[ds:ebp]
sbb edx,[ds:ebp+4]
sbb ch,[ds:ebp+8]
jp current_offset_label_ok
call recoverable_overflow
current_offset_label_ok:
stos dword [edi]
mov eax,edx
stos dword [edi]
mov eax,[ds:ebp+10h]
stos dword [edi]
mov cl,[ds:ebp+9]
mov [edi-12+12],cx
mov eax,[ds:ebp+14h]
mov [edi-12+16],eax
add edi,8
jmp calculation_loop
org_origin_label:
mov eax,[addressing_space]
mov eax,[eax+18h]
jmp make_current_offset_label
counter_label:
mov eax,[counter]
make_dword_label_value:
stos dword [edi]
xor eax,eax
stos dword [edi]
add edi,0Ch
jmp calculation_loop
timestamp_label:
call make_timestamp
make_qword_label_value:
stos dword [edi]
mov eax,edx
stos dword [edi]
add edi,0Ch
jmp calculation_loop
predefined_label:
or eax,eax
jz current_offset_label
cmp eax,1
je counter_label
cmp eax,2
je timestamp_label
cmp eax,3
je org_origin_label
cmp eax,4
je current_file_offset_label
cmp eax,5
je actual_file_offset_label
mov edx,invalid_value
jmp error_undefined
label_out_of_scope:
mov edx,symbol_out_of_scope
jmp error_undefined
label_undefined:
mov edx,undefined_symbol
error_undefined:
cmp [current_pass],1
ja undefined_value
force_next_pass:
or [next_pass_needed],-1
undefined_value:
or [value_undefined],-1
and word [edi+12],0
xor eax,eax
stos dword [edi]
stos dword [edi]
add edi,0Ch
cmp [error_line],0
jne calculation_loop
mov eax,[current_line]
mov [error_line],eax
mov [error],edx
mov [error_info],ebx
jmp calculation_loop
calculate_add:
xor ah,ah
mov ah,[ebx+12]
mov al,[edi+12]
or al,al
jz add_values
or ah,ah
jz add_relocatable
add ah,al
jnz invalid_add
mov ecx,[edi+16]
cmp ecx,[ebx+16]
je add_values
invalid_add:
call recoverable_misuse
jmp add_values
add_relocatable:
mov ah,al
mov ecx,[edi+16]
mov [ebx+16],ecx
add_values:
mov [ebx+12],ah
mov eax,[edi]
add [ebx],eax
mov eax,[edi+4]
adc [ebx+4],eax
mov al,[edi+13]
adc [ebx+13],al
jp add_sign_ok
call recoverable_overflow
add_sign_ok:
or dx,dx
jz calculation_loop
push esi
mov esi,ebx
mov cl,[edi+10]
mov al,[edi+8]
call add_register
mov cl,[edi+11]
mov al,[edi+9]
call add_register
pop esi
jmp calculation_loop
add_register:
or al,al
jz add_register_done
add_register_start:
cmp [esi+8],al
jne add_in_second_slot
add [esi+10],cl
jo value_out_of_range
jnz add_register_done
mov byte [esi+8],0
ret
add_in_second_slot:
cmp [esi+9],al
jne create_in_first_slot
add [esi+11],cl
jo value_out_of_range
jnz add_register_done
mov byte [esi+9],0
ret
create_in_first_slot:
cmp byte [esi+8],0
jne create_in_second_slot
mov [esi+8],al
mov [esi+10],cl
ret
create_in_second_slot:
cmp byte [esi+9],0
jne invalid_expression
mov [esi+9],al
mov [esi+11],cl
add_register_done:
ret
out_of_range:
jmp calculation_loop
calculate_sub:
xor ah,ah
mov ah,[ebx+12]
mov al,[edi+12]
or al,al
jz sub_values
or ah,ah
jz negate_relocatable
cmp al,ah
jne invalid_sub
xor ah,ah
mov ecx,[edi+16]
cmp ecx,[ebx+16]
je sub_values
invalid_sub:
call recoverable_misuse
jmp sub_values
negate_relocatable:
neg al
mov ah,al
mov ecx,[edi+16]
mov [ebx+16],ecx
sub_values:
mov [ebx+12],ah
mov eax,[edi]
sub [ebx],eax
mov eax,[edi+4]
sbb [ebx+4],eax
mov al,[edi+13]
sbb [ebx+13],al
jp sub_sign_ok
cmp [error_line],0
jne sub_sign_ok
call recoverable_overflow
sub_sign_ok:
or dx,dx
jz calculation_loop
push esi
mov esi,ebx
mov cl,[edi+10]
mov al,[edi+8]
call sub_register
mov cl,[edi+11]
mov al,[edi+9]
call sub_register
pop esi
jmp calculation_loop
sub_register:
or al,al
jz add_register_done
neg cl
jo value_out_of_range
jmp add_register_start
calculate_mul:
or dx,dx
jz mul_start
cmp word [ebx+8],0
jne mul_start
xor ecx,ecx
swap_values:
mov eax,[ebx+ecx]
xchg eax,[edi+ecx]
mov [ebx+ecx],eax
add ecx,4
cmp ecx,16
jb swap_values
mul_start:
push esi edx
mov esi,ebx
xor bl,bl
cmp byte [esi+13],0
je mul_first_sign_ok
xor bl,-1
mov eax,[esi]
mov edx,[esi+4]
not eax
not edx
add eax,1
adc edx,0
mov [esi],eax
mov [esi+4],edx
or eax,edx
jz mul_overflow
mul_first_sign_ok:
cmp byte [edi+13],0
je mul_second_sign_ok
xor bl,-1
cmp byte [esi+8],0
je mul_first_register_sign_ok
neg byte [esi+10]
jo invalid_expression
mul_first_register_sign_ok:
cmp byte [esi+9],0
je mul_second_register_sign_ok
neg byte [esi+11]
jo invalid_expression
mul_second_register_sign_ok:
mov eax,[edi]
mov edx,[edi+4]
not eax
not edx
add eax,1
adc edx,0
mov [edi],eax
mov [edi+4],edx
or eax,edx
jz mul_overflow
mul_second_sign_ok:
cmp dword [esi+4],0
jz mul_numbers
cmp dword [edi+4],0
jz mul_numbers
jnz mul_overflow
mul_numbers:
mov eax,[esi+4]
mul dword [edi]
or edx,edx
jnz mul_overflow
mov ecx,eax
mov eax,[esi]
mul dword [edi+4]
or edx,edx
jnz mul_overflow
add ecx,eax
jc mul_overflow
mov eax,[esi]
mul dword [edi]
add edx,ecx
jc mul_overflow
mov [esi],eax
mov [esi+4],edx
or bl,bl
jz mul_ok
not eax
not edx
add eax,1
adc edx,0
mov [esi],eax
mov [esi+4],edx
or eax,edx
jnz mul_ok
not bl
mul_ok:
mov [esi+13],bl
pop edx
or dx,dx
jz mul_calculated
cmp word [edi+8],0
jne invalid_value
cmp byte [esi+8],0
je mul_first_register_ok
call get_byte_scale
imul byte [esi+10]
mov dl,ah
cbw
cmp ah,dl
jne value_out_of_range
mov [esi+10],al
or al,al
jnz mul_first_register_ok
mov [esi+8],al
mul_first_register_ok:
cmp byte [esi+9],0
je mul_calculated
call get_byte_scale
imul byte [esi+11]
mov dl,ah
cbw
cmp ah,dl
jne value_out_of_range
mov [esi+11],al
or al,al
jnz mul_calculated
mov [esi+9],al
mul_calculated:
pop esi
jmp calculation_loop
mul_overflow:
pop edx esi
call recoverable_overflow
jmp calculation_loop
get_byte_scale:
mov al,[edi]
cbw
cwde
cdq
cmp edx,[edi+4]
jne value_out_of_range
cmp eax,[edi]
jne value_out_of_range
ret
calculate_div:
push esi edx
mov esi,ebx
call div_64
pop edx
or dx,dx
jz div_calculated
cmp byte [esi+8],0
je div_first_register_ok
call get_byte_scale
or al,al
jz value_out_of_range
mov al,[esi+10]
cbw
idiv byte [edi]
or ah,ah
jnz invalid_use_of_symbol
mov [esi+10],al
div_first_register_ok:
cmp byte [esi+9],0
je div_calculated
call get_byte_scale
or al,al
jz value_out_of_range
mov al,[esi+11]
cbw
idiv byte [edi]
or ah,ah
jnz invalid_use_of_symbol
mov [esi+11],al
div_calculated:
pop esi
jmp calculation_loop
calculate_mod:
push esi
mov esi,ebx
call div_64
mov [esi],eax
mov [esi+4],edx
mov [esi+13],bh
pop esi
jmp calculation_loop
calculate_and:
mov eax,[edi]
mov edx,[edi+4]
mov cl,[edi+13]
and [ebx],eax
and [ebx+4],edx
and [ebx+13],cl
jmp calculation_loop
calculate_or:
mov eax,[edi]
mov edx,[edi+4]
mov cl,[edi+13]
or [ebx],eax
or [ebx+4],edx
or [ebx+13],cl
jmp calculation_loop
calculate_xor:
mov eax,[edi]
mov edx,[edi+4]
mov cl,[edi+13]
xor [ebx],eax
xor [ebx+4],edx
xor [ebx+13],cl
jmp calculation_loop
shr_negative:
mov byte [edi+13],0
not dword [edi]
not dword [edi+4]
add dword [edi],1
adc dword [edi+4],0
jc shl_over
calculate_shl:
cmp byte [edi+13],0
jne shl_negative
mov edx,[ebx+4]
mov eax,[ebx]
cmp dword [edi+4],0
jne shl_over
movsx ecx,byte [ebx+13]
xchg ecx,[edi]
cmp ecx,64
je shl_max
ja shl_over
cmp ecx,32
jae shl_high
shld [edi],edx,cl
shld edx,eax,cl
shl eax,cl
mov [ebx],eax
mov [ebx+4],edx
jmp shl_done
shl_over:
cmp byte [ebx+13],0
jne shl_overflow
shl_max:
movsx ecx,byte [ebx+13]
cmp eax,ecx
jne shl_overflow
cmp edx,ecx
jne shl_overflow
xor eax,eax
mov [ebx],eax
mov [ebx+4],eax
jmp calculation_loop
shl_high:
sub cl,32
shld [edi],edx,cl
shld edx,eax,cl
shl eax,cl
mov [ebx+4],eax
and dword [ebx],0
cmp edx,[edi]
jne shl_overflow
shl_done:
movsx eax,byte [ebx+13]
cmp eax,[edi]
je calculation_loop
shl_overflow:
call recoverable_overflow
jmp calculation_loop
shl_negative:
mov byte [edi+13],0
not dword [edi]
not dword [edi+4]
add dword [edi],1
adc dword [edi+4],0
jnc calculate_shr
dec dword [edi+4]
calculate_shr:
cmp byte [edi+13],0
jne shr_negative
mov edx,[ebx+4]
mov eax,[ebx]
cmp dword [edi+4],0
jne shr_over
mov ecx,[edi]
cmp ecx,64
jae shr_over
push esi
movsx esi,byte [ebx+13]
cmp ecx,32
jae shr_high
shrd eax,edx,cl
shrd edx,esi,cl
mov [ebx],eax
mov [ebx+4],edx
pop esi
jmp calculation_loop
shr_high:
sub cl,32
shrd edx,esi,cl
mov [ebx],edx
mov [ebx+4],esi
pop esi
jmp calculation_loop
shr_over:
movsx eax,byte [ebx+13]
mov dword [ebx],eax
mov dword [ebx+4],eax
jmp calculation_loop
calculate_not:
cmp word [edi+8],0
jne invalid_expression
cmp byte [edi+12],0
je not_ok
call recoverable_misuse
not_ok:
not dword [edi]
not dword [edi+4]
not byte [edi+13]
add edi,14h
jmp calculation_loop
calculate_bsf:
cmp word [edi+8],0
jne invalid_expression
cmp byte [edi+12],0
je bsf_ok
call recoverable_misuse
bsf_ok:
xor ecx,ecx
bsf eax,[edi]
jnz finish_bs
mov ecx,32
bsf eax,[edi+4]
jnz finish_bs
cmp byte [edi+13],0
jne finish_bs
bs_overflow:
call recoverable_overflow
add edi,14h
jmp calculation_loop
calculate_bsr:
cmp word [edi+8],0
jne invalid_expression
cmp byte [edi+12],0
je bsr_ok
call recoverable_misuse
bsr_ok:
cmp byte [edi+13],0
jne bs_overflow
mov ecx,32
bsr eax,[edi+4]
jnz finish_bs
xor ecx,ecx
bsr eax,[edi]
jz bs_overflow
finish_bs:
add eax,ecx
xor edx,edx
mov [edi],eax
mov [edi+4],edx
mov [edi+13],dl
add edi,14h
jmp calculation_loop
calculate_neg:
cmp byte [edi+8],0
je neg_first_register_ok
neg byte [edi+10]
jo invalid_expression
neg_first_register_ok:
cmp byte [edi+9],0
je neg_second_register_ok
neg byte [edi+11]
jo invalid_expression
neg_second_register_ok:
neg byte [edi+12]
xor eax,eax
xor edx,edx
xor cl,cl
xchg eax,[edi]
xchg edx,[edi+4]
xchg cl,[edi+13]
sub [edi],eax
sbb [edi+4],edx
sbb [edi+13],cl
jp neg_sign_ok
call recoverable_overflow
neg_sign_ok:
add edi,14h
jmp calculation_loop
calculate_rva:
cmp word [edi+8],0
jne invalid_expression
mov al,[output_format]
cmp al,5
je calculate_gotoff
cmp al,4
je calculate_coff_rva
cmp al,3
jne invalid_expression
test [format_flags],8
jnz pe64_rva
mov al,2
bt [resolver_flags],0
jc rva_type_ok
xor al,al
rva_type_ok:
cmp byte [edi+12],al
je rva_ok
call recoverable_misuse
rva_ok:
mov byte [edi+12],0
mov eax,[code_start]
mov eax,[eax+34h]
xor edx,edx
finish_rva:
sub [edi],eax
sbb [edi+4],edx
sbb byte [edi+13],0
jp rva_finished
call recoverable_overflow
rva_finished:
add edi,14h
jmp calculation_loop
pe64_rva:
mov al,4
bt [resolver_flags],0
jc pe64_rva_type_ok
xor al,al
pe64_rva_type_ok:
cmp byte [edi+12],al
je pe64_rva_ok
call recoverable_misuse
pe64_rva_ok:
mov byte [edi+12],0
mov eax,[code_start]
mov edx,[eax+34h]
mov eax,[eax+30h]
jmp finish_rva
calculate_gotoff:
test [format_flags],1
jnz calculate_elf_dyn_rva
test [format_flags],8
jnz invalid_expression
calculate_coff_rva:
mov dl,5
cmp byte [edi+12],2
je change_value_type
incorrect_change_of_value_type:
call recoverable_misuse
change_value_type:
mov byte [edi+12],dl
add edi,14h
jmp calculation_loop
calculate_elf_dyn_rva:
xor dl,dl
test byte [edi+12],1
jnz incorrect_change_of_value_type
jmp change_value_type
calculate_plt:
cmp word [edi+8],0
jne invalid_expression
cmp [output_format],5
jne invalid_expression
test [format_flags],1
jnz invalid_expression
mov dl,6
mov dh,2
test [format_flags],8
jz check_value_for_plt
mov dh,4
check_value_for_plt:
mov eax,[edi]
or eax,[edi+4]
jnz incorrect_change_of_value_type
cmp byte [edi+12],dh
jne incorrect_change_of_value_type
mov eax,[edi+16]
cmp byte [eax],80h
jne incorrect_change_of_value_type
jmp change_value_type
div_64:
xor ebx,ebx
cmp dword [edi],0
jne divider_ok
cmp dword [edi+4],0
jne divider_ok
cmp [next_pass_needed],0
je value_out_of_range
jmp div_done
divider_ok:
cmp byte [esi+13],0
je div_first_sign_ok
mov eax,[esi]
mov edx,[esi+4]
not eax
not edx
add eax,1
adc edx,0
mov [esi],eax
mov [esi+4],edx
or eax,edx
jz value_out_of_range
xor bx,-1
div_first_sign_ok:
cmp byte [edi+13],0
je div_second_sign_ok
mov eax,[edi]
mov edx,[edi+4]
not eax
not edx
add eax,1
adc edx,0
mov [edi],eax
mov [edi+4],edx
or eax,edx
jz value_out_of_range
xor bl,-1
div_second_sign_ok:
cmp dword [edi+4],0
jne div_high
mov ecx,[edi]
mov eax,[esi+4]
xor edx,edx
div ecx
mov [esi+4],eax
mov eax,[esi]
div ecx
mov [esi],eax
mov eax,edx
xor edx,edx
jmp div_done
div_high:
push ebx
mov eax,[esi+4]
xor edx,edx
div dword [edi+4]
mov ebx,[esi]
mov [esi],eax
and dword [esi+4],0
mov ecx,edx
mul dword [edi]
div_high_loop:
cmp ecx,edx
ja div_high_done
jb div_high_large_correction
cmp ebx,eax
jae div_high_done
div_high_correction:
dec dword [esi]
sub eax,[edi]
sbb edx,[edi+4]
jnc div_high_loop
div_high_done:
sub ebx,eax
sbb ecx,edx
mov edx,ecx
mov eax,ebx
pop ebx
jmp div_done
div_high_large_correction:
push eax edx
mov eax,edx
sub eax,ecx
xor edx,edx
div dword [edi+4]
shr eax,1
jz div_high_small_correction
sub [esi],eax
push eax
mul dword [edi+4]
sub dword [esp+4],eax
pop eax
mul dword [edi]
sub dword [esp+4],eax
sbb dword [esp],edx
pop edx eax
jmp div_high_loop
div_high_small_correction:
pop edx eax
jmp div_high_correction
div_done:
or bh,bh
jz remainder_ok
not eax
not edx
add eax,1
adc edx,0
mov ecx,eax
or ecx,edx
jnz remainder_ok
not bh
remainder_ok:
or bl,bl
jz div_ok
not dword [esi]
not dword [esi+4]
add dword [esi],1
adc dword [esi+4],0
mov ecx,[esi]
or ecx,[esi+4]
jnz div_ok
not bl
div_ok:
mov [esi+13],bl
ret
store_label_reference:
cmp [symbols_file],0
je label_reference_ok
cmp [next_pass_needed],0
jne label_reference_ok
mov eax,[tagged_blocks]
mov dword [eax-4],2
mov dword [eax-8],4
sub eax,8+4
cmp eax,edi
jbe out_of_memory
mov [tagged_blocks],eax
mov [eax],ebx
label_reference_ok:
ret
convert_fp:
inc esi
and word [edi+8],0
and word [edi+12],0
mov al,[value_size]
cmp al,2
je convert_fp_word
cmp al,4
je convert_fp_dword
test al,not 8
jz convert_fp_qword
call recoverable_misuse
convert_fp_qword:
xor eax,eax
xor edx,edx
cmp word [esi+8],8000h
je fp_qword_store
mov bx,[esi+8]
mov eax,[esi]
mov edx,[esi+4]
add eax,eax
adc edx,edx
mov ecx,edx
shr edx,12
shrd eax,ecx,12
jnc fp_qword_ok
add eax,1
adc edx,0
bt edx,20
jnc fp_qword_ok
and edx,1 shl 20 - 1
inc bx
shr edx,1
rcr eax,1
fp_qword_ok:
add bx,3FFh
cmp bx,7FFh
jge value_out_of_range
cmp bx,0
jg fp_qword_exp_ok
or edx,1 shl 20
mov cx,bx
neg cx
inc cx
cmp cx,52+1
ja value_out_of_range
cmp cx,32
jb fp_qword_small_shift
sub cx,32
mov eax,edx
xor edx,edx
shr eax,cl
jmp fp_qword_shift_done
fp_qword_small_shift:
mov ebx,edx
shr edx,cl
shrd eax,ebx,cl
fp_qword_shift_done:
mov bx,0
jnc fp_qword_exp_ok
add eax,1
adc edx,0
test edx,1 shl 20
jz fp_qword_exp_ok
and edx,1 shl 20 - 1
inc bx
fp_qword_exp_ok:
shl ebx,20
or edx,ebx
jnz fp_qword_store
or eax,eax
jz value_out_of_range
fp_qword_store:
mov bl,[esi+11]
shl ebx,31
or edx,ebx
mov [edi],eax
mov [edi+4],edx
add esi,13
ret
convert_fp_word:
xor eax,eax
cmp word [esi+8],8000h
je fp_word_store
mov bx,[esi+8]
mov ax,[esi+6]
shl ax,1
shr ax,6
jnc fp_word_ok
inc ax
bt ax,10
jnc fp_word_ok
and ax,1 shl 10 - 1
inc bx
shr ax,1
fp_word_ok:
add bx,0Fh
cmp bx,01Fh
jge value_out_of_range
cmp bx,0
jg fp_word_exp_ok
or ax,1 shl 10
mov cx,bx
neg cx
inc cx
cmp cx,10+1
ja value_out_of_range
xor bx,bx
shr ax,cl
jnc fp_word_exp_ok
inc ax
test ax,1 shl 10
jz fp_word_exp_ok
and ax,1 shl 10 - 1
inc bx
fp_word_exp_ok:
shl bx,10
or ax,bx
jz value_out_of_range
fp_word_store:
mov bl,[esi+11]
shl bx,15
or ax,bx
mov [edi],eax
xor eax,eax
mov [edi+4],eax
add esi,13
ret
convert_fp_dword:
xor eax,eax
cmp word [esi+8],8000h
je fp_dword_store
mov bx,[esi+8]
mov eax,[esi+4]
shl eax,1
shr eax,9
jnc fp_dword_ok
inc eax
bt eax,23
jnc fp_dword_ok
and eax,1 shl 23 - 1
inc bx
shr eax,1
fp_dword_ok:
add bx,7Fh
cmp bx,0FFh
jge value_out_of_range
cmp bx,0
jg fp_dword_exp_ok
or eax,1 shl 23
mov cx,bx
neg cx
inc cx
cmp cx,23+1
ja value_out_of_range
xor bx,bx
shr eax,cl
jnc fp_dword_exp_ok
inc eax
test eax,1 shl 23
jz fp_dword_exp_ok
and eax,1 shl 23 - 1
inc bx
fp_dword_exp_ok:
shl ebx,23
or eax,ebx
jz value_out_of_range
fp_dword_store:
mov bl,[esi+11]
shl ebx,31
or eax,ebx
mov [edi],eax
xor eax,eax
mov [edi+4],eax
add esi,13
ret
get_string_value:
inc esi
lods dword [esi]
mov ecx,eax
cmp ecx,8
ja value_out_of_range
mov edx,edi
xor eax,eax
stos dword [edi]
stos dword [edi]
mov edi,edx
rep movs byte [edi],[esi]
mov edi,edx
inc esi
and word [edi+8],0
and word [edi+12],0
ret
 
get_byte_value:
mov [value_size],1
or [operand_flags],1
call calculate_value
or al,al
jz check_byte_value
call recoverable_misuse
check_byte_value:
mov eax,[edi]
mov edx,[edi+4]
cmp byte [edi+13],0
je byte_positive
cmp edx,-1
jne range_exceeded
cmp eax,-100h
jb range_exceeded
ret
byte_positive:
test edx,edx
jnz range_exceeded
cmp eax,100h
jae range_exceeded
return_byte_value:
ret
range_exceeded:
xor eax,eax
xor edx,edx
recoverable_overflow:
cmp [error_line],0
jne ignore_overflow
push [current_line]
pop [error_line]
mov [error],value_out_of_range
or [value_undefined],-1
ignore_overflow:
ret
recoverable_misuse:
cmp [error_line],0
jne ignore_misuse
push [current_line]
pop [error_line]
mov [error],invalid_use_of_symbol
ignore_misuse:
ret
get_word_value:
mov [value_size],2
or [operand_flags],1
call calculate_value
cmp al,2
jb check_word_value
call recoverable_misuse
check_word_value:
mov eax,[edi]
mov edx,[edi+4]
cmp byte [edi+13],0
je word_positive
cmp edx,-1
jne range_exceeded
cmp eax,-10000h
jb range_exceeded
ret
word_positive:
test edx,edx
jnz range_exceeded
cmp eax,10000h
jae range_exceeded
ret
get_dword_value:
mov [value_size],4
or [operand_flags],1
call calculate_value
cmp al,4
jne check_dword_value
mov [value_type],2
mov eax,[edi]
cdq
cmp edx,[edi+4]
jne range_exceeded
mov ecx,edx
shr ecx,31
cmp cl,[value_sign]
jne range_exceeded
ret
check_dword_value:
mov eax,[edi]
mov edx,[edi+4]
cmp byte [edi+13],0
je dword_positive
cmp edx,-1
jne range_exceeded
ret
dword_positive:
test edx,edx
jne range_exceeded
ret
get_pword_value:
mov [value_size],6
or [operand_flags],1
call calculate_value
cmp al,4
jne check_pword_value
call recoverable_misuse
check_pword_value:
mov eax,[edi]
mov edx,[edi+4]
cmp byte [edi+13],0
je pword_positive
cmp edx,-10000h
jb range_exceeded
ret
pword_positive:
cmp edx,10000h
jae range_exceeded
ret
get_qword_value:
mov [value_size],8
or [operand_flags],1
call calculate_value
check_qword_value:
mov eax,[edi]
mov edx,[edi+4]
ret
get_count_value:
mov [value_size],8
or [operand_flags],1
call calculate_expression
cmp word [edi+8],0
jne invalid_value
mov [value_sign],0
mov al,[edi+12]
or al,al
jz check_count_value
call recoverable_misuse
check_count_value:
cmp byte [edi+13],0
jne invalid_count_value
mov eax,[edi]
mov edx,[edi+4]
or edx,edx
jnz invalid_count_value
ret
invalid_count_value:
cmp [error_line],0
jne zero_count
mov eax,[current_line]
mov [error_line],eax
mov [error],invalid_value
zero_count:
xor eax,eax
ret
get_value:
mov [operand_size],0
lods byte [esi]
call get_size_operator
cmp al,'('
jne invalid_value
mov al,[operand_size]
cmp al,1
je value_byte
cmp al,2
je value_word
cmp al,4
je value_dword
cmp al,6
je value_pword
cmp al,8
je value_qword
or al,al
jnz invalid_value
mov [value_size],al
call calculate_value
mov eax,[edi]
mov edx,[edi+4]
ret
calculate_value:
call calculate_expression
cmp word [edi+8],0
jne invalid_value
mov eax,[edi+16]
mov [symbol_identifier],eax
mov al,[edi+13]
mov [value_sign],al
mov al,[edi+12]
mov [value_type],al
ret
value_qword:
call get_qword_value
truncated_value:
mov [value_sign],0
ret
value_pword:
call get_pword_value
movzx edx,dx
jmp truncated_value
value_dword:
call get_dword_value
xor edx,edx
jmp truncated_value
value_word:
call get_word_value
xor edx,edx
movzx eax,ax
jmp truncated_value
value_byte:
call get_byte_value
xor edx,edx
movzx eax,al
jmp truncated_value
get_address_word_value:
mov [address_size],2
mov [value_size],2
mov [free_address_range],0
jmp calculate_address
get_address_dword_value:
mov [address_size],4
mov [value_size],4
mov [free_address_range],0
jmp calculate_address
get_address_qword_value:
mov [address_size],8
mov [value_size],8
mov [free_address_range],0
jmp calculate_address
get_address_value:
mov [address_size],0
mov [value_size],8
or [free_address_range],-1
calculate_address:
cmp byte [esi],'.'
je invalid_address
call calculate_expression
mov eax,[edi+16]
mov [address_symbol],eax
mov al,[edi+13]
mov [address_sign],al
mov al,[edi+12]
mov [value_type],al
cmp al,0
je address_size_ok
jg get_address_symbol_size
neg al
get_address_symbol_size:
cmp al,6
je special_address_type_32bit
cmp al,5
je special_address_type_32bit
ja invalid_address_type
test al,1
jnz invalid_address_type
shl al,5
jmp address_symbol_ok
invalid_address_type:
call recoverable_misuse
special_address_type_32bit:
mov al,40h
address_symbol_ok:
mov ah,[address_size]
or [address_size],al
shr al,4
or ah,ah
jz address_size_ok
cmp al,ah
je address_size_ok
cmp ax,0408h
je address_sizes_mixed
cmp ax,0804h
jne address_sizes_do_not_agree
address_sizes_mixed:
cmp [value_type],4
jne address_sizes_mixed_type_ok
mov [value_type],2
address_sizes_mixed_type_ok:
mov eax,[edi]
cdq
cmp edx,[edi+4]
je address_size_ok
cmp [error_line],0
jne address_size_ok
call recoverable_overflow
address_size_ok:
xor ebx,ebx
xor ecx,ecx
mov cl,[value_type]
shl ecx,16
mov ch,[address_size]
cmp word [edi+8],0
je check_immediate_address
mov al,[edi+8]
mov dl,[edi+10]
call get_address_register
mov al,[edi+9]
mov dl,[edi+11]
call get_address_register
mov ax,bx
shr ah,4
shr al,4
or bh,bh
jz check_address_registers
or bl,bl
jz check_address_registers
cmp al,ah
jne check_vsib
check_address_registers:
or al,ah
cmp al,0Ch
jae check_vsib
cmp al,6
je check_vsib
cmp al,7
je check_vsib
mov ah,[address_size]
and ah,0Fh
jz address_registers_sizes_ok
cmp al,ah
jne invalid_address
address_registers_sizes_ok:
cmp al,4
je sib_allowed
cmp al,8
je sib_allowed
cmp al,9
je check_ip_relative_address
cmp cl,1
ja invalid_address
cmp [free_address_range],0
jne check_qword_value
jmp check_word_value
address_sizes_do_not_match:
cmp al,0Fh
jne invalid_address
mov al,bh
and al,0Fh
cmp al,ah
jne invalid_address
check_ip_relative_address:
or bl,bl
jnz invalid_address
cmp bh,98h
je check_rip_relative_address
cmp bh,94h
jne invalid_address
cmp [free_address_range],0
je check_dword_value
mov eax,[edi]
mov edx,[edi+4]
ret
check_rip_relative_address:
mov eax,[edi]
cdq
cmp edx,[edi+4]
jne range_exceeded
cmp dl,[edi+13]
jne range_exceeded
ret
get_address_register:
or al,al
jz address_register_ok
cmp dl,1
jne scaled_register
or bh,bh
jnz scaled_register
mov bh,al
address_register_ok:
ret
scaled_register:
or bl,bl
jnz invalid_address
mov bl,al
mov cl,dl
jmp address_register_ok
sib_allowed:
or bh,bh
jnz check_index_with_base
cmp cl,3
je special_index_scale
cmp cl,5
je special_index_scale
cmp cl,9
je special_index_scale
cmp cl,2
jne check_index_scale
cmp bl,45h
jne special_index_scale
cmp [code_type],64
je special_index_scale
cmp [segment_register],4
jne special_index_scale
cmp [value_type],0
jne check_index_scale
mov al,[edi]
cbw
cwde
cmp eax,[edi]
jne check_index_scale
cdq
cmp edx,[edi+4]
jne check_immediate_address
special_index_scale:
mov bh,bl
dec cl
check_immediate_address:
cmp [free_address_range],0
jne check_qword_value
mov al,[address_size]
and al,0Fh
cmp al,2
je check_word_value
cmp al,4
je check_dword_value
cmp al,8
je check_qword_value
or al,al
jnz invalid_value
cmp [code_type],64
jne check_dword_value
jmp check_qword_value
check_index_with_base:
cmp cl,1
jne check_index_scale
cmp bl,44h
je swap_base_with_index
cmp bl,84h
je swap_base_with_index
cmp [code_type],64
je check_for_rbp_base
cmp bl,45h
jne check_for_ebp_base
cmp [segment_register],3
je swap_base_with_index
jmp check_immediate_address
check_for_ebp_base:
cmp bh,45h
jne check_immediate_address
cmp [segment_register],4
jne check_immediate_address
swap_base_with_index:
xchg bl,bh
jmp check_immediate_address
check_for_rbp_base:
cmp bh,45h
je swap_base_with_index
cmp bh,85h
je swap_base_with_index
jmp check_immediate_address
check_index_scale:
test cl,not 1111b
jnz invalid_address
mov al,cl
dec al
and al,cl
jz check_immediate_address
jmp invalid_address
check_vsib:
xor ah,ah
check_vsib_base:
test bh,bh
jz check_vsib_index
mov al,bh
shr al,4
cmp al,4
je check_vsib_base_size
cmp [code_type],64
jne swap_vsib_registers
cmp al,8
jne swap_vsib_registers
check_vsib_base_size:
mov ah,[address_size]
and ah,0Fh
jz check_vsib_index
cmp al,ah
jne invalid_address
check_vsib_index:
mov al,bl
and al,0E0h
cmp al,0C0h
jae check_index_scale
cmp al,60h
je check_index_scale
jmp invalid_address
swap_vsib_registers:
xor ah,-1
jz invalid_address
cmp cl,1
ja invalid_address
xchg bl,bh
mov cl,1
jmp check_vsib_base
 
calculate_relative_offset:
cmp [value_undefined],0
jne relative_offset_ok
test bh,bh
setne ch
cmp bx,[ds:ebp+10h]
je origin_registers_ok
xchg bh,bl
xchg ch,cl
cmp bx,[ds:ebp+10h]
jne invalid_value
origin_registers_ok:
cmp cx,[ds:ebp+10h+2]
jne invalid_value
mov bl,[address_sign]
add eax,[ds:ebp]
adc edx,[ds:ebp+4]
adc bl,[ds:ebp+8]
sub eax,edi
sbb edx,0
sbb bl,0
mov [value_sign],bl
mov bl,[value_type]
mov ecx,[address_symbol]
mov [symbol_identifier],ecx
test bl,1
jnz relative_offset_unallowed
cmp bl,6
je plt_relative_offset
mov bh,[ds:ebp+9]
cmp bl,bh
je set_relative_offset_type
cmp bx,0402h
je set_relative_offset_type
relative_offset_unallowed:
call recoverable_misuse
set_relative_offset_type:
cmp [value_type],0
je relative_offset_ok
mov [value_type],0
cmp ecx,[ds:ebp+14h]
je relative_offset_ok
mov [value_type],3
relative_offset_ok:
ret
plt_relative_offset:
mov [value_type],7
cmp byte [ds:ebp+9],2
je relative_offset_ok
cmp byte [ds:ebp+9],4
jne recoverable_misuse
ret
 
calculate_logical_expression:
xor al,al
calculate_embedded_logical_expression:
mov [logical_value_wrapping],al
call get_logical_value
logical_loop:
cmp byte [esi],'|'
je logical_or
cmp byte [esi],'&'
je logical_and
ret
logical_or:
inc esi
or al,al
jnz logical_value_already_determined
push eax
call get_logical_value
pop ebx
or al,bl
jmp logical_loop
logical_and:
inc esi
or al,al
jz logical_value_already_determined
push eax
call get_logical_value
pop ebx
and al,bl
jmp logical_loop
logical_value_already_determined:
push eax
call skip_logical_value
jc invalid_expression
pop eax
jmp logical_loop
get_value_for_comparison:
mov [value_size],8
or [operand_flags],1
lods byte [esi]
call calculate_expression
cmp byte [edi+8],0
jne first_register_size_ok
mov byte [edi+10],0
first_register_size_ok:
cmp byte [edi+9],0
jne second_register_size_ok
mov byte [edi+11],0
second_register_size_ok:
mov eax,[edi+16]
mov [symbol_identifier],eax
mov al,[edi+13]
mov [value_sign],al
mov bl,[edi+12]
mov eax,[edi]
mov edx,[edi+4]
mov ecx,[edi+8]
ret
get_logical_value:
xor al,al
check_for_negation:
cmp byte [esi],'~'
jne negation_ok
inc esi
xor al,-1
jmp check_for_negation
negation_ok:
push eax
mov al,[esi]
cmp al,91h
je logical_expression
cmp al,0FFh
je invalid_expression
cmp al,88h
je check_for_defined
cmp al,8Ah
je check_for_earlier_defined
cmp al,89h
je check_for_used
cmp al,'0'
je given_false
cmp al,'1'
je given_true
cmp al,'('
jne invalid_value
call get_value_for_comparison
mov bh,[value_sign]
push eax edx [symbol_identifier] ebx ecx
mov al,[esi]
or al,al
jz logical_number
cmp al,0Fh
je logical_number
cmp al,92h
je logical_number
cmp al,'&'
je logical_number
cmp al,'|'
je logical_number
inc esi
mov [compare_type],al
cmp byte [esi],'('
jne invalid_value
call get_value_for_comparison
cmp bl,[esp+4]
jne values_not_relative
or bl,bl
jz check_values_registers
mov ebx,[symbol_identifier]
cmp ebx,[esp+8]
jne values_not_relative
check_values_registers:
cmp ecx,[esp]
je values_relative
ror ecx,16
xchg ch,cl
ror ecx,16
xchg ch,cl
cmp ecx,[esp]
je values_relative
values_not_relative:
cmp [compare_type],0F8h
jne invalid_comparison
add esp,12+8
jmp return_false
invalid_comparison:
call recoverable_misuse
values_relative:
pop ebx
shl ebx,16
mov bx,[esp]
add esp,8
pop ecx ebp
cmp [compare_type],'='
je check_equal
cmp [compare_type],0F1h
je check_not_equal
cmp [compare_type],0F8h
je return_true
test ebx,0FFFF0000h
jz check_less_or_greater
call recoverable_misuse
check_less_or_greater:
cmp [compare_type],'>'
je check_greater
cmp [compare_type],'<'
je check_less
cmp [compare_type],0F2h
je check_not_less
cmp [compare_type],0F3h
je check_not_greater
jmp invalid_expression
check_equal:
cmp bh,[value_sign]
jne return_false
cmp eax,ebp
jne return_false
cmp edx,ecx
jne return_false
jmp return_true
check_greater:
cmp bh,[value_sign]
jg return_true
jl return_false
cmp edx,ecx
jb return_true
ja return_false
cmp eax,ebp
jb return_true
jae return_false
check_less:
cmp bh,[value_sign]
jg return_false
jl return_true
cmp edx,ecx
jb return_false
ja return_true
cmp eax,ebp
jbe return_false
ja return_true
check_not_less:
cmp bh,[value_sign]
jg return_true
jl return_false
cmp edx,ecx
jb return_true
ja return_false
cmp eax,ebp
jbe return_true
ja return_false
check_not_greater:
cmp bh,[value_sign]
jg return_false
jl return_true
cmp edx,ecx
jb return_false
ja return_true
cmp eax,ebp
jb return_false
jae return_true
check_not_equal:
cmp bh,[value_sign]
jne return_true
cmp eax,ebp
jne return_true
cmp edx,ecx
jne return_true
jmp return_false
logical_number:
pop ecx ebx eax edx eax
or bl,bl
jnz invalid_logical_number
or cx,cx
jz logical_number_ok
invalid_logical_number:
call recoverable_misuse
logical_number_ok:
test bh,bh
jnz return_true
or eax,edx
jnz return_true
jmp return_false
check_for_earlier_defined:
or bh,-1
jmp check_if_expression_defined
check_for_defined:
xor bh,bh
check_if_expression_defined:
or bl,-1
lods word [esi]
cmp ah,'('
jne invalid_expression
check_expression:
lods byte [esi]
or al,al
jz defined_string
cmp al,'.'
je defined_fp_value
cmp al,')'
je expression_checked
cmp al,'!'
je invalid_expression
cmp al,0Fh
je check_expression
cmp al,10h
je defined_register
cmp al,11h
je check_if_symbol_defined
cmp al,80h
jae check_expression
movzx eax,al
add esi,eax
jmp check_expression
defined_register:
inc esi
jmp check_expression
defined_fp_value:
add esi,12+1
jmp expression_checked
defined_string:
lods dword [esi]
add esi,eax
inc esi
jmp expression_checked
check_if_symbol_defined:
lods dword [esi]
cmp eax,-1
je invalid_expression
cmp eax,0Fh
jb check_expression
je reserved_word_used_as_symbol
test bh,bh
jnz no_prediction
test byte [eax+8],4
jnz no_prediction
test byte [eax+8],1
jz symbol_predicted_undefined
mov cx,[current_pass]
sub cx,[eax+16]
jz check_expression
cmp cx,1
ja symbol_predicted_undefined
or byte [eax+8],40h+80h
jmp check_expression
no_prediction:
test byte [eax+8],1
jz symbol_undefined
mov cx,[current_pass]
sub cx,[eax+16]
jz check_expression
jmp symbol_undefined
symbol_predicted_undefined:
or byte [eax+8],40h
and byte [eax+8],not 80h
symbol_undefined:
xor bl,bl
jmp check_expression
expression_checked:
mov al,bl
jmp logical_value_ok
check_for_used:
lods word [esi]
cmp ah,2
jne invalid_expression
lods dword [esi]
cmp eax,0Fh
jb invalid_use_of_symbol
je reserved_word_used_as_symbol
inc esi
test byte [eax+8],8
jz not_used
mov cx,[current_pass]
sub cx,[eax+18]
jz return_true
cmp cx,1
ja not_used
or byte [eax+8],10h+20h
jmp return_true
not_used:
or byte [eax+8],10h
and byte [eax+8],not 20h
jmp return_false
given_false:
inc esi
return_false:
xor al,al
jmp logical_value_ok
given_true:
inc esi
return_true:
or al,-1
jmp logical_value_ok
logical_expression:
lods byte [esi]
mov dl,[logical_value_wrapping]
push edx
call calculate_embedded_logical_expression
pop edx
mov [logical_value_wrapping],dl
push eax
lods byte [esi]
cmp al,92h
jne invalid_expression
pop eax
logical_value_ok:
pop ebx
xor al,bl
ret
 
skip_symbol:
lods byte [esi]
or al,al
jz nothing_to_skip
cmp al,0Fh
je nothing_to_skip
cmp al,1
je skip_instruction
cmp al,2
je skip_label
cmp al,3
je skip_label
cmp al,4
je skip_special_label
cmp al,20h
jb skip_assembler_symbol
cmp al,'('
je skip_expression
cmp al,'['
je skip_address
skip_done:
clc
ret
skip_label:
add esi,2
skip_instruction:
add esi,2
skip_assembler_symbol:
inc esi
jmp skip_done
skip_special_label:
add esi,4
jmp skip_done
skip_address:
mov al,[esi]
and al,11110000b
cmp al,60h
jb skip_expression
cmp al,70h
ja skip_expression
inc esi
jmp skip_address
skip_expression:
lods byte [esi]
or al,al
jz skip_string
cmp al,'.'
je skip_fp_value
cmp al,')'
je skip_done
cmp al,']'
je skip_done
cmp al,'!'
je skip_expression
cmp al,0Fh
je skip_expression
cmp al,10h
je skip_register
cmp al,11h
je skip_label_value
cmp al,80h
jae skip_expression
movzx eax,al
add esi,eax
jmp skip_expression
skip_label_value:
add esi,3
skip_register:
inc esi
jmp skip_expression
skip_fp_value:
add esi,12
jmp skip_done
skip_string:
lods dword [esi]
add esi,eax
inc esi
jmp skip_done
nothing_to_skip:
dec esi
stc
ret
 
expand_path:
lods byte [esi]
cmp al,'%'
je environment_variable
stos byte [edi]
or al,al
jnz expand_path
cmp edi,[memory_end]
ja out_of_memory
ret
environment_variable:
mov ebx,esi
find_variable_end:
lods byte [esi]
or al,al
jz not_environment_variable
cmp al,'%'
jne find_variable_end
mov byte [esi-1],0
push esi
mov esi,ebx
call get_environment_variable
pop esi
mov byte [esi-1],'%'
jmp expand_path
not_environment_variable:
mov al,'%'
stos byte [edi]
mov esi,ebx
jmp expand_path
get_include_directory:
lods byte [esi]
cmp al,';'
je include_directory_ok
stos byte [edi]
or al,al
jnz get_include_directory
dec esi
dec edi
include_directory_ok:
cmp byte [edi-1],'/'
je path_separator_ok
cmp byte [edi-1],'\'
je path_separator_ok
mov al,'/'
stos byte [edi]
path_separator_ok:
ret
/programs/develop/koldbg/fasm/exprpars.inc
0,0 → 1,1280
 
; flat assembler core
; Copyright (c) 1999-2019, Tomasz Grysztar.
; All rights reserved.
 
convert_expression:
push ebp
call get_fp_value
jnc fp_expression
mov [current_offset],esp
expression_loop:
push edi
mov edi,single_operand_operators
call get_operator
pop edi
or al,al
jz expression_element
cmp al,82h
je expression_loop
push eax
jmp expression_loop
expression_element:
mov al,[esi]
cmp al,1Ah
je expression_number
cmp al,22h
je expression_number
cmp al,'('
je expression_number
mov al,'!'
stos byte [edi]
jmp expression_operator
expression_number:
call convert_number
expression_operator:
push edi
mov edi,operators
call get_operator
pop edi
or al,al
jz expression_end
operators_loop:
cmp esp,[current_offset]
je push_operator
mov bl,al
and bl,0F0h
mov bh,byte [esp]
and bh,0F0h
cmp bl,bh
ja push_operator
pop ebx
mov byte [edi],bl
inc edi
jmp operators_loop
push_operator:
push eax
jmp expression_loop
expression_end:
cmp esp,[current_offset]
je expression_converted
pop eax
stos byte [edi]
jmp expression_end
expression_converted:
pop ebp
ret
fp_expression:
mov al,'.'
stos byte [edi]
mov eax,[fp_value]
stos dword [edi]
mov eax,[fp_value+4]
stos dword [edi]
mov eax,[fp_value+8]
stos dword [edi]
pop ebp
ret
 
convert_number:
lea eax,[edi+20h]
mov edx,[memory_end]
cmp [source_start],0
je check_memory_for_number
mov edx,[labels_list]
check_memory_for_number:
cmp eax,edx
jae out_of_memory
mov eax,esp
sub eax,[stack_limit]
cmp eax,100h
jb stack_overflow
cmp byte [esi],'('
je expression_value
inc edi
call get_number
jc symbol_value
or ebp,ebp
jz valid_number
mov byte [edi-1],0Fh
ret
valid_number:
cmp dword [edi+4],0
jne qword_number
cmp word [edi+2],0
jne dword_number
cmp byte [edi+1],0
jne word_number
byte_number:
mov byte [edi-1],1
inc edi
ret
qword_number:
mov byte [edi-1],8
add edi,8
ret
dword_number:
mov byte [edi-1],4
scas dword [edi]
ret
word_number:
mov byte [edi-1],2
scas word [edi]
ret
expression_value:
inc esi
push [current_offset]
call convert_expression
pop [current_offset]
lods byte [esi]
cmp al,')'
je subexpression_closed
dec esi
mov al,'!'
stosb
subexpression_closed:
ret
symbol_value:
cmp [source_start],0
je preprocessor_value
push edi esi
lods word [esi]
cmp al,1Ah
jne no_address_register
movzx ecx,ah
call get_symbol
jc no_address_register
cmp al,10h
jne no_address_register
mov al,ah
shr ah,4
cmp ah,4
je register_value
and ah,not 1
cmp ah,8
je register_value
cmp ah,0Ch
jae register_value
cmp ah,6
je register_value
cmp al,23h
je register_value
cmp al,25h
je register_value
cmp al,26h
je register_value
cmp al,27h
je register_value
no_address_register:
pop esi
mov edi,directive_operators
call get_operator
pop edi
or al,al
jnz broken_value
lods byte [esi]
cmp al,1Ah
jne invalid_value
lods byte [esi]
movzx ecx,al
call get_label_id
store_label_value:
mov byte [edi-1],11h
stos dword [edi]
ret
broken_value:
mov eax,0Fh
jmp store_label_value
register_value:
pop edx edi
mov byte [edi-1],10h
stos byte [edi]
ret
preprocessor_value:
dec edi
cmp [hash_tree],0
je invalid_value
lods byte [esi]
cmp al,1Ah
jne invalid_value
lods byte [esi]
mov cl,al
mov ch,10b
call get_preprocessor_symbol
jc invalid_value
push esi
mov esi,[edx+8]
push [current_offset]
call convert_expression
pop [current_offset]
pop esi
ret
 
get_number:
xor ebp,ebp
lods byte [esi]
cmp al,22h
je get_text_number
cmp al,1Ah
jne not_number
lods byte [esi]
movzx ecx,al
mov [number_start],esi
mov al,[esi]
cmp al,'$'
je number_begin
sub al,30h
cmp al,9
ja invalid_number
number_begin:
mov ebx,esi
add esi,ecx
push esi
dec esi
mov dword [edi],0
mov dword [edi+4],0
cmp byte [ebx],'$'
je pascal_hex_number
cmp word [ebx],'0x'
je get_hex_number
mov al,[esi]
dec esi
cmp al,'h'
je get_hex_number
cmp al,'b'
je get_bin_number
cmp al,'d'
je get_dec_number
cmp al,'o'
je get_oct_number
cmp al,'q'
je get_oct_number
cmp al,'H'
je get_hex_number
cmp al,'B'
je get_bin_number
cmp al,'D'
je get_dec_number
cmp al,'O'
je get_oct_number
cmp al,'Q'
je get_oct_number
inc esi
get_dec_number:
mov ebx,esi
mov esi,[number_start]
get_dec_digit:
cmp esi,ebx
ja number_ok
cmp byte [esi],27h
je next_dec_digit
cmp byte [esi],'_'
je next_dec_digit
xor edx,edx
mov eax,[edi]
shld edx,eax,2
shl eax,2
add eax,[edi]
adc edx,0
add eax,eax
adc edx,edx
mov [edi],eax
mov eax,[edi+4]
add eax,eax
jc dec_out_of_range
add eax,eax
jc dec_out_of_range
add eax,[edi+4]
jc dec_out_of_range
add eax,eax
jc dec_out_of_range
add eax,edx
jc dec_out_of_range
mov [edi+4],eax
movzx eax,byte [esi]
sub al,30h
jc bad_number
cmp al,9
ja bad_number
add [edi],eax
adc dword [edi+4],0
jc dec_out_of_range
next_dec_digit:
inc esi
jmp get_dec_digit
dec_out_of_range:
cmp esi,ebx
ja dec_out_of_range_finished
lods byte [esi]
cmp al,27h
je bad_number
cmp al,'_'
je bad_number
sub al,30h
jc bad_number
cmp al,9
ja bad_number
jmp dec_out_of_range
dec_out_of_range_finished:
or ebp,-1
jmp number_ok
bad_number:
pop eax
invalid_number:
mov esi,[number_start]
dec esi
not_number:
dec esi
stc
ret
get_bin_number:
xor bl,bl
get_bin_digit:
cmp esi,[number_start]
jb number_ok
movzx eax,byte [esi]
cmp al,27h
je bin_digit_skip
cmp al,'_'
je bin_digit_skip
sub al,30h
cmp al,1
ja bad_number
xor edx,edx
mov cl,bl
dec esi
cmp bl,64
je bin_out_of_range
inc bl
cmp cl,32
jae bin_digit_high
shl eax,cl
or dword [edi],eax
jmp get_bin_digit
bin_digit_high:
sub cl,32
shl eax,cl
or dword [edi+4],eax
jmp get_bin_digit
bin_out_of_range:
or al,al
jz get_bin_digit
or ebp,-1
jmp get_bin_digit
bin_digit_skip:
dec esi
jmp get_bin_digit
pascal_hex_number:
cmp cl,1
je bad_number
get_hex_number:
xor bl,bl
get_hex_digit:
cmp esi,[number_start]
jb number_ok
movzx eax,byte [esi]
cmp al,27h
je hex_digit_skip
cmp al,'_'
je hex_digit_skip
cmp al,'x'
je hex_number_ok
cmp al,'$'
je pascal_hex_ok
sub al,30h
cmp al,9
jbe hex_digit_ok
sub al,7
cmp al,15
jbe hex_letter_digit_ok
sub al,20h
cmp al,15
ja bad_number
hex_letter_digit_ok:
cmp al,10
jb bad_number
hex_digit_ok:
xor edx,edx
mov cl,bl
dec esi
cmp bl,64
je hex_out_of_range
add bl,4
cmp cl,32
jae hex_digit_high
shl eax,cl
or dword [edi],eax
jmp get_hex_digit
hex_digit_high:
sub cl,32
shl eax,cl
or dword [edi+4],eax
jmp get_hex_digit
hex_out_of_range:
or al,al
jz get_hex_digit
or ebp,-1
jmp get_hex_digit
hex_digit_skip:
dec esi
jmp get_hex_digit
get_oct_number:
xor bl,bl
get_oct_digit:
cmp esi,[number_start]
jb number_ok
movzx eax,byte [esi]
cmp al,27h
je oct_digit_skip
cmp al,'_'
je oct_digit_skip
sub al,30h
cmp al,7
ja bad_number
oct_digit_ok:
xor edx,edx
mov cl,bl
dec esi
cmp bl,63
ja oct_out_of_range
jne oct_range_ok
cmp al,1
ja oct_out_of_range
oct_range_ok:
add bl,3
cmp cl,30
je oct_digit_wrap
ja oct_digit_high
shl eax,cl
or dword [edi],eax
jmp get_oct_digit
oct_digit_wrap:
shl eax,cl
adc dword [edi+4],0
or dword [edi],eax
jmp get_oct_digit
oct_digit_high:
sub cl,32
shl eax,cl
or dword [edi+4],eax
jmp get_oct_digit
oct_digit_skip:
dec esi
jmp get_oct_digit
oct_out_of_range:
or al,al
jz get_oct_digit
or ebp,-1
jmp get_oct_digit
hex_number_ok:
dec esi
pascal_hex_ok:
cmp esi,[number_start]
jne bad_number
number_ok:
pop esi
number_done:
clc
ret
get_text_number:
lods dword [esi]
mov edx,eax
xor bl,bl
mov dword [edi],0
mov dword [edi+4],0
get_text_character:
sub edx,1
jc number_done
movzx eax,byte [esi]
inc esi
mov cl,bl
cmp bl,64
je text_out_of_range
add bl,8
cmp cl,32
jae text_character_high
shl eax,cl
or dword [edi],eax
jmp get_text_character
text_character_high:
sub cl,32
shl eax,cl
or dword [edi+4],eax
jmp get_text_character
text_out_of_range:
or ebp,-1
jmp get_text_character
 
get_fp_value:
push edi esi
lods byte [esi]
cmp al,1Ah
je fp_value_start
cmp al,'-'
je fp_sign_ok
cmp al,'+'
jne not_fp_value
fp_sign_ok:
lods byte [esi]
cmp al,1Ah
jne not_fp_value
fp_value_start:
lods byte [esi]
movzx ecx,al
cmp cl,1
jbe not_fp_value
lea edx,[esi+1]
xor ah,ah
check_fp_value:
lods byte [esi]
cmp al,'.'
je fp_character_dot
cmp al,'E'
je fp_character_exp
cmp al,'e'
je fp_character_exp
cmp al,'F'
je fp_last_character
cmp al,'f'
je fp_last_character
digit_expected:
cmp al,'0'
jb not_fp_value
cmp al,'9'
ja not_fp_value
jmp fp_character_ok
fp_character_dot:
cmp esi,edx
je not_fp_value
or ah,ah
jnz not_fp_value
or ah,1
lods byte [esi]
loop digit_expected
not_fp_value:
pop esi edi
stc
ret
fp_last_character:
cmp cl,1
jne not_fp_value
or ah,4
jmp fp_character_ok
fp_character_exp:
cmp esi,edx
je not_fp_value
cmp ah,1
ja not_fp_value
or ah,2
cmp ecx,1
jne fp_character_ok
cmp byte [esi],'+'
je fp_exp_sign
cmp byte [esi],'-'
jne fp_character_ok
fp_exp_sign:
inc esi
cmp byte [esi],1Ah
jne not_fp_value
inc esi
lods byte [esi]
movzx ecx,al
inc ecx
fp_character_ok:
dec ecx
jnz check_fp_value
or ah,ah
jz not_fp_value
pop esi
lods byte [esi]
mov [fp_sign],0
cmp al,1Ah
je fp_get
inc esi
cmp al,'+'
je fp_get
mov [fp_sign],1
fp_get:
lods byte [esi]
movzx ecx,al
xor edx,edx
mov edi,fp_value
mov [edi],edx
mov [edi+4],edx
mov [edi+12],edx
call fp_optimize
mov [fp_format],0
mov al,[esi]
fp_before_dot:
lods byte [esi]
cmp al,'.'
je fp_dot
cmp al,'E'
je fp_exponent
cmp al,'e'
je fp_exponent
cmp al,'F'
je fp_done
cmp al,'f'
je fp_done
sub al,30h
mov edi,fp_value+16
xor edx,edx
mov dword [edi+12],edx
mov dword [edi],edx
mov dword [edi+4],edx
mov [edi+7],al
mov dl,7
mov dword [edi+8],edx
call fp_optimize
mov edi,fp_value
push ecx
mov ecx,10
call fp_mul
pop ecx
mov ebx,fp_value+16
call fp_add
loop fp_before_dot
fp_dot:
mov edi,fp_value+16
xor edx,edx
mov [edi],edx
mov [edi+4],edx
mov byte [edi+7],80h
mov [edi+8],edx
mov dword [edi+12],edx
dec ecx
jz fp_done
fp_after_dot:
lods byte [esi]
cmp al,'E'
je fp_exponent
cmp al,'e'
je fp_exponent
cmp al,'F'
je fp_done
cmp al,'f'
je fp_done
inc [fp_format]
cmp [fp_format],80h
jne fp_counter_ok
mov [fp_format],7Fh
fp_counter_ok:
dec esi
mov edi,fp_value+16
push ecx
mov ecx,10
call fp_div
push dword [edi]
push dword [edi+4]
push dword [edi+8]
push dword [edi+12]
lods byte [esi]
sub al,30h
movzx ecx,al
call fp_mul
mov ebx,edi
mov edi,fp_value
call fp_add
mov edi,fp_value+16
pop dword [edi+12]
pop dword [edi+8]
pop dword [edi+4]
pop dword [edi]
pop ecx
dec ecx
jnz fp_after_dot
jmp fp_done
fp_exponent:
or [fp_format],80h
xor edx,edx
xor ebp,ebp
dec ecx
jnz get_exponent
cmp byte [esi],'+'
je fp_exponent_sign
cmp byte [esi],'-'
jne fp_done
not ebp
fp_exponent_sign:
add esi,2
lods byte [esi]
movzx ecx,al
get_exponent:
movzx eax,byte [esi]
inc esi
sub al,30h
cmp al,10
jae exponent_ok
imul edx,10
cmp edx,8000h
jae value_out_of_range
add edx,eax
loop get_exponent
exponent_ok:
mov edi,fp_value
or edx,edx
jz fp_done
mov ecx,edx
or ebp,ebp
jnz fp_negative_power
fp_power:
push ecx
mov ecx,10
call fp_mul
pop ecx
loop fp_power
jmp fp_done
fp_negative_power:
push ecx
mov ecx,10
call fp_div
pop ecx
loop fp_negative_power
fp_done:
mov edi,fp_value
mov al,[fp_format]
mov [edi+10],al
mov al,[fp_sign]
mov [edi+11],al
test byte [edi+15],80h
jz fp_ok
add dword [edi],1
adc dword [edi+4],0
jnc fp_ok
mov eax,[edi+4]
shrd [edi],eax,1
shr eax,1
or eax,80000000h
mov [edi+4],eax
inc word [edi+8]
fp_ok:
pop edi
clc
ret
fp_mul:
or ecx,ecx
jz fp_zero
mov eax,[edi+12]
mul ecx
mov [edi+12],eax
mov ebx,edx
mov eax,[edi]
mul ecx
add eax,ebx
adc edx,0
mov [edi],eax
mov ebx,edx
mov eax,[edi+4]
mul ecx
add eax,ebx
adc edx,0
mov [edi+4],eax
.loop:
or edx,edx
jz .done
mov eax,[edi]
shrd [edi+12],eax,1
mov eax,[edi+4]
shrd [edi],eax,1
shrd eax,edx,1
mov [edi+4],eax
shr edx,1
inc dword [edi+8]
cmp dword [edi+8],8000h
jge value_out_of_range
jmp .loop
.done:
ret
fp_div:
mov eax,[edi+4]
xor edx,edx
div ecx
mov [edi+4],eax
mov eax,[edi]
div ecx
mov [edi],eax
mov eax,[edi+12]
div ecx
mov [edi+12],eax
mov ebx,eax
or ebx,[edi]
or ebx,[edi+4]
jz fp_zero
.loop:
test byte [edi+7],80h
jnz .exp_ok
mov eax,[edi]
shld [edi+4],eax,1
mov eax,[edi+12]
shld [edi],eax,1
add eax,eax
mov [edi+12],eax
dec dword [edi+8]
add edx,edx
jmp .loop
.exp_ok:
mov eax,edx
xor edx,edx
div ecx
add [edi+12],eax
adc dword [edi],0
adc dword [edi+4],0
jnc .done
mov eax,[edi+4]
mov ebx,[edi]
shrd [edi],eax,1
shrd [edi+12],ebx,1
shr eax,1
or eax,80000000h
mov [edi+4],eax
inc dword [edi+8]
.done:
ret
fp_add:
cmp dword [ebx+8],8000h
je .done
cmp dword [edi+8],8000h
je .copy
mov eax,[ebx+8]
cmp eax,[edi+8]
jge .exp_ok
mov eax,[edi+8]
.exp_ok:
call .change_exp
xchg ebx,edi
call .change_exp
xchg ebx,edi
mov edx,[ebx+12]
mov eax,[ebx]
mov ebx,[ebx+4]
add [edi+12],edx
adc [edi],eax
adc [edi+4],ebx
jnc .done
mov eax,[edi]
shrd [edi+12],eax,1
mov eax,[edi+4]
shrd [edi],eax,1
shr eax,1
or eax,80000000h
mov [edi+4],eax
inc dword [edi+8]
.done:
ret
.copy:
mov eax,[ebx]
mov [edi],eax
mov eax,[ebx+4]
mov [edi+4],eax
mov eax,[ebx+8]
mov [edi+8],eax
mov eax,[ebx+12]
mov [edi+12],eax
ret
.change_exp:
push ecx
mov ecx,eax
sub ecx,[ebx+8]
mov edx,[ebx+4]
jecxz .exp_done
.exp_loop:
mov ebp,[ebx]
shrd [ebx+12],ebp,1
shrd [ebx],edx,1
shr edx,1
inc dword [ebx+8]
loop .exp_loop
.exp_done:
mov [ebx+4],edx
pop ecx
ret
fp_optimize:
mov eax,[edi]
mov ebp,[edi+4]
or ebp,[edi]
or ebp,[edi+12]
jz fp_zero
.loop:
test byte [edi+7],80h
jnz .done
shld [edi+4],eax,1
mov ebp,[edi+12]
shld eax,ebp,1
mov [edi],eax
shl dword [edi+12],1
dec dword [edi+8]
jmp .loop
.done:
ret
fp_zero:
mov dword [edi+8],8000h
ret
 
preevaluate_logical_expression:
xor al,al
preevaluate_embedded_logical_expression:
mov [logical_value_wrapping],al
push edi
call preevaluate_logical_value
preevaluation_loop:
cmp al,0FFh
je invalid_logical_expression
mov dl,[esi]
inc esi
cmp dl,'|'
je preevaluate_or
cmp dl,'&'
je preevaluate_and
cmp dl,92h
je preevaluation_done
or dl,dl
jnz invalid_logical_expression
preevaluation_done:
pop edx
dec esi
ret
preevaluate_or:
cmp al,'1'
je quick_true
cmp al,'0'
je leave_only_following
push edi
mov al,dl
stos byte [edi]
call preevaluate_logical_value
pop ebx
cmp al,'0'
je leave_only_preceding
cmp al,'1'
jne preevaluation_loop
stos byte [edi]
xor al,al
jmp preevaluation_loop
preevaluate_and:
cmp al,'0'
je quick_false
cmp al,'1'
je leave_only_following
push edi
mov al,dl
stos byte [edi]
call preevaluate_logical_value
pop ebx
cmp al,'1'
je leave_only_preceding
cmp al,'0'
jne preevaluation_loop
stos byte [edi]
xor al,al
jmp preevaluation_loop
leave_only_following:
mov edi,[esp]
call preevaluate_logical_value
jmp preevaluation_loop
leave_only_preceding:
mov edi,ebx
xor al,al
jmp preevaluation_loop
quick_true:
call skip_logical_value
jc invalid_logical_expression
mov edi,[esp]
mov al,'1'
jmp preevaluation_loop
quick_false:
call skip_logical_value
jc invalid_logical_expression
mov edi,[esp]
mov al,'0'
jmp preevaluation_loop
invalid_logical_expression:
pop edi
mov esi,edi
mov al,0FFh
stos byte [edi]
ret
skip_logical_value:
cmp byte [esi],'~'
jne negation_skipped
inc esi
jmp skip_logical_value
negation_skipped:
mov al,[esi]
cmp al,91h
jne skip_simple_logical_value
inc esi
xchg al,[logical_value_wrapping]
push eax
skip_logical_expression:
call skip_logical_value
lods byte [esi]
or al,al
jz wrongly_structured_logical_expression
cmp al,0Fh
je wrongly_structured_logical_expression
cmp al,'|'
je skip_logical_expression
cmp al,'&'
je skip_logical_expression
cmp al,92h
jne wrongly_structured_logical_expression
pop eax
mov [logical_value_wrapping],al
logical_value_skipped:
clc
ret
wrongly_structured_logical_expression:
pop eax
stc
ret
skip_simple_logical_value:
mov [logical_value_parentheses],0
find_simple_logical_value_end:
mov al,[esi]
or al,al
jz logical_value_skipped
cmp al,0Fh
je logical_value_skipped
cmp al,'|'
je logical_value_skipped
cmp al,'&'
je logical_value_skipped
cmp al,91h
je skip_logical_value_internal_parenthesis
cmp al,92h
jne skip_logical_value_symbol
sub [logical_value_parentheses],1
jnc skip_logical_value_symbol
cmp [logical_value_wrapping],91h
jne skip_logical_value_symbol
jmp logical_value_skipped
skip_logical_value_internal_parenthesis:
inc [logical_value_parentheses]
skip_logical_value_symbol:
call skip_symbol
jmp find_simple_logical_value_end
preevaluate_logical_value:
mov ebp,edi
preevaluate_negation:
cmp byte [esi],'~'
jne preevaluate_negation_ok
movs byte [edi],[esi]
jmp preevaluate_negation
preevaluate_negation_ok:
mov ebx,esi
cmp byte [esi],91h
jne preevaluate_simple_logical_value
lods byte [esi]
stos byte [edi]
push ebp
mov dl,[logical_value_wrapping]
push edx
call preevaluate_embedded_logical_expression
pop edx
mov [logical_value_wrapping],dl
pop ebp
cmp al,0FFh
je invalid_logical_value
cmp byte [esi],92h
jne invalid_logical_value
or al,al
jnz preevaluated_expression_value
movs byte [edi],[esi]
ret
preevaluated_expression_value:
inc esi
lea edx,[edi-1]
sub edx,ebp
test edx,1
jz expression_negation_ok
xor al,1
expression_negation_ok:
mov edi,ebp
ret
invalid_logical_value:
mov edi,ebp
mov al,0FFh
ret
preevaluate_simple_logical_value:
xor edx,edx
mov [logical_value_parentheses],edx
find_logical_value_boundaries:
mov al,[esi]
or al,al
jz logical_value_boundaries_found
cmp al,91h
je logical_value_internal_parentheses
cmp al,92h
je logical_value_boundaries_parenthesis_close
cmp al,'|'
je logical_value_boundaries_found
cmp al,'&'
je logical_value_boundaries_found
or edx,edx
jnz next_symbol_in_logical_value
cmp al,0F0h
je preevaluable_logical_operator
cmp al,0F7h
je preevaluable_logical_operator
cmp al,0F6h
jne next_symbol_in_logical_value
preevaluable_logical_operator:
mov edx,esi
next_symbol_in_logical_value:
call skip_symbol
jmp find_logical_value_boundaries
logical_value_internal_parentheses:
inc [logical_value_parentheses]
jmp next_symbol_in_logical_value
logical_value_boundaries_parenthesis_close:
sub [logical_value_parentheses],1
jnc next_symbol_in_logical_value
cmp [logical_value_wrapping],91h
jne next_symbol_in_logical_value
logical_value_boundaries_found:
or edx,edx
jz non_preevaluable_logical_value
mov al,[edx]
cmp al,0F0h
je compare_symbols
cmp al,0F7h
je compare_symbol_types
cmp al,0F6h
je scan_symbols_list
non_preevaluable_logical_value:
mov ecx,esi
mov esi,ebx
sub ecx,esi
jz invalid_logical_value
cmp esi,edi
je leave_logical_value_intact
rep movs byte [edi],[esi]
xor al,al
ret
leave_logical_value_intact:
add edi,ecx
add esi,ecx
xor al,al
ret
compare_symbols:
lea ecx,[esi-1]
sub ecx,edx
mov eax,edx
sub eax,ebx
cmp ecx,eax
jne preevaluated_false
push esi edi
mov esi,ebx
lea edi,[edx+1]
repe cmps byte [esi],[edi]
pop edi esi
je preevaluated_true
preevaluated_false:
mov eax,edi
sub eax,ebp
test eax,1
jnz store_true
store_false:
mov edi,ebp
mov al,'0'
ret
preevaluated_true:
mov eax,edi
sub eax,ebp
test eax,1
jnz store_false
store_true:
mov edi,ebp
mov al,'1'
ret
compare_symbol_types:
push esi
lea esi,[edx+1]
type_comparison:
cmp esi,[esp]
je types_compared
mov al,[esi]
cmp al,[ebx]
jne different_type
cmp al,'('
jne equal_type
mov al,[esi+1]
mov ah,[ebx+1]
cmp al,ah
je equal_type
or al,al
jz different_type
or ah,ah
jz different_type
cmp al,'.'
je different_type
cmp ah,'.'
je different_type
equal_type:
call skip_symbol
xchg esi,ebx
call skip_symbol
xchg esi,ebx
jmp type_comparison
types_compared:
pop esi
cmp byte [ebx],0F7h
jne preevaluated_false
jmp preevaluated_true
different_type:
pop esi
jmp preevaluated_false
scan_symbols_list:
push edi esi
lea esi,[edx+1]
sub edx,ebx
lods byte [esi]
cmp al,'<'
jne invalid_symbols_list
get_next_from_list:
mov edi,esi
get_from_list:
cmp byte [esi],','
je compare_in_list
cmp byte [esi],'>'
je compare_in_list
cmp esi,[esp]
jae invalid_symbols_list
call skip_symbol
jmp get_from_list
compare_in_list:
mov ecx,esi
sub ecx,edi
cmp ecx,edx
jne not_equal_length_in_list
mov esi,ebx
repe cmps byte [esi],[edi]
mov esi,edi
jne not_equal_in_list
skip_rest_of_list:
cmp byte [esi],'>'
je check_list_end
cmp esi,[esp]
jae invalid_symbols_list
call skip_symbol
jmp skip_rest_of_list
check_list_end:
inc esi
cmp esi,[esp]
jne invalid_symbols_list
pop esi edi
jmp preevaluated_true
not_equal_in_list:
add esi,ecx
not_equal_length_in_list:
lods byte [esi]
cmp al,','
je get_next_from_list
cmp esi,[esp]
jne invalid_symbols_list
pop esi edi
jmp preevaluated_false
invalid_symbols_list:
pop esi edi
jmp invalid_logical_value
/programs/develop/koldbg/fasm/fasm.asm
0,0 → 1,155
use32
 
open: cmp edx,input_magic
jne fail
mov ebx,[edx]
ret
 
close: cmp ebx,[input_magic]
jne fail
xor ebx,ebx ;CF=0
ret
 
lseek: cmp ebx,[input_magic]
jne fail
 
cmp al,2
je .end
cmp al,1
je .pos
cmp al,0
jne fail
 
.str:
mov eax,edx
cmp eax,[input_size]
ja fail
jmp .ok
 
.end:
mov eax,[input_size]
neg edx
add eax,edx
jc fail
.ok:
mov [input_start],eax
clc
ret
 
.pos:
mov eax,[input_start]
add eax,edx
cmp eax,[input_size]
ja fail
jmp .ok
 
read: cmp ebx,[input_magic]
jne fail
push esi edi
mov esi,[input_start]
add esi,[input_code]
mov eax,[input_size]
mov edi,edx
cmp eax,ecx
jnc skip
mov ecx,eax
skip: mov eax,ecx
add [input_start],eax
shr ecx,2
cld
rep movsd
mov cl,al
and cl,3
rep movsb
pop edi esi
clc
ret
 
write: ;not implemented
create: ;not implemented
 
fail: stc
ret
 
make_timestamp:
xor eax,eax ;not implemented
get_environment_variable: ;not implemented
display_block: ;not implemented
ret
 
assembler_error: fatal_error:
pop [output_errs]
stc
jmp stack_restore
 
Assemble:
xor eax,eax
mov [output_errs],eax
mov [output_size],eax
mov [input_start],eax
 
mov [input_file],input_magic
mov [input_size],ecx
mov [input_code],esi
mov [input_stack],esp
 
mov [memory_start],StdMemStr
mov [memory_end],StdMemEnd
mov [additional_memory],AddMemStr
mov [additional_memory_end],AddMemEnd
 
lea eax,[esp-4*1024]
mov [stack_limit],eax
 
call preprocessor
call parser
call assembler
 
mov esi,[code_start]
mov ecx,edi
sub ecx,esi
 
mov eax,256
cmp ecx,eax
jna max_256
mov ecx,eax
max_256:
 
mov [output_size],ecx
mov edi,output_data
rep movsb
 
stack_restore:
 
mov esp,[input_stack]
mov esi,[output_errs]
ret
 
include 'fasm\version.inc'
include 'fasm\errors.inc'
include 'fasm\symbdump.inc'
include 'fasm\preproce.inc'
include 'fasm\parser.inc'
include 'fasm\exprpars.inc'
include 'fasm\assemble.inc'
include 'fasm\exprcalc.inc'
include 'fasm\formats.inc'
include 'fasm\x86_64.inc'
include 'fasm\avx.inc'
 
include 'fasm\tables.inc'
include 'fasm\messages.inc'
 
iglobal
input_magic dd 55AA55AAh
endg
uglobal
input_code dd ?
input_size dd ?
input_start dd ?
input_stack dd ?
output_size dd ?
output_errs dd ?
output_data rb 256
include 'fasm\variable.inc'
endg
/programs/develop/koldbg/fasm/formats.inc
0,0 → 1,4194
 
; flat assembler core
; Copyright (c) 1999-2019, Tomasz Grysztar.
; All rights reserved.
 
formatter:
mov [current_offset],edi
cmp [output_file],0
jne output_path_ok
mov esi,[input_file]
mov edi,[free_additional_memory]
duplicate_output_path:
lods byte [esi]
cmp edi,[structures_buffer]
jae out_of_memory
stos byte [edi]
or al,al
jnz duplicate_output_path
dec edi
mov eax,edi
find_extension:
dec eax
cmp eax,[free_additional_memory]
jb extension_found
cmp byte [eax],'\'
je extension_found
cmp byte [eax],'/'
je extension_found
cmp byte [eax],'.'
jne find_extension
mov edi,eax
extension_found:
lea eax,[edi+9]
cmp eax,[structures_buffer]
jae out_of_memory
cmp [file_extension],0
jne extension_specified
mov al,[output_format]
cmp al,2
je exe_extension
jb bin_extension
cmp al,4
je obj_extension
cmp al,5
je o_extension
cmp al,3
jne no_extension
cmp [subsystem],1
je sys_extension
cmp [subsystem],10
jae efi_extension
bt [format_flags],8
jnc exe_extension
mov eax,'.dll'
jmp make_extension
sys_extension:
mov eax,'.sys'
jmp make_extension
efi_extension:
mov eax,'.efi'
jmp make_extension
bin_extension:
mov eax,'.bin'
bt [format_flags],0
jnc make_extension
mov eax,'.com'
jmp make_extension
obj_extension:
mov eax,'.obj'
jmp make_extension
o_extension:
mov eax,'.o'
bt [format_flags],0
jnc make_extension
no_extension:
xor eax,eax
jmp make_extension
exe_extension:
mov eax,'.exe'
make_extension:
xchg eax,[edi]
scas dword [edi]
mov byte [edi],0
scas byte [edi]
mov esi,edi
stos dword [edi]
sub edi,9
xor eax,eax
mov ebx,characters
adapt_case:
mov al,[esi]
or al,al
jz adapt_next
xlat byte [ebx]
cmp al,[esi]
je adapt_ok
sub byte [edi],20h
adapt_ok:
inc esi
adapt_next:
inc edi
cmp byte [edi],0
jne adapt_case
jmp extension_ok
extension_specified:
mov al,'.'
stos byte [edi]
mov esi,[file_extension]
copy_extension:
lods byte [esi]
stos byte [edi]
test al,al
jnz copy_extension
dec edi
extension_ok:
mov esi,edi
lea ecx,[esi+1]
sub ecx,[free_additional_memory]
mov edi,[structures_buffer]
dec edi
std
rep movs byte [edi],[esi]
cld
inc edi
mov [structures_buffer],edi
mov [output_file],edi
output_path_ok:
cmp [symbols_file],0
je labels_table_ok
mov ecx,[memory_end]
sub ecx,[labels_list]
mov edi,[tagged_blocks]
sub edi,8
mov [edi],ecx
or dword [edi+4],-1
sub edi,ecx
cmp edi,[current_offset]
jbe out_of_memory
mov [tagged_blocks],edi
mov esi,[memory_end]
copy_labels:
sub esi,32
cmp esi,[labels_list]
jb labels_table_ok
mov ecx,32 shr 2
rep movs dword [edi],[esi]
sub esi,32
jmp copy_labels
labels_table_ok:
mov edi,[current_offset]
cmp [output_format],4
je coff_formatter
cmp [output_format],5
jne common_formatter
bt [format_flags],0
jnc elf_formatter
common_formatter:
mov eax,edi
sub eax,[code_start]
mov [real_code_size],eax
cmp edi,[undefined_data_end]
jne calculate_code_size
mov edi,[undefined_data_start]
calculate_code_size:
mov [current_offset],edi
sub edi,[code_start]
mov [code_size],edi
and [written_size],0
mov edx,[output_file]
call create
jc write_failed
cmp [output_format],3
jne stub_written
mov edx,[code_start]
mov ecx,[stub_size]
sub edx,ecx
add [written_size],ecx
call write
stub_written:
cmp [output_format],2
jne write_output
call write_mz_header
write_output:
call write_code
output_written:
call close
cmp [symbols_file],0
jne dump_symbols
ret
write_code:
mov eax,[written_size]
mov [headers_size],eax
mov edx,[code_start]
mov ecx,[code_size]
add [written_size],ecx
lea eax,[edx+ecx]
call write
jc write_failed
ret
format_directive:
cmp edi,[code_start]
jne unexpected_instruction
mov ebp,[addressing_space]
test byte [ds:ebp+0Ah],1
jnz unexpected_instruction
cmp [output_format],0
jne unexpected_instruction
lods byte [esi]
cmp al,1Ch
je format_prefix
cmp al,18h
jne invalid_argument
lods byte [esi]
select_format:
mov dl,al
shr al,4
mov [output_format],al
and edx,0Fh
or [format_flags],edx
cmp al,2
je format_mz
cmp al,3
je format_pe
cmp al,4
je format_coff
cmp al,5
je format_elf
format_defined:
cmp byte [esi],86h
jne instruction_assembled
cmp word [esi+1],'('
jne invalid_argument
mov eax,[esi+3]
add esi,3+4
mov [file_extension],esi
lea esi,[esi+eax+1]
jmp instruction_assembled
format_prefix:
lods byte [esi]
mov ah,al
lods byte [esi]
cmp al,18h
jne invalid_argument
lods byte [esi]
mov edx,eax
shr dl,4
shr dh,4
cmp dl,dh
jne invalid_argument
or al,ah
jmp select_format
entry_directive:
bts [format_flags],10h
jc setting_already_specified
mov al,[output_format]
cmp al,2
je mz_entry
cmp al,3
je pe_entry
cmp al,5
jne illegal_instruction
bt [format_flags],0
jc elf_entry
jmp illegal_instruction
stack_directive:
bts [format_flags],11h
jc setting_already_specified
mov al,[output_format]
cmp al,2
je mz_stack
cmp al,3
je pe_stack
jmp illegal_instruction
heap_directive:
bts [format_flags],12h
jc setting_already_specified
mov al,[output_format]
cmp al,2
je mz_heap
cmp al,3
je pe_heap
jmp illegal_instruction
segment_directive:
mov al,[output_format]
cmp al,2
je mz_segment
cmp al,5
je elf_segment
jmp illegal_instruction
section_directive:
mov al,[output_format]
cmp al,3
je pe_section
cmp al,4
je coff_section
cmp al,5
je elf_section
jmp illegal_instruction
public_directive:
mov al,[output_format]
cmp al,4
je public_allowed
cmp al,5
jne illegal_instruction
bt [format_flags],0
jc illegal_instruction
public_allowed:
mov [base_code],0C0h
lods byte [esi]
cmp al,2
je public_label
cmp al,1Dh
jne invalid_argument
lods byte [esi]
and al,7
add [base_code],al
lods byte [esi]
cmp al,2
jne invalid_argument
public_label:
lods dword [esi]
cmp eax,0Fh
jb invalid_use_of_symbol
je reserved_word_used_as_symbol
inc esi
mov dx,[current_pass]
mov [eax+18],dx
or byte [eax+8],8
mov ebx,eax
call store_label_reference
mov eax,ebx
mov ebx,[free_additional_memory]
lea edx,[ebx+10h]
cmp edx,[structures_buffer]
jae out_of_memory
mov [free_additional_memory],edx
mov [ebx+8],eax
mov eax,[current_line]
mov [ebx+0Ch],eax
lods byte [esi]
cmp al,86h
jne invalid_argument
lods word [esi]
cmp ax,'('
jne invalid_argument
mov [ebx+4],esi
lods dword [esi]
lea esi,[esi+eax+1]
mov al,[base_code]
mov [ebx],al
jmp instruction_assembled
extrn_directive:
mov al,[output_format]
cmp al,4
je extrn_allowed
cmp al,5
jne illegal_instruction
bt [format_flags],0
jc illegal_instruction
extrn_allowed:
lods word [esi]
cmp ax,'('
jne invalid_argument
mov ebx,esi
lods dword [esi]
lea esi,[esi+eax+1]
mov edx,[free_additional_memory]
lea eax,[edx+0Ch]
cmp eax,[structures_buffer]
jae out_of_memory
mov [free_additional_memory],eax
mov byte [edx],80h
mov [edx+4],ebx
lods byte [esi]
cmp al,86h
jne invalid_argument
lods byte [esi]
cmp al,2
jne invalid_argument
lods dword [esi]
cmp eax,0Fh
jb invalid_use_of_symbol
je reserved_word_used_as_symbol
inc esi
mov ebx,eax
xor ah,ah
lods byte [esi]
cmp al,':'
je get_extrn_size
dec esi
cmp al,11h
jne extrn_size_ok
get_extrn_size:
lods word [esi]
cmp al,11h
jne invalid_argument
extrn_size_ok:
mov [address_symbol],edx
mov [label_size],ah
movzx ecx,ah
mov [edx+8],ecx
xor eax,eax
xor edx,edx
xor ebp,ebp
mov [address_sign],0
mov ch,2
test [format_flags],8
jz make_free_label
mov ch,4
jmp make_free_label
mark_relocation:
cmp [value_type],0
je relocation_ok
mov ebp,[addressing_space]
test byte [ds:ebp+0Ah],1
jnz relocation_ok
cmp [output_format],2
je mark_mz_relocation
cmp [output_format],3
je mark_pe_relocation
cmp [output_format],4
je mark_coff_relocation
cmp [output_format],5
je mark_elf_relocation
relocation_ok:
ret
close_pass:
mov al,[output_format]
cmp al,3
je close_pe
cmp al,4
je close_coff
cmp al,5
je close_elf
ret
 
format_mz:
mov edx,[additional_memory]
push edi
mov edi,edx
mov ecx,1Ch shr 2
xor eax,eax
rep stos dword [edi]
mov [free_additional_memory],edi
pop edi
mov word [edx+0Ch],0FFFFh
mov word [edx+10h],1000h
mov [code_type],16
jmp format_defined
mark_mz_relocation:
push eax ebx
inc word [number_of_relocations]
jz format_limitations_exceeded
mov ebx,[free_additional_memory]
mov eax,edi
sub eax,[code_start]
mov [ebx],ax
shr eax,16
shl ax,12
mov [ebx+2],ax
cmp word [ebx],0FFFFh
jne mz_relocation_ok
inc word [ebx+2]
sub word [ebx],10h
mz_relocation_ok:
add ebx,4
cmp ebx,[structures_buffer]
jae out_of_memory
mov [free_additional_memory],ebx
pop ebx eax
ret
mz_segment:
lods byte [esi]
cmp al,2
jne invalid_argument
lods dword [esi]
cmp eax,0Fh
jb invalid_use_of_symbol
je reserved_word_used_as_symbol
inc esi
mov ebx,eax
mov eax,edi
sub eax,[code_start]
mov ecx,0Fh
add eax,0Fh
and eax,1111b
sub ecx,eax
mov edx,edi
xor eax,eax
rep stos byte [edi]
mov eax,edx
call undefined_data
push ebx
call create_addressing_space
pop ebx
mov eax,edi
sub eax,[code_start]
shr eax,4
cmp eax,10000h
jae value_out_of_range
mov edx,eax
mov al,16
cmp byte [esi],13h
jne segment_type_ok
inc esi
lods byte [esi]
segment_type_ok:
mov [code_type],al
mov eax,edx
mov ch,1
mov [address_sign],0
xor edx,edx
xor ebp,ebp
mov [label_size],0
mov [address_symbol],edx
jmp make_free_label
mz_entry:
lods byte [esi]
cmp al,'('
jne invalid_argument
call get_word_value
cmp [value_type],1
je initial_cs_ok
call recoverable_invalid_address
initial_cs_ok:
mov edx,[additional_memory]
mov [edx+16h],ax
lods byte [esi]
cmp al,':'
jne invalid_argument
lods byte [esi]
cmp al,'('
jne invalid_argument
ja invalid_address
call get_word_value
cmp [value_type],0
jne invalid_use_of_symbol
mov edx,[additional_memory]
mov [edx+14h],ax
jmp instruction_assembled
recoverable_invalid_address:
cmp [error_line],0
jne ignore_invalid_address
push [current_line]
pop [error_line]
mov [error],invalid_address
ignore_invalid_address:
ret
mz_stack:
lods byte [esi]
cmp al,'('
jne invalid_argument
call get_word_value
cmp byte [esi],':'
je stack_pointer
cmp ax,10h
jb invalid_value
cmp [value_type],0
jne invalid_use_of_symbol
mov edx,[additional_memory]
mov [edx+10h],ax
jmp instruction_assembled
stack_pointer:
cmp [value_type],1
je initial_ss_ok
call recoverable_invalid_address
initial_ss_ok:
mov edx,[additional_memory]
mov [edx+0Eh],ax
lods byte [esi]
cmp al,':'
jne invalid_argument
lods byte [esi]
cmp al,'('
jne invalid_argument
call get_word_value
cmp [value_type],0
jne invalid_use_of_symbol
mov edx,[additional_memory]
mov [edx+10h],ax
bts [format_flags],4
jmp instruction_assembled
mz_heap:
cmp [output_format],2
jne illegal_instruction
lods byte [esi]
call get_size_operator
cmp ah,1
je invalid_value
cmp ah,2
ja invalid_value
cmp al,'('
jne invalid_argument
call get_word_value
cmp [value_type],0
jne invalid_use_of_symbol
mov edx,[additional_memory]
mov [edx+0Ch],ax
jmp instruction_assembled
write_mz_header:
mov edx,[additional_memory]
bt [format_flags],4
jc mz_stack_ok
mov eax,[real_code_size]
dec eax
shr eax,4
inc eax
mov [edx+0Eh],ax
shl eax,4
movzx ecx,word [edx+10h]
add eax,ecx
mov [real_code_size],eax
mz_stack_ok:
mov edi,[free_additional_memory]
mov eax,[number_of_relocations]
shl eax,2
add eax,1Ch
sub edi,eax
xchg edi,[free_additional_memory]
mov ecx,0Fh
add eax,0Fh
and eax,1111b
sub ecx,eax
xor al,al
rep stos byte [edi]
sub edi,[free_additional_memory]
mov ecx,edi
shr edi,4
mov word [edx],'MZ' ; signature
mov [edx+8],di ; header size in paragraphs
mov eax,[number_of_relocations]
mov [edx+6],ax ; number of relocation entries
mov eax,[code_size]
add eax,ecx
mov esi,eax
shr esi,9
and eax,1FFh
inc si
or ax,ax
jnz mz_size_ok
dec si
mz_size_ok:
mov [edx+2],ax ; number of bytes in last page
mov [edx+4],si ; number of pages
mov eax,[real_code_size]
dec eax
shr eax,4
inc eax
mov esi,[code_size]
dec esi
shr esi,4
inc esi
sub eax,esi
mov [edx+0Ah],ax ; minimum memory in addition to code
add [edx+0Ch],ax ; maximum memory in addition to code
salc
mov ah,al
or [edx+0Ch],ax
mov word [edx+18h],1Ch ; offset of relocation table
add [written_size],ecx
call write
jc write_failed
ret
 
make_stub:
mov [stub_file],edx
or edx,edx
jnz stub_from_file
push esi
mov edx,edi
xor eax,eax
mov ecx,20h
rep stos dword [edi]
mov eax,40h+default_stub_end-default_stub
mov cx,100h+default_stub_end-default_stub
mov word [edx],'MZ'
mov byte [edx+4],1
mov word [edx+2],ax
mov byte [edx+8],4
mov byte [edx+0Ah],10h
mov word [edx+0Ch],0FFFFh
mov word [edx+10h],cx
mov word [edx+3Ch],ax
mov byte [edx+18h],40h
lea edi,[edx+40h]
mov esi,default_stub
mov ecx,default_stub_end-default_stub
rep movs byte [edi],[esi]
pop esi
jmp stub_ok
default_stub:
use16
push cs
pop ds
mov dx,stub_message-default_stub
mov ah,9
int 21h
mov ax,4C01h
int 21h
stub_message db 'This program cannot be run in DOS mode.',0Dh,0Ah,24h
rq 1
default_stub_end:
use32
stub_from_file:
push esi
mov esi,edx
call open_binary_file
mov edx,edi
mov ecx,1Ch
mov esi,edx
call read
jc binary_stub
cmp word [esi],'MZ'
jne binary_stub
add edi,1Ch
movzx ecx,word [esi+6]
add ecx,11b
and ecx,not 11b
add ecx,(40h-1Ch) shr 2
lea eax,[edi+ecx*4]
cmp edi,[tagged_blocks]
jae out_of_memory
xor eax,eax
rep stos dword [edi]
mov edx,40h
xchg dx,[esi+18h]
xor al,al
call lseek
movzx ecx,word [esi+6]
shl ecx,2
lea edx,[esi+40h]
call read
mov edx,edi
sub edx,esi
shr edx,4
xchg dx,[esi+8]
shl edx,4
xor al,al
call lseek
movzx ecx,word [esi+4]
dec ecx
shl ecx,9
movzx edx,word [esi+2]
test edx,edx
jnz stub_header_size_ok
mov dx,200h
stub_header_size_ok:
add ecx,edx
mov edx,edi
sub ecx,eax
je read_stub_code
jb stub_code_ok
push ecx
dec ecx
shr ecx,3
inc ecx
shl ecx,1
lea eax,[edi+ecx*4]
cmp eax,[tagged_blocks]
jae out_of_memory
xor eax,eax
rep stos dword [edi]
pop ecx
read_stub_code:
call read
stub_code_ok:
call close
mov edx,edi
sub edx,esi
mov ax,dx
and ax,1FFh
mov [esi+2],ax
dec edx
shr edx,9
inc edx
mov [esi+4],dx
mov eax,edi
sub eax,esi
mov [esi+3Ch],eax
pop esi
stub_ok:
ret
binary_stub:
mov esi,edi
mov ecx,40h shr 2
xor eax,eax
rep stos dword [edi]
mov al,2
xor edx,edx
call lseek
push eax
xor al,al
xor edx,edx
call lseek
mov ecx,[esp]
add ecx,40h+111b
and ecx,not 111b
mov ax,cx
and ax,1FFh
mov [esi+2],ax
lea eax,[ecx+1FFh]
shr eax,9
mov [esi+4],ax
mov [esi+3Ch],ecx
sub ecx,40h
mov eax,10000h
sub eax,ecx
jbe binary_heap_ok
shr eax,4
mov [esi+0Ah],ax
binary_heap_ok:
mov word [esi],'MZ'
mov byte [esi+8],4
mov ax,0FFFFh
mov [esi+0Ch],ax
dec ax
mov [esi+10h],ax
sub ax,0Eh
mov [esi+0Eh],ax
mov [esi+16h],ax
mov word [esi+14h],100h
mov byte [esi+18h],40h
mov eax,[tagged_blocks]
sub eax,ecx
cmp edi,eax
jae out_of_memory
mov edx,edi
shr ecx,2
xor eax,eax
rep stos dword [edi]
pop ecx
call read
call close
pop esi
ret
 
format_pe:
xor edx,edx
mov [machine],14Ch
mov [subsystem],3
mov [subsystem_version],3 + 10 shl 16
mov [image_base],400000h
and [image_base_high],0
test [format_flags],8
jz pe_settings
mov [machine],8664h
mov [subsystem_version],5 + 0 shl 16
pe_settings:
cmp byte [esi],84h
je get_stub_name
cmp byte [esi],80h
je get_pe_base
cmp byte [esi],1Bh
jne pe_settings_ok
lods byte [esi]
lods byte [esi]
test al,80h+40h
jz subsystem_setting
cmp al,80h
je dll_flag
cmp al,81h
je wdm_flag
cmp al,82h
je large_flag
cmp al,83h
je nx_flag
jmp pe_settings
dll_flag:
bts [format_flags],8
jc setting_already_specified
jmp pe_settings
wdm_flag:
bts [format_flags],9
jc setting_already_specified
jmp pe_settings
large_flag:
bts [format_flags],11
jc setting_already_specified
test [format_flags],8
jnz invalid_argument
jmp pe_settings
nx_flag:
bts [format_flags],12
jc setting_already_specified
jmp pe_settings
subsystem_setting:
bts [format_flags],7
jc setting_already_specified
and ax,3Fh
mov [subsystem],ax
cmp ax,10
jb subsystem_type_ok
or [format_flags],4
subsystem_type_ok:
cmp byte [esi],'('
jne pe_settings
inc esi
cmp byte [esi],'.'
jne invalid_value
inc esi
push edx
cmp byte [esi+11],0
jne invalid_value
cmp byte [esi+10],2
ja invalid_value
mov dx,[esi+8]
cmp dx,8000h
je zero_version
mov eax,[esi+4]
cmp dx,7
jg invalid_value
mov cx,7
sub cx,dx
mov eax,[esi+4]
shr eax,cl
mov ebx,eax
shr ebx,24
cmp bl,100
jae invalid_value
and eax,0FFFFFFh
mov ecx,100
mul ecx
shrd eax,edx,24
jnc version_value_ok
inc eax
version_value_ok:
shl eax,16
mov ax,bx
jmp subsystem_version_ok
zero_version:
xor eax,eax
subsystem_version_ok:
pop edx
add esi,13
mov [subsystem_version],eax
jmp pe_settings
get_pe_base:
bts [format_flags],10
jc setting_already_specified
lods word [esi]
cmp ah,'('
jne invalid_argument
cmp byte [esi],'.'
je invalid_value
push edx edi
add edi,[stub_size]
test [format_flags],4
jnz get_peplus_base
call get_dword_value
mov [image_base],eax
jmp pe_base_ok
get_peplus_base:
call get_qword_value
mov [image_base],eax
mov [image_base_high],edx
pe_base_ok:
pop edi edx
cmp [value_type],0
jne invalid_use_of_symbol
cmp byte [esi],84h
jne pe_settings_ok
get_stub_name:
lods byte [esi]
lods word [esi]
cmp ax,'('
jne invalid_argument
lods dword [esi]
mov edx,esi
add esi,eax
inc esi
pe_settings_ok:
mov ebp,[stub_size]
or ebp,ebp
jz make_pe_stub
cmp edx,[stub_file]
je pe_stub_ok
sub edi,[stub_size]
mov [code_start],edi
make_pe_stub:
call make_stub
mov eax,edi
sub eax,[code_start]
mov [stub_size],eax
mov [code_start],edi
mov ebp,eax
pe_stub_ok:
mov edx,edi
mov ecx,18h+0E0h
test [format_flags],4
jz zero_pe_header
add ecx,10h
zero_pe_header:
add ebp,ecx
shr ecx,2
xor eax,eax
rep stos dword [edi]
mov word [edx],'PE' ; signature
mov ax,[machine]
mov word [edx+4],ax
mov byte [edx+38h+1],10h ; section alignment
mov byte [edx+3Ch+1],2 ; file alignment
mov byte [edx+40h],1 ; OS version
mov eax,[subsystem_version]
mov [edx+48h],eax
mov ax,[subsystem]
mov [edx+5Ch],ax
cmp ax,1
jne pe_alignment_ok
mov eax,20h
mov dword [edx+38h],eax
mov dword [edx+3Ch],eax
pe_alignment_ok:
mov word [edx+1Ah],VERSION_MAJOR + VERSION_MINOR shl 8
test [format_flags],4
jnz init_peplus_specific
mov byte [edx+14h],0E0h ; size of optional header
mov dword [edx+16h],10B010Fh; flags and magic value
mov eax,[image_base]
mov [edx+34h],eax
mov byte [edx+60h+1],10h ; stack reserve
mov byte [edx+64h+1],10h ; stack commit
mov byte [edx+68h+2],1 ; heap reserve
mov byte [edx+74h],16 ; number of directories
jmp pe_header_ok
init_peplus_specific:
mov byte [edx+14h],0F0h ; size of optional header
mov dword [edx+16h],20B002Fh; flags and magic value
mov eax,[image_base]
mov [edx+30h],eax
mov eax,[image_base_high]
mov [edx+34h],eax
mov byte [edx+60h+1],10h ; stack reserve
mov byte [edx+68h+1],10h ; stack commit
mov byte [edx+70h+2],1 ; heap reserve
mov byte [edx+84h],16 ; number of directories
pe_header_ok:
bsf ecx,[edx+3Ch]
imul ebx,[number_of_sections],28h
or ebx,ebx
jnz reserve_space_for_section_headers
mov ebx,28h
reserve_space_for_section_headers:
add ebx,ebp
dec ebx
shr ebx,cl
inc ebx
shl ebx,cl
sub ebx,ebp
mov ecx,ebx
mov eax,[tagged_blocks]
sub eax,ecx
cmp edi,eax
jae out_of_memory
shr ecx,2
xor eax,eax
rep stos dword [edi]
mov eax,edi
sub eax,[code_start]
add eax,[stub_size]
mov [edx+54h],eax ; size of headers
mov ecx,[edx+38h]
dec ecx
add eax,ecx
not ecx
and eax,ecx
bt [format_flags],8
jc pe_entry_init_ok
mov [edx+28h],eax ; entry point rva
pe_entry_init_ok:
and [number_of_sections],0
movzx ebx,word [edx+14h]
lea ebx,[edx+18h+ebx]
mov [current_section],ebx
mov dword [ebx],'.fla'
mov dword [ebx+4],'t'
mov [ebx+14h],edi
mov [ebx+0Ch],eax
mov dword [ebx+24h],0E0000060h
xor ecx,ecx
xor bl,bl
not eax
not ecx
not bl
add eax,1
adc ecx,0
adc bl,0
add eax,edi
adc ecx,0
adc bl,0
test [format_flags],4
jnz peplus_org
sub eax,[edx+34h]
sbb ecx,0
sbb bl,0
jmp pe_org_ok
peplus_org:
sub eax,[edx+30h]
sbb ecx,[edx+34h]
sbb bl,0
pe_org_ok:
test [format_flags],8
jnz pe64_code
mov bh,2
mov [code_type],32
jmp pe_code_type_ok
pe64_code:
mov bh,4
mov [code_type],64
pe_code_type_ok:
bt [resolver_flags],0
jc pe_labels_type_ok
xor bh,bh
pe_labels_type_ok:
push eax ebx
call init_addressing_space
mov ebp,ebx
pop ebx eax
mov [ds:ebp],eax
mov [ds:ebp+4],ecx
mov [ds:ebp+8],bx
mov [ds:ebp+18h],edi
bt [format_flags],8
jnc dll_flag_ok
or byte [edx+16h+1],20h
dll_flag_ok:
bt [format_flags],9
jnc wdm_flag_ok
or byte [edx+5Eh+1],20h
wdm_flag_ok:
bt [format_flags],11
jnc large_flag_ok
or byte [edx+16h],20h
large_flag_ok:
bt [format_flags],12
jnc nx_ok
or byte [edx+5Eh+1],1
nx_ok:
jmp format_defined
pe_section:
call close_pe_section
push eax ebx
call create_addressing_space
mov ebp,ebx
pop ebx eax
bts [format_flags],5
lea ecx,[ebx+28h]
add edx,[edx+54h]
sub edx,[stub_size]
cmp ecx,edx
jbe new_section
lea ebx,[edx-28h]
or [next_pass_needed],-1
push edi
mov edi,ebx
mov ecx,28h shr 4
xor eax,eax
rep stos dword [edi]
pop edi
new_section:
mov [ebx+0Ch],eax
lods word [esi]
cmp ax,'('
jne invalid_argument
lea edx,[esi+4]
mov ecx,[esi]
lea esi,[esi+4+ecx+1]
cmp ecx,8
ja name_too_long
xor eax,eax
mov [ebx],eax
mov [ebx+4],eax
push esi edi
mov edi,ebx
mov esi,edx
rep movs byte [edi],[esi]
pop edi esi
and dword [ebx+24h],0
mov [ebx+14h],edi
mov edx,[code_start]
mov eax,edi
xor ecx,ecx
sub eax,[ebx+0Ch]
sbb ecx,0
sbb byte [ds:ebp+8],0
mov byte [ds:ebp+9],2
mov [code_type],32
test [format_flags],8
jz pe_section_code_type_ok
mov byte [ds:ebp+9],4
mov [code_type],64
pe_section_code_type_ok:
test [format_flags],4
jnz peplus_section_org
sub eax,[edx+34h]
sbb ecx,0
sbb byte [ds:ebp+8],0
bt [resolver_flags],0
jc pe_section_org_ok
mov byte [ds:ebp+9],0
jmp pe_section_org_ok
peplus_section_org:
sub eax,[edx+30h]
sbb ecx,[edx+34h]
sbb byte [ds:ebp+8],0
bt [resolver_flags],0
jc pe_section_org_ok
mov byte [ds:ebp+9],0
pe_section_org_ok:
mov [ds:ebp],eax
mov [ds:ebp+4],ecx
mov [ds:ebp+18h],edi
get_section_flags:
lods byte [esi]
cmp al,1Ah
je set_directory
cmp al,19h
je section_flag
dec esi
jmp instruction_assembled
set_directory:
movzx eax,byte [esi]
inc esi
mov ecx,ebx
test [format_flags],4
jnz peplus_directory
xchg ecx,[edx+78h+eax*8]
mov dword [edx+78h+eax*8+4],-1
jmp pe_directory_set
peplus_directory:
xchg ecx,[edx+88h+eax*8]
mov dword [edx+88h+eax*8+4],-1
pe_directory_set:
or ecx,ecx
jnz data_already_defined
push ebx edx
call generate_pe_data
pop edx ebx
jmp get_section_flags
section_flag:
lods byte [esi]
cmp al,9
je invalid_argument
cmp al,11
je invalid_argument
mov cl,al
mov eax,1
shl eax,cl
test dword [ebx+24h],eax
jnz setting_already_specified
or dword [ebx+24h],eax
jmp get_section_flags
close_pe_section:
mov ebx,[current_section]
mov edx,[code_start]
mov eax,edi
sub eax,[ebx+14h]
jnz finish_section
bt [format_flags],5
jc finish_section
mov eax,[ebx+0Ch]
ret
finish_section:
mov [ebx+8],eax
cmp edi,[undefined_data_end]
jne align_section
cmp dword [edx+38h],1000h
jb align_section
mov edi,[undefined_data_start]
align_section:
and [undefined_data_end],0
mov ebp,edi
sub ebp,[ebx+14h]
mov ecx,[edx+3Ch]
dec ecx
lea eax,[ebp+ecx]
not ecx
and eax,ecx
mov [ebx+10h],eax
sub eax,ebp
mov ecx,eax
xor al,al
rep stos byte [edi]
mov eax,[code_start]
sub eax,[stub_size]
sub [ebx+14h],eax
mov ecx,[ebx+10h]
test byte [ebx+24h],20h
jz pe_code_sum_ok
add [edx+1Ch],ecx
cmp dword [edx+2Ch],0
jne pe_code_sum_ok
mov eax,[ebx+0Ch]
mov [edx+2Ch],eax
pe_code_sum_ok:
test byte [ebx+24h],40h
jz pe_data_sum_ok
add [edx+20h],ecx
test [format_flags],4
jnz pe_data_sum_ok
cmp dword [edx+30h],0
jne pe_data_sum_ok
mov eax,[ebx+0Ch]
mov [edx+30h],eax
pe_data_sum_ok:
mov eax,[ebx+8]
or eax,eax
jz udata_ok
cmp dword [ebx+10h],0
jne udata_ok
or byte [ebx+24h],80h
add [edx+24h],ecx
udata_ok:
mov ecx,[edx+38h]
dec ecx
add eax,ecx
not ecx
and eax,ecx
add eax,[ebx+0Ch]
add ebx,28h
mov [current_section],ebx
inc word [number_of_sections]
jz format_limitations_exceeded
ret
data_directive:
cmp [output_format],3
jne illegal_instruction
lods byte [esi]
cmp al,1Ah
je predefined_data_type
cmp al,'('
jne invalid_argument
call get_byte_value
cmp al,16
jb data_type_ok
jmp invalid_value
predefined_data_type:
movzx eax,byte [esi]
inc esi
data_type_ok:
mov ebx,[current_section]
mov ecx,edi
sub ecx,[ebx+14h]
add ecx,[ebx+0Ch]
mov edx,[code_start]
test [format_flags],4
jnz peplus_data
xchg ecx,[edx+78h+eax*8]
jmp init_pe_data
peplus_data:
xchg ecx,[edx+88h+eax*8]
init_pe_data:
or ecx,ecx
jnz data_already_defined
call allocate_structure_data
mov word [ebx],data_directive-instruction_handler
mov [ebx+2],al
mov edx,[current_line]
mov [ebx+4],edx
call generate_pe_data
jmp instruction_assembled
end_data:
cmp [output_format],3
jne illegal_instruction
call find_structure_data
jc unexpected_instruction
movzx eax,byte [ebx+2]
mov edx,[current_section]
mov ecx,edi
sub ecx,[edx+14h]
add ecx,[edx+0Ch]
mov edx,[code_start]
test [format_flags],4
jnz end_peplus_data
sub ecx,[edx+78h+eax*8]
mov [edx+78h+eax*8+4],ecx
jmp remove_structure_data
end_peplus_data:
sub ecx,[edx+88h+eax*8]
mov [edx+88h+eax*8+4],ecx
jmp remove_structure_data
pe_entry:
lods byte [esi]
cmp al,'('
jne invalid_argument
cmp byte [esi],'.'
je invalid_value
test [format_flags],8
jnz pe64_entry
call get_dword_value
mov bl,2
bt [resolver_flags],0
jc check_pe_entry_label_type
xor bl,bl
check_pe_entry_label_type:
cmp [value_type],bl
je pe_entry_ok
call recoverable_invalid_address
pe_entry_ok:
cdq
test [format_flags],4
jnz pe64_entry_type_ok
mov edx,[code_start]
sub eax,[edx+34h]
mov [edx+28h],eax
jmp instruction_assembled
pe64_entry:
call get_qword_value
mov bl,4
bt [resolver_flags],0
jc check_pe64_entry_label_type
xor bl,bl
check_pe64_entry_label_type:
cmp [value_type],bl
je pe64_entry_type_ok
call recoverable_invalid_address
pe64_entry_type_ok:
mov ecx,[code_start]
sub eax,[ecx+30h]
sbb edx,[ecx+34h]
jz pe64_entry_range_ok
call recoverable_overflow
pe64_entry_range_ok:
mov [ecx+28h],eax
jmp instruction_assembled
pe_stack:
lods byte [esi]
cmp al,'('
jne invalid_argument
cmp byte [esi],'.'
je invalid_value
test [format_flags],4
jnz peplus_stack
call get_count_value
mov edx,[code_start]
mov [edx+60h],eax
cmp byte [esi],','
jne default_stack_commit
lods byte [esi]
lods byte [esi]
cmp al,'('
jne invalid_argument
cmp byte [esi],'.'
je invalid_value
call get_count_value
mov edx,[code_start]
mov [edx+64h],eax
cmp eax,[edx+60h]
ja value_out_of_range
jmp instruction_assembled
default_stack_commit:
mov dword [edx+64h],1000h
mov eax,[edx+60h]
cmp eax,1000h
ja instruction_assembled
mov dword [edx+64h],eax
jmp instruction_assembled
peplus_stack:
call get_qword_value
cmp [value_type],0
jne invalid_use_of_symbol
mov ecx,[code_start]
mov [ecx+60h],eax
mov [ecx+64h],edx
cmp byte [esi],','
jne default_peplus_stack_commit
lods byte [esi]
lods byte [esi]
cmp al,'('
jne invalid_argument
cmp byte [esi],'.'
je invalid_value
call get_qword_value
cmp [value_type],0
jne invalid_use_of_symbol
mov ecx,[code_start]
mov [ecx+68h],eax
mov [ecx+6Ch],edx
cmp edx,[ecx+64h]
ja value_out_of_range
jb instruction_assembled
cmp eax,[ecx+60h]
ja value_out_of_range
jmp instruction_assembled
default_peplus_stack_commit:
mov dword [ecx+68h],1000h
cmp dword [ecx+64h],0
jne instruction_assembled
mov eax,[ecx+60h]
cmp eax,1000h
ja instruction_assembled
mov dword [ecx+68h],eax
jmp instruction_assembled
pe_heap:
lods byte [esi]
cmp al,'('
jne invalid_argument
cmp byte [esi],'.'
je invalid_value
test [format_flags],4
jnz peplus_heap
call get_count_value
mov edx,[code_start]
mov [edx+68h],eax
cmp byte [esi],','
jne instruction_assembled
lods byte [esi]
lods byte [esi]
cmp al,'('
jne invalid_argument
cmp byte [esi],'.'
je invalid_value
call get_count_value
mov edx,[code_start]
mov [edx+6Ch],eax
cmp eax,[edx+68h]
ja value_out_of_range
jmp instruction_assembled
peplus_heap:
call get_qword_value
cmp [value_type],0
jne invalid_use_of_symbol
mov ecx,[code_start]
mov [ecx+70h],eax
mov [ecx+74h],edx
cmp byte [esi],','
jne instruction_assembled
lods byte [esi]
lods byte [esi]
cmp al,'('
jne invalid_argument
cmp byte [esi],'.'
je invalid_value
call get_qword_value
cmp [value_type],0
jne invalid_use_of_symbol
mov ecx,[code_start]
mov [ecx+78h],eax
mov [ecx+7Ch],edx
cmp edx,[ecx+74h]
ja value_out_of_range
jb instruction_assembled
cmp eax,[ecx+70h]
ja value_out_of_range
jmp instruction_assembled
mark_pe_relocation:
push eax ebx
test [format_flags],4
jz check_standard_pe_relocation_type
cmp [value_type],4
je pe_relocation_type_ok
check_standard_pe_relocation_type:
cmp [value_type],2
je pe_relocation_type_ok
call recoverable_misuse
pe_relocation_type_ok:
mov ebx,[current_section]
mov eax,edi
sub eax,[ebx+14h]
add eax,[ebx+0Ch]
mov ebx,[free_additional_memory]
inc [number_of_relocations]
add ebx,5
cmp ebx,[structures_buffer]
jae out_of_memory
mov [free_additional_memory],ebx
mov [ebx-5],eax
cmp [value_type],2
je fixup_32bit
mov byte [ebx-1],0Ah
jmp fixup_ok
fixup_32bit:
mov byte [ebx-1],3
fixup_ok:
pop ebx eax
ret
generate_pe_data:
cmp al,2
je make_pe_resource
cmp al,5
je make_pe_fixups
ret
make_pe_fixups:
mov edx,[code_start]
and byte [edx+16h],not 1
or byte [edx+5Eh],40h
bts [resolver_flags],0
jc fixups_ready
or [next_pass_needed],-1
fixups_ready:
and [last_fixup_base],0
call make_fixups
xchg eax,[actual_fixups_size]
sub eax,[actual_fixups_size]
ja reserve_forward_fixups
xor eax,eax
reserve_forward_fixups:
mov [reserved_fixups],edi
add edi,eax
mov [reserved_fixups_size],eax
ret
make_fixups:
push esi
xor ecx,ecx
xchg ecx,[number_of_relocations]
mov esi,[free_additional_memory]
lea eax,[ecx*5]
sub esi,eax
mov [free_additional_memory],esi
mov edx,[last_fixup_base]
mov ebx,[last_fixup_header]
mov ebp,edi
jecxz fixups_done
make_fixup:
cmp [esi],edx
jb store_fixup
mov eax,edi
sub eax,ebp
test eax,11b
jz fixups_block
xor ax,ax
stos word [edi]
add dword [ebx],2
fixups_block:
mov eax,edx
add edx,1000h
cmp [esi],edx
jae fixups_block
stos dword [edi]
mov ebx,edi
mov eax,8
stos dword [edi]
store_fixup:
add dword [ebx],2
mov ah,[esi+1]
and ah,0Fh
mov al,[esi+4]
shl al,4
or ah,al
mov al,[esi]
stos word [edi]
add esi,5
loop make_fixup
fixups_done:
mov [last_fixup_base],edx
mov [last_fixup_header],ebx
pop esi
mov eax,edi
sub eax,ebp
ret
make_pe_resource:
cmp byte [esi],82h
jne resource_done
inc esi
lods word [esi]
cmp ax,'('
jne invalid_argument
lods dword [esi]
mov edx,esi
lea esi,[esi+eax+1]
cmp [next_pass_needed],0
je resource_from_file
cmp [current_pass],0
jne reserve_space_for_resource
and [resource_size],0
reserve_space_for_resource:
add edi,[resource_size]
cmp edi,[tagged_blocks]
ja out_of_memory
jmp resource_done
resource_from_file:
push esi
mov esi,edx
call open_binary_file
push ebx
mov esi,[free_additional_memory]
lea eax,[esi+20h]
cmp eax,[structures_buffer]
ja out_of_memory
mov edx,esi
mov ecx,20h
call read
jc invalid_file_format
xor eax,eax
cmp [esi],eax
jne invalid_file_format
mov ax,0FFFFh
cmp [esi+8],eax
jne invalid_file_format
cmp [esi+12],eax
jne invalid_file_format
mov eax,20h
cmp [esi+4],eax
jne invalid_file_format
read_resource_headers:
test eax,11b
jz resource_file_alignment_ok
mov edx,4
and eax,11b
sub edx,eax
mov al,1
call lseek
jc resource_headers_ok
resource_file_alignment_ok:
mov [esi],eax
lea edx,[esi+12]
mov ecx,8
call read
jc resource_headers_ok
mov ecx,[esi+16]
add [esi],ecx
lea edx,[esi+20]
sub ecx,8
mov [esi+16],ecx
lea eax,[edx+ecx]
cmp eax,[structures_buffer]
ja out_of_memory
call read
jc invalid_file_format
mov edx,[esi]
add edx,[esi+12]
mov eax,[esi+16]
lea ecx,[esi+20]
lea esi,[ecx+eax]
add ecx,2
cmp word [ecx-2],0FFFFh
je resource_header_type_ok
check_resource_header_type:
cmp ecx,esi
jae invalid_file_format
cmp word [ecx],0
je resource_header_type_ok
add ecx,2
jmp check_resource_header_type
resource_header_type_ok:
add ecx,2
cmp word [ecx],0FFFFh
je resource_header_name_ok
check_resource_header_name:
cmp ecx,esi
jae invalid_file_format
cmp word [ecx],0
je resource_header_name_ok
add ecx,2
jmp check_resource_header_name
resource_header_name_ok:
xor al,al
call lseek
jnc read_resource_headers
resource_headers_ok:
cmp esi,[free_additional_memory]
je invalid_file_format
xor eax,eax
mov [esi],eax
mov [resource_data],edi
lea eax,[edi+16]
cmp eax,[tagged_blocks]
jae out_of_memory
xor eax,eax
stos dword [edi]
call make_timestamp
stos dword [edi]
xor eax,eax
stos dword [edi]
stos dword [edi]
xor ebx,ebx
make_type_name_directory:
mov esi,[free_additional_memory]
xor edx,edx
find_type_name:
cmp dword [esi],0
je type_name_ok
add esi,20
cmp word [esi],0FFFFh
je check_next_type_name
or ebx,ebx
jz check_this_type_name
xor ecx,ecx
compare_with_previous_type_name:
mov ax,[esi+ecx]
cmp ax,[ebx+ecx]
ja check_this_type_name
jb check_next_type_name
add ecx,2
mov ax,[esi+ecx]
or ax,[ebx+ecx]
jnz compare_with_previous_type_name
jmp check_next_type_name
check_this_type_name:
or edx,edx
jz type_name_found
xor ecx,ecx
compare_with_current_type_name:
mov ax,[esi+ecx]
cmp ax,[edx+ecx]
ja check_next_type_name
jb type_name_found
add ecx,2
mov ax,[esi+ecx]
or ax,[edx+ecx]
jnz compare_with_current_type_name
jmp same_type_name
type_name_found:
mov edx,esi
same_type_name:
mov [esi-16],edi
check_next_type_name:
mov eax,[esi-4]
add esi,eax
jmp find_type_name
type_name_ok:
or edx,edx
jz type_name_directory_done
mov ebx,edx
make_type_name_entry:
mov eax,[resource_data]
inc word [eax+12]
lea eax,[edi+8]
cmp eax,[tagged_blocks]
jae out_of_memory
mov eax,ebx
stos dword [edi]
xor eax,eax
stos dword [edi]
jmp make_type_name_directory
type_name_directory_done:
mov ebx,-1
make_type_id_directory:
mov esi,[free_additional_memory]
mov edx,10000h
find_type_id:
cmp dword [esi],0
je type_id_ok
add esi,20
cmp word [esi],0FFFFh
jne check_next_type_id
movzx eax,word [esi+2]
cmp eax,ebx
jle check_next_type_id
cmp eax,edx
jg check_next_type_id
mov edx,eax
mov [esi-16],edi
check_next_type_id:
mov eax,[esi-4]
add esi,eax
jmp find_type_id
type_id_ok:
cmp edx,10000h
je type_id_directory_done
mov ebx,edx
make_type_id_entry:
mov eax,[resource_data]
inc word [eax+14]
lea eax,[edi+8]
cmp eax,[tagged_blocks]
jae out_of_memory
mov eax,ebx
stos dword [edi]
xor eax,eax
stos dword [edi]
jmp make_type_id_directory
type_id_directory_done:
mov esi,[resource_data]
add esi,10h
mov ecx,[esi-4]
or cx,cx
jz resource_directories_ok
make_resource_directories:
push ecx
push edi
mov edx,edi
sub edx,[resource_data]
bts edx,31
mov [esi+4],edx
lea eax,[edi+16]
cmp eax,[tagged_blocks]
jae out_of_memory
xor eax,eax
stos dword [edi]
call make_timestamp
stos dword [edi]
xor eax,eax
stos dword [edi]
stos dword [edi]
mov ebp,esi
xor ebx,ebx
make_resource_name_directory:
mov esi,[free_additional_memory]
xor edx,edx
find_resource_name:
cmp dword [esi],0
je resource_name_ok
push esi
cmp [esi+4],ebp
jne check_next_resource_name
add esi,20
call skip_resource_name
cmp word [esi],0FFFFh
je check_next_resource_name
or ebx,ebx
jz check_this_resource_name
xor ecx,ecx
compare_with_previous_resource_name:
mov ax,[esi+ecx]
cmp ax,[ebx+ecx]
ja check_this_resource_name
jb check_next_resource_name
add ecx,2
mov ax,[esi+ecx]
or ax,[ebx+ecx]
jnz compare_with_previous_resource_name
jmp check_next_resource_name
skip_resource_name:
cmp word [esi],0FFFFh
jne skip_unicode_string
add esi,4
ret
skip_unicode_string:
add esi,2
cmp word [esi-2],0
jne skip_unicode_string
ret
check_this_resource_name:
or edx,edx
jz resource_name_found
xor ecx,ecx
compare_with_current_resource_name:
mov ax,[esi+ecx]
cmp ax,[edx+ecx]
ja check_next_resource_name
jb resource_name_found
add ecx,2
mov ax,[esi+ecx]
or ax,[edx+ecx]
jnz compare_with_current_resource_name
jmp same_resource_name
resource_name_found:
mov edx,esi
same_resource_name:
mov eax,[esp]
mov [eax+8],edi
check_next_resource_name:
pop esi
mov eax,[esi+16]
lea esi,[esi+20+eax]
jmp find_resource_name
resource_name_ok:
or edx,edx
jz resource_name_directory_done
mov ebx,edx
make_resource_name_entry:
mov eax,[esp]
inc word [eax+12]
lea eax,[edi+8]
cmp eax,[tagged_blocks]
jae out_of_memory
mov eax,ebx
stos dword [edi]
xor eax,eax
stos dword [edi]
jmp make_resource_name_directory
resource_name_directory_done:
mov ebx,-1
make_resource_id_directory:
mov esi,[free_additional_memory]
mov edx,10000h
find_resource_id:
cmp dword [esi],0
je resource_id_ok
push esi
cmp [esi+4],ebp
jne check_next_resource_id
add esi,20
call skip_resource_name
cmp word [esi],0FFFFh
jne check_next_resource_id
movzx eax,word [esi+2]
cmp eax,ebx
jle check_next_resource_id
cmp eax,edx
jg check_next_resource_id
mov edx,eax
mov eax,[esp]
mov [eax+8],edi
check_next_resource_id:
pop esi
mov eax,[esi+16]
lea esi,[esi+20+eax]
jmp find_resource_id
resource_id_ok:
cmp edx,10000h
je resource_id_directory_done
mov ebx,edx
make_resource_id_entry:
mov eax,[esp]
inc word [eax+14]
lea eax,[edi+8]
cmp eax,[tagged_blocks]
jae out_of_memory
mov eax,ebx
stos dword [edi]
xor eax,eax
stos dword [edi]
jmp make_resource_id_directory
resource_id_directory_done:
pop eax
mov esi,ebp
pop ecx
add esi,8
dec cx
jnz make_resource_directories
resource_directories_ok:
shr ecx,16
jnz make_resource_directories
mov esi,[resource_data]
add esi,10h
movzx eax,word [esi-4]
movzx edx,word [esi-2]
add eax,edx
lea esi,[esi+eax*8]
push edi ; address of language directories
update_resource_directories:
cmp esi,[esp]
je resource_directories_updated
add esi,10h
mov ecx,[esi-4]
or cx,cx
jz language_directories_ok
make_language_directories:
push ecx
push edi
mov edx,edi
sub edx,[resource_data]
bts edx,31
mov [esi+4],edx
lea eax,[edi+16]
cmp eax,[tagged_blocks]
jae out_of_memory
xor eax,eax
stos dword [edi]
call make_timestamp
stos dword [edi]
xor eax,eax
stos dword [edi]
stos dword [edi]
mov ebp,esi
mov ebx,-1
make_language_id_directory:
mov esi,[free_additional_memory]
mov edx,10000h
find_language_id:
cmp dword [esi],0
je language_id_ok
push esi
cmp [esi+8],ebp
jne check_next_language_id
add esi,20
mov eax,esi
call skip_resource_name
call skip_resource_name
neg eax
add eax,esi
and eax,11b
add esi,eax
get_language_id:
movzx eax,word [esi+6]
cmp eax,ebx
jle check_next_language_id
cmp eax,edx
jge check_next_language_id
mov edx,eax
mov eax,[esp]
mov dword [value],eax
check_next_language_id:
pop esi
mov eax,[esi+16]
lea esi,[esi+20+eax]
jmp find_language_id
language_id_ok:
cmp edx,10000h
je language_id_directory_done
mov ebx,edx
make_language_id_entry:
mov eax,[esp]
inc word [eax+14]
lea eax,[edi+8]
cmp eax,[tagged_blocks]
jae out_of_memory
mov eax,ebx
stos dword [edi]
mov eax,dword [value]
stos dword [edi]
jmp make_language_id_directory
language_id_directory_done:
pop eax
mov esi,ebp
pop ecx
add esi,8
dec cx
jnz make_language_directories
language_directories_ok:
shr ecx,16
jnz make_language_directories
jmp update_resource_directories
resource_directories_updated:
mov esi,[resource_data]
push edi
make_name_strings:
add esi,10h
movzx eax,word [esi-2]
movzx ecx,word [esi-4]
add eax,ecx
lea eax,[esi+eax*8]
push eax
or ecx,ecx
jz string_entries_processed
process_string_entries:
push ecx
mov edx,edi
sub edx,[resource_data]
bts edx,31
xchg [esi],edx
mov ebx,edi
xor ax,ax
stos word [edi]
copy_string_data:
lea eax,[edi+2]
cmp eax,[tagged_blocks]
jae out_of_memory
mov ax,[edx]
or ax,ax
jz string_data_copied
stos word [edi]
inc word [ebx]
add edx,2
jmp copy_string_data
string_data_copied:
add esi,8
pop ecx
loop process_string_entries
string_entries_processed:
pop esi
cmp esi,[esp]
jb make_name_strings
mov eax,edi
sub eax,[resource_data]
test al,11b
jz resource_strings_alignment_ok
xor ax,ax
stos word [edi]
resource_strings_alignment_ok:
pop edx
pop ebx ; address of language directories
mov ebp,edi
update_language_directories:
add ebx,10h
movzx eax,word [ebx-2]
movzx ecx,word [ebx-4]
add ecx,eax
make_data_records:
push ecx
mov esi,edi
sub esi,[resource_data]
xchg esi,[ebx+4]
lea eax,[edi+16]
cmp eax,[tagged_blocks]
jae out_of_memory
mov eax,esi
stos dword [edi]
mov eax,[esi+12]
stos dword [edi]
xor eax,eax
stos dword [edi]
stos dword [edi]
pop ecx
add ebx,8
loop make_data_records
cmp ebx,edx
jb update_language_directories
pop ebx ; file handle
mov esi,ebp
mov ebp,edi
update_data_records:
push ebp
mov ecx,edi
mov eax,[current_section]
sub ecx,[eax+14h]
add ecx,[eax+0Ch]
xchg ecx,[esi]
mov edx,[ecx]
xor al,al
call lseek
mov edx,edi
mov ecx,[esi+4]
add edi,ecx
cmp edi,[tagged_blocks]
ja out_of_memory
call read
mov eax,edi
sub eax,[resource_data]
and eax,11b
jz resource_data_alignment_ok
mov ecx,4
sub ecx,eax
xor al,al
rep stos byte [edi]
resource_data_alignment_ok:
pop ebp
add esi,16
cmp esi,ebp
jb update_data_records
pop esi
call close
mov eax,edi
sub eax,[resource_data]
mov [resource_size],eax
resource_done:
ret
close_pe:
call close_pe_section
mov edx,[code_start]
mov [edx+50h],eax
call make_timestamp
mov edx,[code_start]
mov [edx+8],eax
mov eax,[number_of_sections]
mov [edx+6],ax
imul eax,28h
movzx ecx,word [edx+14h]
lea eax,[eax+18h+ecx]
add eax,[stub_size]
mov ecx,[edx+3Ch]
dec ecx
add eax,ecx
not ecx
and eax,ecx
cmp eax,[edx+54h]
je pe_sections_ok
or [next_pass_needed],-1
pe_sections_ok:
xor ecx,ecx
add edx,78h
test [format_flags],4
jz process_directories
add edx,10h
process_directories:
mov eax,[edx+ecx*8]
or eax,eax
jz directory_ok
cmp dword [edx+ecx*8+4],-1
jne directory_ok
section_data:
mov ebx,[edx+ecx*8]
mov eax,[ebx+0Ch]
mov [edx+ecx*8],eax ; directory rva
mov eax,[ebx+8]
mov [edx+ecx*8+4],eax ; directory size
directory_ok:
inc cl
cmp cl,10h
jb process_directories
cmp dword [edx+5*8],0
jne finish_pe_relocations
mov eax,[number_of_relocations]
shl eax,2
sub [free_additional_memory],eax
btr [resolver_flags],0
jnc pe_relocations_ok
or [next_pass_needed],-1
jmp pe_relocations_ok
finish_pe_relocations:
push edi
mov edi,[reserved_fixups]
call make_fixups
pop edi
add [actual_fixups_size],eax
cmp eax,[reserved_fixups_size]
je pe_relocations_ok
or [next_pass_needed],-1
pe_relocations_ok:
mov ebx,[code_start]
sub ebx,[stub_size]
mov ecx,edi
sub ecx,ebx
mov ebp,ecx
shr ecx,1
xor eax,eax
cdq
calculate_checksum:
mov dx,[ebx]
add eax,edx
mov dx,ax
shr eax,16
add eax,edx
add ebx,2
loop calculate_checksum
add eax,ebp
mov ebx,[code_start]
mov [ebx+58h],eax
ret
 
format_coff:
mov eax,[additional_memory]
mov [symbols_stream],eax
mov ebx,eax
add eax,20h
cmp eax,[structures_buffer]
jae out_of_memory
mov [free_additional_memory],eax
xor eax,eax
mov [ebx],al
mov [ebx+4],eax
mov [ebx+8],edi
mov al,4
mov [ebx+10h],eax
mov al,60h
bt [format_flags],0
jnc flat_section_flags_ok
or eax,0E0000000h
flat_section_flags_ok:
mov dword [ebx+14h],eax
mov [current_section],ebx
xor eax,eax
mov [number_of_sections],eax
mov edx,ebx
call init_addressing_space
mov [ebx+14h],edx
mov byte [ebx+9],2
mov [code_type],32
test [format_flags],8
jz format_defined
mov byte [ebx+9],4
mov [code_type],64
jmp format_defined
coff_section:
call close_coff_section
mov ebx,[free_additional_memory]
lea eax,[ebx+20h]
cmp eax,[structures_buffer]
jae out_of_memory
mov [free_additional_memory],eax
mov [current_section],ebx
inc [number_of_sections]
xor eax,eax
mov [ebx],al
mov [ebx+8],edi
mov [ebx+10h],eax
mov [ebx+14h],eax
mov edx,ebx
call create_addressing_space
xchg edx,ebx
mov [edx+14h],ebx
mov byte [edx+9],2
test [format_flags],8
jz coff_labels_type_ok
mov byte [edx+9],4
coff_labels_type_ok:
lods word [esi]
cmp ax,'('
jne invalid_argument
mov [ebx+4],esi
mov ecx,[esi]
lea esi,[esi+4+ecx+1]
cmp ecx,8
ja name_too_long
coff_section_flags:
cmp byte [esi],8Ch
je coff_section_alignment
cmp byte [esi],19h
jne coff_section_settings_ok
inc esi
lods byte [esi]
bt [format_flags],0
jc coff_section_flag_ok
cmp al,7
ja invalid_argument
coff_section_flag_ok:
mov cl,al
mov eax,1
shl eax,cl
test dword [ebx+14h],eax
jnz setting_already_specified
or dword [ebx+14h],eax
jmp coff_section_flags
coff_section_alignment:
bt [format_flags],0
jnc invalid_argument
inc esi
lods byte [esi]
cmp al,'('
jne invalid_argument
cmp byte [esi],'.'
je invalid_value
push ebx
call get_count_value
pop ebx
mov edx,eax
dec edx
test eax,edx
jnz invalid_value
or eax,eax
jz invalid_value
cmp eax,2000h
ja invalid_value
bsf edx,eax
inc edx
shl edx,20
or [ebx+14h],edx
xchg [ebx+10h],eax
or eax,eax
jnz setting_already_specified
jmp coff_section_flags
coff_section_settings_ok:
cmp dword [ebx+10h],0
jne instruction_assembled
mov dword [ebx+10h],4
bt [format_flags],0
jnc instruction_assembled
or dword [ebx+14h],300000h
jmp instruction_assembled
close_coff_section:
mov ebx,[current_section]
mov eax,edi
mov edx,[ebx+8]
sub eax,edx
mov [ebx+0Ch],eax
xor eax,eax
xchg [undefined_data_end],eax
cmp eax,edi
jne coff_section_ok
cmp edx,[undefined_data_start]
jne coff_section_ok
mov edi,edx
or byte [ebx+14h],80h
coff_section_ok:
ret
mark_coff_relocation:
cmp [value_type],3
je coff_relocation_relative
push ebx eax
test [format_flags],8
jnz coff_64bit_relocation
mov al,6
cmp [value_type],2
je coff_relocation
cmp [value_type],5
jne invalid_use_of_symbol
inc al
jmp coff_relocation
coff_64bit_relocation:
mov al,1
cmp [value_type],4
je coff_relocation
mov al,2
cmp [value_type],2
je coff_relocation
cmp [value_type],5
jne invalid_use_of_symbol
inc al
jmp coff_relocation
coff_relocation_relative:
push ebx
bt [format_flags],0
jnc relative_ok
mov ebx,[current_section]
mov ebx,[ebx+8]
sub ebx,edi
sub eax,ebx
add eax,4
relative_ok:
mov ebx,[addressing_space]
push eax
mov al,20
test [format_flags],8
jnz relative_coff_64bit_relocation
cmp byte [ebx+9],2
jne invalid_use_of_symbol
jmp coff_relocation
relative_coff_64bit_relocation:
mov al,4
cmp byte [ebx+9],4
jne invalid_use_of_symbol
coff_relocation:
mov ebx,[free_additional_memory]
add ebx,0Ch
cmp ebx,[structures_buffer]
jae out_of_memory
mov [free_additional_memory],ebx
mov byte [ebx-0Ch],al
mov eax,[current_section]
mov eax,[eax+8]
neg eax
add eax,edi
mov [ebx-0Ch+4],eax
mov eax,[symbol_identifier]
mov [ebx-0Ch+8],eax
pop eax ebx
ret
close_coff:
call close_coff_section
cmp [next_pass_needed],0
je coff_closed
mov eax,[symbols_stream]
mov [free_additional_memory],eax
coff_closed:
ret
coff_formatter:
sub edi,[code_start]
mov [code_size],edi
call prepare_default_section
mov edi,[free_additional_memory]
mov ebx,edi
mov ecx,28h shr 2
imul ecx,[number_of_sections]
add ecx,14h shr 2
lea eax,[edi+ecx*4]
cmp eax,[structures_buffer]
jae out_of_memory
xor eax,eax
rep stos dword [edi]
mov word [ebx],14Ch
test [format_flags],8
jz coff_magic_ok
mov word [ebx],8664h
coff_magic_ok:
mov word [ebx+12h],104h
bt [format_flags],0
jnc coff_flags_ok
or byte [ebx+12h],80h
coff_flags_ok:
push ebx
call make_timestamp
pop ebx
mov [ebx+4],eax
mov eax,[number_of_sections]
mov [ebx+2],ax
mov esi,[symbols_stream]
xor eax,eax
xor ecx,ecx
enumerate_symbols:
cmp esi,[free_additional_memory]
je symbols_enumerated
mov dl,[esi]
or dl,dl
jz enumerate_section
cmp dl,0C0h
jae enumerate_public
cmp dl,80h
jae enumerate_extrn
add esi,0Ch
jmp enumerate_symbols
enumerate_section:
mov edx,eax
shl edx,8
mov [esi],edx
inc eax
inc ecx
mov [esi+1Eh],cx
add esi,20h
jmp enumerate_symbols
enumerate_public:
mov edx,eax
shl edx,8
mov dl,[esi]
mov [esi],edx
mov edx,[esi+8]
add esi,10h
inc eax
cmp byte [edx+11],0
je enumerate_symbols
mov edx,[edx+20]
cmp byte [edx],0C0h
jae enumerate_symbols
cmp byte [edx],80h
jb enumerate_symbols
inc eax
jmp enumerate_symbols
enumerate_extrn:
mov edx,eax
shl edx,8
mov dl,[esi]
mov [esi],edx
add esi,0Ch
inc eax
jmp enumerate_symbols
prepare_default_section:
mov ebx,[symbols_stream]
cmp dword [ebx+0Ch],0
jne default_section_ok
cmp [number_of_sections],0
je default_section_ok
mov edx,ebx
find_references_to_default_section:
cmp ebx,[free_additional_memory]
jne check_reference
add [symbols_stream],20h
ret
check_reference:
mov al,[ebx]
or al,al
jz skip_other_section
cmp al,0C0h
jae check_public_reference
cmp al,80h
jae next_reference
cmp edx,[ebx+8]
je default_section_ok
next_reference:
add ebx,0Ch
jmp find_references_to_default_section
check_public_reference:
mov eax,[ebx+8]
add ebx,10h
test byte [eax+8],1
jz find_references_to_default_section
mov cx,[current_pass]
cmp cx,[eax+16]
jne find_references_to_default_section
cmp edx,[eax+20]
je default_section_ok
jmp find_references_to_default_section
skip_other_section:
add ebx,20h
jmp find_references_to_default_section
default_section_ok:
inc [number_of_sections]
ret
symbols_enumerated:
mov [ebx+0Ch],eax
mov ebp,edi
sub ebp,ebx
push ebp
lea edi,[ebx+14h]
mov esi,[symbols_stream]
find_section:
cmp esi,[free_additional_memory]
je sections_finished
mov al,[esi]
or al,al
jz section_found
add esi,0Ch
cmp al,0C0h
jb find_section
add esi,4
jmp find_section
section_found:
push esi edi
mov esi,[esi+4]
or esi,esi
jz default_section
mov ecx,[esi]
add esi,4
rep movs byte [edi],[esi]
jmp section_name_ok
default_section:
mov al,'.'
stos byte [edi]
mov eax,'flat'
stos dword [edi]
section_name_ok:
pop edi esi
mov eax,[esi+0Ch]
mov [edi+10h],eax
mov eax,[esi+14h]
mov [edi+24h],eax
test al,80h
jnz section_ptr_ok
mov eax,[esi+8]
sub eax,[code_start]
add eax,ebp
mov [edi+14h],eax
section_ptr_ok:
mov ebx,[code_start]
mov edx,[code_size]
add ebx,edx
add edx,ebp
xor ecx,ecx
add esi,20h
find_relocations:
cmp esi,[free_additional_memory]
je section_relocations_done
mov al,[esi]
or al,al
jz section_relocations_done
cmp al,80h
jb add_relocation
cmp al,0C0h
jb next_relocation
add esi,10h
jmp find_relocations
add_relocation:
lea eax,[ebx+0Ah]
cmp eax,[tagged_blocks]
ja out_of_memory
mov eax,[esi+4]
mov [ebx],eax
mov eax,[esi+8]
mov eax,[eax]
shr eax,8
mov [ebx+4],eax
movzx ax,byte [esi]
mov [ebx+8],ax
add ebx,0Ah
inc ecx
next_relocation:
add esi,0Ch
jmp find_relocations
section_relocations_done:
cmp ecx,10000h
jb section_relocations_count_16bit
bt [format_flags],0
jnc format_limitations_exceeded
mov word [edi+20h],0FFFFh
or dword [edi+24h],1000000h
mov [edi+18h],edx
push esi edi
push ecx
lea esi,[ebx-1]
add ebx,0Ah
lea edi,[ebx-1]
imul ecx,0Ah
std
rep movs byte [edi],[esi]
cld
pop ecx
inc esi
inc ecx
mov [esi],ecx
xor eax,eax
mov [esi+4],eax
mov [esi+8],ax
pop edi esi
jmp section_relocations_ok
section_relocations_count_16bit:
mov [edi+20h],cx
jcxz section_relocations_ok
mov [edi+18h],edx
section_relocations_ok:
sub ebx,[code_start]
mov [code_size],ebx
add edi,28h
jmp find_section
sections_finished:
mov edx,[free_additional_memory]
mov ebx,[code_size]
add ebp,ebx
mov [edx+8],ebp
add ebx,[code_start]
mov edi,ebx
mov ecx,[edx+0Ch]
imul ecx,12h shr 1
xor eax,eax
shr ecx,1
jnc zero_symbols_table
stos word [edi]
zero_symbols_table:
rep stos dword [edi]
mov edx,edi
stos dword [edi]
mov esi,[symbols_stream]
make_symbols_table:
cmp esi,[free_additional_memory]
je symbols_table_ok
mov al,[esi]
cmp al,0C0h
jae add_public_symbol
cmp al,80h
jae add_extrn_symbol
or al,al
jz add_section_symbol
add esi,0Ch
jmp make_symbols_table
add_section_symbol:
call store_symbol_name
movzx eax,word [esi+1Eh]
mov [ebx+0Ch],ax
mov byte [ebx+10h],3
add esi,20h
add ebx,12h
jmp make_symbols_table
add_extrn_symbol:
call store_symbol_name
mov byte [ebx+10h],2
add esi,0Ch
add ebx,12h
jmp make_symbols_table
add_public_symbol:
call store_symbol_name
mov eax,[esi+0Ch]
mov [current_line],eax
mov eax,[esi+8]
test byte [eax+8],1
jz undefined_coff_public
mov cx,[current_pass]
cmp cx,[eax+16]
jne undefined_coff_public
mov cl,[eax+11]
or cl,cl
jz public_constant
test [format_flags],8
jnz check_64bit_public_symbol
cmp cl,2
je public_symbol_type_ok
jmp invalid_use_of_symbol
undefined_coff_public:
mov [error_info],eax
jmp undefined_symbol
check_64bit_public_symbol:
cmp cl,4
jne invalid_use_of_symbol
public_symbol_type_ok:
mov ecx,[eax+20]
cmp byte [ecx],80h
je alias_symbol
cmp byte [ecx],0
jne invalid_use_of_symbol
mov cx,[ecx+1Eh]
mov [ebx+0Ch],cx
public_symbol_section_ok:
movzx ecx,byte [eax+9]
shr cl,1
and cl,1
neg ecx
cmp ecx,[eax+4]
jne value_out_of_range
xor ecx,[eax]
js value_out_of_range
mov eax,[eax]
mov [ebx+8],eax
mov al,2
cmp byte [esi],0C0h
je store_symbol_class
inc al
cmp byte [esi],0C1h
je store_symbol_class
mov al,105
store_symbol_class:
mov byte [ebx+10h],al
add esi,10h
add ebx,12h
jmp make_symbols_table
alias_symbol:
bt [format_flags],0
jnc invalid_use_of_symbol
mov ecx,[eax]
or ecx,[eax+4]
jnz invalid_use_of_symbol
mov byte [ebx+10h],69h
mov byte [ebx+11h],1
add ebx,12h
mov ecx,[eax+20]
mov ecx,[ecx]
shr ecx,8
mov [ebx],ecx
mov byte [ebx+4],3
add esi,10h
add ebx,12h
jmp make_symbols_table
public_constant:
mov word [ebx+0Ch],0FFFFh
jmp public_symbol_section_ok
symbols_table_ok:
mov eax,edi
sub eax,edx
mov [edx],eax
sub edi,[code_start]
mov [code_size],edi
and [written_size],0
mov edx,[output_file]
call create
jc write_failed
mov edx,[free_additional_memory]
pop ecx
add [written_size],ecx
call write
jc write_failed
jmp write_output
store_symbol_name:
push esi
mov esi,[esi+4]
or esi,esi
jz default_name
lods dword [esi]
mov ecx,eax
cmp ecx,8
ja add_string
push edi
mov edi,ebx
rep movs byte [edi],[esi]
pop edi esi
ret
default_name:
mov dword [ebx],'.fla'
mov dword [ebx+4],'t'
pop esi
ret
add_string:
mov eax,edi
sub eax,edx
mov [ebx+4],eax
inc ecx
rep movs byte [edi],[esi]
pop esi
ret
 
format_elf:
test [format_flags],8
jnz format_elf64
mov edx,edi
mov ecx,34h shr 2
lea eax,[edi+ecx*4]
cmp eax,[tagged_blocks]
jae out_of_memory
xor eax,eax
rep stos dword [edi]
mov dword [edx],7Fh + 'ELF' shl 8
mov al,1
mov [edx+4],al
mov [edx+5],al
mov [edx+6],al
mov [edx+14h],al
mov byte [edx+12h],3
mov byte [edx+28h],34h
mov byte [edx+2Eh],28h
mov [code_type],32
mov byte [edx+10h],2
cmp word [esi],1D19h
je format_elf_exe
mov byte [edx+10h],3
cmp word [esi],021Eh
je format_elf_exe
elf_header_ok:
mov byte [edx+10h],1
mov eax,[additional_memory]
mov [symbols_stream],eax
mov ebx,eax
add eax,20h
cmp eax,[structures_buffer]
jae out_of_memory
mov [free_additional_memory],eax
xor eax,eax
mov [current_section],ebx
mov [number_of_sections],eax
mov [ebx],al
mov [ebx+4],eax
mov [ebx+8],edi
mov al,111b
mov [ebx+14h],eax
mov al,4
mov [ebx+10h],eax
mov edx,ebx
call init_addressing_space
xchg edx,ebx
mov [edx+14h],ebx
mov byte [edx+9],2
test [format_flags],8
jz format_defined
mov byte [edx+9],4
mov byte [ebx+10h],8
jmp format_defined
format_elf64:
mov edx,edi
mov ecx,40h shr 2
lea eax,[edi+ecx*4]
cmp eax,[tagged_blocks]
jae out_of_memory
xor eax,eax
rep stos dword [edi]
mov dword [edx],7Fh + 'ELF' shl 8
mov al,1
mov [edx+5],al
mov [edx+6],al
mov [edx+14h],al
mov byte [edx+4],2
mov byte [edx+12h],62
mov byte [edx+34h],40h
mov byte [edx+3Ah],40h
mov [code_type],64
mov byte [edx+10h],2
cmp word [esi],1D19h
je format_elf64_exe
mov byte [edx+10h],3
cmp word [esi],021Eh
je format_elf64_exe
jmp elf_header_ok
elf_section:
bt [format_flags],0
jc illegal_instruction
call close_coff_section
mov ebx,[free_additional_memory]
lea eax,[ebx+20h]
cmp eax,[structures_buffer]
jae out_of_memory
mov [free_additional_memory],eax
mov [current_section],ebx
inc word [number_of_sections]
jz format_limitations_exceeded
xor eax,eax
mov [ebx],al
mov [ebx+8],edi
mov [ebx+10h],eax
mov al,10b
mov [ebx+14h],eax
mov edx,ebx
call create_addressing_space
xchg edx,ebx
mov [edx+14h],ebx
mov byte [edx+9],2
test [format_flags],8
jz elf_labels_type_ok
mov byte [edx+9],4
elf_labels_type_ok:
lods word [esi]
cmp ax,'('
jne invalid_argument
mov [ebx+4],esi
mov ecx,[esi]
lea esi,[esi+4+ecx+1]
elf_section_flags:
cmp byte [esi],8Ch
je elf_section_alignment
cmp byte [esi],19h
jne elf_section_settings_ok
inc esi
lods byte [esi]
sub al,28
xor al,11b
test al,not 10b
jnz invalid_argument
mov cl,al
mov al,1
shl al,cl
test byte [ebx+14h],al
jnz setting_already_specified
or byte [ebx+14h],al
jmp elf_section_flags
elf_section_alignment:
inc esi
lods byte [esi]
cmp al,'('
jne invalid_argument
cmp byte [esi],'.'
je invalid_value
push ebx
call get_count_value
pop ebx
mov edx,eax
dec edx
test eax,edx
jnz invalid_value
or eax,eax
jz invalid_value
xchg [ebx+10h],eax
or eax,eax
jnz setting_already_specified
jmp elf_section_flags
elf_section_settings_ok:
cmp dword [ebx+10h],0
jne instruction_assembled
mov dword [ebx+10h],4
test [format_flags],8
jz instruction_assembled
mov byte [ebx+10h],8
jmp instruction_assembled
mark_elf_relocation:
test [format_flags],1
jnz invalid_use_of_symbol
push ebx
mov ebx,[addressing_space]
cmp [value_type],3
je elf_relocation_relative
cmp [value_type],7
je elf_relocation_relative
push eax
cmp [value_type],5
je elf_gotoff_relocation
ja invalid_use_of_symbol
mov al,1 ; R_386_32 / R_AMD64_64
test [format_flags],8
jz coff_relocation
cmp [value_type],4
je coff_relocation
mov al,11 ; R_AMD64_32S
jmp coff_relocation
elf_gotoff_relocation:
test [format_flags],8
jnz invalid_use_of_symbol
mov al,9 ; R_386_GOTOFF
jmp coff_relocation
elf_relocation_relative:
cmp byte [ebx+9],0
je invalid_use_of_symbol
mov ebx,[current_section]
mov ebx,[ebx+8]
sub ebx,edi
sub eax,ebx
push eax
mov al,2 ; R_386_PC32 / R_AMD64_PC32
cmp [value_type],3
je coff_relocation
mov al,4 ; R_386_PLT32 / R_AMD64_PLT32
jmp coff_relocation
close_elf:
bt [format_flags],0
jc close_elf_exe
call close_coff_section
cmp [next_pass_needed],0
je elf_closed
mov eax,[symbols_stream]
mov [free_additional_memory],eax
elf_closed:
ret
elf_formatter:
mov ecx,edi
sub ecx,[code_start]
neg ecx
and ecx,111b
test [format_flags],8
jnz align_elf_structures
and ecx,11b
align_elf_structures:
xor al,al
rep stos byte [edi]
push edi
call prepare_default_section
mov esi,[symbols_stream]
mov edi,[free_additional_memory]
xor eax,eax
mov ecx,4
rep stos dword [edi]
test [format_flags],8
jz find_first_section
mov ecx,2
rep stos dword [edi]
find_first_section:
mov al,[esi]
or al,al
jz first_section_found
cmp al,0C0h
jb skip_other_symbol
add esi,4
skip_other_symbol:
add esi,0Ch
jmp find_first_section
first_section_found:
mov ebx,esi
mov ebp,esi
add esi,20h
xor ecx,ecx
xor edx,edx
find_next_section:
cmp esi,[free_additional_memory]
je make_section_symbol
mov al,[esi]
or al,al
jz make_section_symbol
cmp al,0C0h
jae skip_public
cmp al,80h
jae skip_extrn
or byte [ebx+14h],40h
skip_extrn:
add esi,0Ch
jmp find_next_section
skip_public:
add esi,10h
jmp find_next_section
make_section_symbol:
mov eax,edi
xchg eax,[ebx+4]
stos dword [edi]
test [format_flags],8
jnz elf64_section_symbol
xor eax,eax
stos dword [edi]
stos dword [edi]
call store_section_index
jmp section_symbol_ok
store_section_index:
inc ecx
mov eax,ecx
shl eax,8
mov [ebx],eax
inc dx
jz format_limitations_exceeded
mov eax,edx
shl eax,16
mov al,3
test byte [ebx+14h],40h
jz section_index_ok
or ah,-1
inc dx
jz format_limitations_exceeded
section_index_ok:
stos dword [edi]
ret
elf64_section_symbol:
call store_section_index
xor eax,eax
stos dword [edi]
stos dword [edi]
stos dword [edi]
stos dword [edi]
section_symbol_ok:
mov ebx,esi
add esi,20h
cmp ebx,[free_additional_memory]
jne find_next_section
inc dx
jz format_limitations_exceeded
mov [current_section],edx
mov esi,[symbols_stream]
find_other_symbols:
cmp esi,[free_additional_memory]
je elf_symbol_table_ok
mov al,[esi]
or al,al
jz skip_section
cmp al,0C0h
jae make_public_symbol
cmp al,80h
jae make_extrn_symbol
add esi,0Ch
jmp find_other_symbols
skip_section:
add esi,20h
jmp find_other_symbols
make_public_symbol:
mov eax,[esi+0Ch]
mov [current_line],eax
cmp byte [esi],0C0h
jne invalid_argument
mov ebx,[esi+8]
test byte [ebx+8],1
jz undefined_public
mov ax,[current_pass]
cmp ax,[ebx+16]
jne undefined_public
mov dl,[ebx+11]
or dl,dl
jz public_absolute
mov eax,[ebx+20]
cmp byte [eax],0
jne invalid_use_of_symbol
mov eax,[eax+4]
test [format_flags],8
jnz elf64_public
cmp dl,2
jne invalid_use_of_symbol
mov dx,[eax+0Eh]
jmp section_for_public_ok
undefined_public:
mov [error_info],ebx
jmp undefined_symbol
elf64_public:
cmp dl,4
jne invalid_use_of_symbol
mov dx,[eax+6]
jmp section_for_public_ok
public_absolute:
mov dx,0FFF1h
section_for_public_ok:
mov eax,[esi+4]
stos dword [edi]
test [format_flags],8
jnz elf64_public_symbol
movzx eax,byte [ebx+9]
shr al,1
and al,1
neg eax
cmp eax,[ebx+4]
jne value_out_of_range
xor eax,[ebx]
js value_out_of_range
mov eax,[ebx]
stos dword [edi]
xor eax,eax
mov al,[ebx+10]
stos dword [edi]
mov eax,edx
shl eax,16
mov al,10h
cmp byte [ebx+10],0
je elf_public_function
or al,1
jmp store_elf_public_info
elf_public_function:
or al,2
store_elf_public_info:
stos dword [edi]
jmp public_symbol_ok
elf64_public_symbol:
mov eax,edx
shl eax,16
mov al,10h
cmp byte [ebx+10],0
je elf64_public_function
or al,1
jmp store_elf64_public_info
elf64_public_function:
or al,2
store_elf64_public_info:
stos dword [edi]
mov al,[ebx+9]
shl eax,31-1
xor eax,[ebx+4]
js value_out_of_range
mov eax,[ebx]
stos dword [edi]
mov eax,[ebx+4]
stos dword [edi]
mov al,[ebx+10]
stos dword [edi]
xor al,al
stos dword [edi]
public_symbol_ok:
inc ecx
mov eax,ecx
shl eax,8
mov al,0C0h
mov [esi],eax
add esi,10h
jmp find_other_symbols
make_extrn_symbol:
mov eax,[esi+4]
stos dword [edi]
test [format_flags],8
jnz elf64_extrn_symbol
xor eax,eax
stos dword [edi]
mov eax,[esi+8]
stos dword [edi]
mov eax,10h
stos dword [edi]
jmp extrn_symbol_ok
elf64_extrn_symbol:
mov eax,10h
stos dword [edi]
xor al,al
stos dword [edi]
stos dword [edi]
mov eax,[esi+8]
stos dword [edi]
xor eax,eax
stos dword [edi]
extrn_symbol_ok:
inc ecx
mov eax,ecx
shl eax,8
mov al,80h
mov [esi],eax
add esi,0Ch
jmp find_other_symbols
elf_symbol_table_ok:
mov edx,edi
mov ebx,[free_additional_memory]
xor al,al
stos byte [edi]
add edi,16
mov [edx+1],edx
add ebx,10h
test [format_flags],8
jz make_string_table
add ebx,8
make_string_table:
cmp ebx,edx
je elf_string_table_ok
test [format_flags],8
jnz make_elf64_string
cmp byte [ebx+0Dh],0
je rel_prefix_ok
mov byte [ebx+0Dh],0
mov eax,'.rel'
stos dword [edi]
rel_prefix_ok:
mov esi,edi
sub esi,edx
xchg esi,[ebx]
add ebx,10h
make_elf_string:
or esi,esi
jz default_string
lods dword [esi]
mov ecx,eax
rep movs byte [edi],[esi]
xor al,al
stos byte [edi]
jmp make_string_table
make_elf64_string:
cmp byte [ebx+5],0
je elf64_rel_prefix_ok
mov byte [ebx+5],0
mov eax,'.rel'
stos dword [edi]
mov al,'a'
stos byte [edi]
elf64_rel_prefix_ok:
mov esi,edi
sub esi,edx
xchg esi,[ebx]
add ebx,18h
jmp make_elf_string
default_string:
mov eax,'.fla'
stos dword [edi]
mov ax,'t'
stos word [edi]
jmp make_string_table
elf_string_table_ok:
mov [edx+1+8],edi
mov ebx,[code_start]
mov eax,edi
sub eax,[free_additional_memory]
xor ecx,ecx
sub ecx,eax
test [format_flags],8
jnz finish_elf64_header
and ecx,11b
add eax,ecx
mov [ebx+20h],eax
mov eax,[current_section]
inc ax
jz format_limitations_exceeded
mov [ebx+32h],ax
inc ax
jz format_limitations_exceeded
mov [ebx+30h],ax
jmp elf_header_finished
finish_elf64_header:
and ecx,111b
add eax,ecx
mov [ebx+28h],eax
mov eax,[current_section]
inc ax
jz format_limitations_exceeded
mov [ebx+3Eh],ax
inc ax
jz format_limitations_exceeded
mov [ebx+3Ch],ax
elf_header_finished:
xor eax,eax
add ecx,10*4
rep stos byte [edi]
test [format_flags],8
jz elf_null_section_ok
mov ecx,6*4
rep stos byte [edi]
elf_null_section_ok:
mov esi,ebp
xor ecx,ecx
make_section_entry:
mov ebx,edi
mov eax,[esi+4]
mov eax,[eax]
stos dword [edi]
mov eax,1
cmp dword [esi+0Ch],0
je bss_section
test byte [esi+14h],80h
jz section_type_ok
bss_section:
mov al,8
section_type_ok:
stos dword [edi]
mov eax,[esi+14h]
and al,3Fh
call store_elf_machine_word
xor eax,eax
call store_elf_machine_word
mov eax,[esi+8]
mov [image_base],eax
sub eax,[code_start]
call store_elf_machine_word
mov eax,[esi+0Ch]
call store_elf_machine_word
xor eax,eax
stos dword [edi]
stos dword [edi]
mov eax,[esi+10h]
call store_elf_machine_word
xor eax,eax
call store_elf_machine_word
inc ecx
add esi,20h
xchg edi,[esp]
mov ebp,edi
convert_relocations:
cmp esi,[free_additional_memory]
je relocations_converted
mov al,[esi]
or al,al
jz relocations_converted
cmp al,80h
jb make_relocation_entry
cmp al,0C0h
jb relocation_entry_ok
add esi,10h
jmp convert_relocations
make_relocation_entry:
test [format_flags],8
jnz make_elf64_relocation_entry
mov eax,[esi+4]
stos dword [edi]
mov eax,[esi+8]
mov eax,[eax]
mov al,[esi]
stos dword [edi]
jmp relocation_entry_ok
make_elf64_relocation_entry:
mov eax,[esi+4]
stos dword [edi]
xor eax,eax
stos dword [edi]
movzx eax,byte [esi]
stos dword [edi]
mov eax,[esi+8]
mov eax,[eax]
shr eax,8
stos dword [edi]
xor eax,eax
push edx
mov edx,[esi+4]
add edx,[image_base]
xchg eax,[edx]
stos dword [edi]
cmp byte [esi],1
je addend_64bit
pop edx
sar eax,31
stos dword [edi]
jmp relocation_entry_ok
addend_64bit:
xor eax,eax
xchg eax,[edx+4]
stos dword [edi]
pop edx
relocation_entry_ok:
add esi,0Ch
jmp convert_relocations
store_elf_machine_word:
stos dword [edi]
test [format_flags],8
jz elf_machine_word_ok
and dword [edi],0
add edi,4
elf_machine_word_ok:
ret
relocations_converted:
cmp edi,ebp
xchg edi,[esp]
je rel_section_ok
mov eax,[ebx]
sub eax,4
test [format_flags],8
jz store_relocations_name_offset
dec eax
store_relocations_name_offset:
stos dword [edi]
test [format_flags],8
jnz rela_section
mov eax,9
jmp store_relocations_type
rela_section:
mov eax,4
store_relocations_type:
stos dword [edi]
xor al,al
call store_elf_machine_word
call store_elf_machine_word
mov eax,ebp
sub eax,[code_start]
call store_elf_machine_word
mov eax,[esp]
sub eax,ebp
call store_elf_machine_word
mov eax,[current_section]
stos dword [edi]
mov eax,ecx
stos dword [edi]
inc ecx
test [format_flags],8
jnz finish_elf64_rela_section
mov eax,4
stos dword [edi]
mov al,8
stos dword [edi]
jmp rel_section_ok
finish_elf64_rela_section:
mov eax,8
stos dword [edi]
xor al,al
stos dword [edi]
mov al,24
stos dword [edi]
xor al,al
stos dword [edi]
rel_section_ok:
cmp esi,[free_additional_memory]
jne make_section_entry
pop eax
mov ebx,[code_start]
sub eax,ebx
mov [code_size],eax
mov ecx,20h
test [format_flags],8
jz adjust_elf_section_headers_offset
mov ecx,28h
adjust_elf_section_headers_offset:
add [ebx+ecx],eax
mov eax,1
stos dword [edi]
mov al,2
stos dword [edi]
xor al,al
call store_elf_machine_word
call store_elf_machine_word
mov eax,[code_size]
call store_elf_machine_word
mov eax,[edx+1]
sub eax,[free_additional_memory]
call store_elf_machine_word
mov eax,[current_section]
inc eax
stos dword [edi]
mov eax,[number_of_sections]
inc eax
stos dword [edi]
test [format_flags],8
jnz finish_elf64_sym_section
mov eax,4
stos dword [edi]
mov al,10h
stos dword [edi]
jmp sym_section_ok
finish_elf64_sym_section:
mov eax,8
stos dword [edi]
xor al,al
stos dword [edi]
mov al,18h
stos dword [edi]
xor al,al
stos dword [edi]
sym_section_ok:
mov al,1+8
stos dword [edi]
mov al,3
stos dword [edi]
xor al,al
call store_elf_machine_word
call store_elf_machine_word
mov eax,[edx+1]
sub eax,[free_additional_memory]
add eax,[code_size]
call store_elf_machine_word
mov eax,[edx+1+8]
sub eax,[edx+1]
call store_elf_machine_word
xor eax,eax
stos dword [edi]
stos dword [edi]
mov al,1
call store_elf_machine_word
xor eax,eax
call store_elf_machine_word
mov eax,'tab'
mov dword [edx+1],'.sym'
mov [edx+1+4],eax
mov dword [edx+1+8],'.str'
mov [edx+1+8+4],eax
mov [resource_data],edx
mov [written_size],0
mov edx,[output_file]
call create
jc write_failed
call write_code
mov ecx,edi
mov edx,[free_additional_memory]
sub ecx,edx
add [written_size],ecx
call write
jc write_failed
jmp output_written
 
format_elf_exe:
add esi,2
or [format_flags],1
cmp byte [esi],'('
jne elf_exe_brand_ok
inc esi
cmp byte [esi],'.'
je invalid_value
push edx
call get_byte_value
cmp [value_type],0
jne invalid_use_of_symbol
pop edx
mov [edx+7],al
elf_exe_brand_ok:
mov [image_base],8048000h
cmp byte [esi],80h
jne elf_exe_base_ok
lods word [esi]
cmp ah,'('
jne invalid_argument
cmp byte [esi],'.'
je invalid_value
push edx
call get_dword_value
cmp [value_type],0
jne invalid_use_of_symbol
mov [image_base],eax
pop edx
elf_exe_base_ok:
mov byte [edx+2Ah],20h
mov ebx,edi
mov ecx,20h shr 2
cmp [current_pass],0
je init_elf_segments
imul ecx,[number_of_sections]
init_elf_segments:
xor eax,eax
rep stos dword [edi]
and [number_of_sections],0
mov byte [ebx],1
mov word [ebx+1Ch],1000h
mov byte [ebx+18h],111b
mov ebp,[image_base]
and dword [ebx+4],0
mov [ebx+8],ebp
mov [ebx+0Ch],ebp
mov eax,edi
sub eax,[code_start]
add eax,ebp
mov [edx+18h],eax
and [image_base_high],0
elf_exe_addressing_setup:
call init_addressing_space
call setup_elf_exe_labels_type
mov eax,[code_start]
xor edx,edx
xor cl,cl
sub eax,[image_base]
sbb edx,[image_base_high]
sbb cl,0
mov [ebx],eax
mov [ebx+4],edx
mov [ebx+8],cl
mov [symbols_stream],edi
jmp format_defined
format_elf64_exe:
add esi,2
or [format_flags],1
cmp byte [esi],'('
jne elf64_exe_brand_ok
inc esi
cmp byte [esi],'.'
je invalid_value
push edx
call get_byte_value
cmp [value_type],0
jne invalid_use_of_symbol
pop edx
mov [edx+7],al
elf64_exe_brand_ok:
mov [image_base],400000h
and [image_base_high],0
cmp byte [esi],80h
jne elf64_exe_base_ok
lods word [esi]
cmp ah,'('
jne invalid_argument
cmp byte [esi],'.'
je invalid_value
push edx
call get_qword_value
cmp [value_type],0
jne invalid_use_of_symbol
mov [image_base],eax
mov [image_base_high],edx
pop edx
elf64_exe_base_ok:
mov byte [edx+36h],38h
mov ebx,edi
mov ecx,38h shr 2
cmp [current_pass],0
je init_elf64_segments
imul ecx,[number_of_sections]
init_elf64_segments:
xor eax,eax
rep stos dword [edi]
and [number_of_sections],0
mov byte [ebx],1
mov word [ebx+30h],1000h
mov byte [ebx+4],111b
mov ebp,[image_base]
mov ecx,[image_base_high]
and dword [ebx+8],0
mov [ebx+10h],ebp
mov [ebx+10h+4],ecx
mov [ebx+18h],ebp
mov [ebx+18h+4],ecx
mov eax,edi
sub eax,[code_start]
add eax,ebp
adc ecx,0
mov [edx+18h],eax
mov [edx+18h+8],ecx
jmp elf_exe_addressing_setup
setup_elf_exe_labels_type:
mov eax,[code_start]
cmp byte [eax+10h],3
jne elf_exe_labels_type_ok
mov byte [ebx+9],2
test [format_flags],8
jz elf_exe_labels_type_ok
mov byte [ebx+9],4
elf_exe_labels_type_ok:
ret
elf_entry:
lods byte [esi]
cmp al,'('
jne invalid_argument
cmp byte [esi],'.'
je invalid_value
test [format_flags],8
jnz elf64_entry
call get_dword_value
mov edx,[code_start]
mov [edx+18h],eax
jmp instruction_assembled
elf64_entry:
call get_qword_value
mov ebx,[code_start]
mov [ebx+18h],eax
mov [ebx+1Ch],edx
jmp instruction_assembled
elf_segment:
bt [format_flags],0
jnc illegal_instruction
test [format_flags],8
jnz elf64_segment
call close_elf_segment
push eax
call create_addressing_space
call setup_elf_exe_labels_type
mov ebp,ebx
mov ebx,[number_of_sections]
shl ebx,5
add ebx,[code_start]
add ebx,34h
cmp ebx,[symbols_stream]
jb new_elf_segment
mov ebx,[symbols_stream]
sub ebx,20h
or [next_pass_needed],-1
new_elf_segment:
mov byte [ebx],1
and dword [ebx+18h],0
mov word [ebx+1Ch],1000h
elf_segment_flags:
cmp byte [esi],1Eh
je elf_segment_type
cmp byte [esi],19h
jne elf_segment_flags_ok
lods word [esi]
sub ah,28
jbe invalid_argument
cmp ah,1
je mark_elf_segment_flag
cmp ah,3
ja invalid_argument
xor ah,1
cmp ah,2
je mark_elf_segment_flag
inc ah
mark_elf_segment_flag:
test [ebx+18h],ah
jnz setting_already_specified
or [ebx+18h],ah
jmp elf_segment_flags
elf_segment_type:
cmp byte [ebx],1
jne setting_already_specified
lods word [esi]
mov ecx,[number_of_sections]
jecxz elf_segment_type_ok
mov edx,[code_start]
add edx,34h
scan_elf_segment_types:
cmp edx,[symbols_stream]
jae elf_segment_type_ok
cmp [edx],ah
je data_already_defined
add edx,20h
loop scan_elf_segment_types
elf_segment_type_ok:
mov [ebx],ah
mov word [ebx+1Ch],1
cmp ah,50h
jb elf_segment_flags
or dword [ebx],6474E500h
jmp elf_segment_flags
elf_segment_flags_ok:
pop edx
cmp byte [ebx],1
jne no_elf_segment_merging
cmp [merge_segment],0
jne merge_elf_segment
no_elf_segment_merging:
mov eax,edi
sub eax,[code_start]
mov [ebx+4],eax
and eax,0FFFh
add eax,edx
mov [ebx+8],eax
mov [ebx+0Ch],eax
xor edx,edx
elf_segment_addressing_setup:
xor cl,cl
not eax
not edx
not cl
add eax,1
adc edx,0
adc cl,0
add eax,edi
adc edx,0
adc cl,0
mov [ds:ebp],eax
mov [ds:ebp+4],edx
mov [ds:ebp+8],cl
inc [number_of_sections]
jmp instruction_assembled
merge_elf_segment:
xor ecx,ecx
xchg ecx,[merge_segment]
cmp ecx,-1
je merge_elf_header
mov eax,[ecx+8]
mov ecx,[ecx+4]
elf_segment_separated_base:
mov [ebx+8],eax
mov [ebx+0Ch],eax
mov [ebx+4],ecx
sub eax,ecx
add eax,edi
sub eax,[code_start]
xor edx,edx
jmp elf_segment_addressing_setup
merge_elf_header:
mov eax,[image_base]
xor ecx,ecx
jmp elf_segment_separated_base
close_elf_segment:
cmp [number_of_sections],0
jne finish_elf_segment
cmp edi,[symbols_stream]
jne first_elf_segment_ok
or [merge_segment],-1
mov eax,[image_base]
ret
first_elf_segment_ok:
and [merge_segment],0
inc [number_of_sections]
finish_elf_segment:
mov ebx,[number_of_sections]
dec ebx
shl ebx,5
add ebx,[code_start]
add ebx,34h
mov eax,edi
sub eax,[code_start]
sub eax,[ebx+4]
mov edx,edi
cmp edi,[undefined_data_end]
jne elf_segment_size_ok
cmp byte [ebx],1
jne elf_segment_size_ok
mov edi,[undefined_data_start]
elf_segment_size_ok:
mov [ebx+14h],eax
add eax,edi
sub eax,edx
mov [ebx+10h],eax
and [undefined_data_end],0
mov eax,[ebx+8]
cmp byte [ebx],1
je elf_segment_position_move_and_align
cmp [merge_segment],0
jne elf_segment_position_move
cmp byte [ebx],4
je elf_segment_position_ok
cmp byte [ebx],51h
je elf_segment_position_ok
mov [merge_segment],ebx
elf_segment_position_move:
add eax,[ebx+14h]
jmp elf_segment_position_ok
elf_segment_position_move_and_align:
add eax,[ebx+14h]
add eax,0FFFh
elf_segment_position_ok:
and eax,not 0FFFh
ret
elf64_segment:
call close_elf64_segment
push eax edx
call create_addressing_space
call setup_elf_exe_labels_type
mov ebp,ebx
mov ebx,[number_of_sections]
imul ebx,38h
add ebx,[code_start]
add ebx,40h
cmp ebx,[symbols_stream]
jb new_elf64_segment
or [next_pass_needed],-1
new_elf64_segment:
mov byte [ebx],1
and dword [ebx+4],0
mov word [ebx+30h],1000h
elf64_segment_flags:
cmp byte [esi],1Eh
je elf64_segment_type
cmp byte [esi],19h
jne elf64_segment_flags_ok
lods word [esi]
sub ah,28
jbe invalid_argument
cmp ah,1
je mark_elf64_segment_flag
cmp ah,3
ja invalid_argument
xor ah,1
cmp ah,2
je mark_elf64_segment_flag
inc ah
mark_elf64_segment_flag:
test [ebx+4],ah
jnz setting_already_specified
or [ebx+4],ah
jmp elf64_segment_flags
elf64_segment_type:
cmp byte [ebx],1
jne setting_already_specified
lods word [esi]
mov ecx,[number_of_sections]
jecxz elf64_segment_type_ok
mov edx,[code_start]
add edx,40h
scan_elf64_segment_types:
cmp edx,[symbols_stream]
jae elf64_segment_type_ok
cmp [edx],ah
je data_already_defined
add edx,38h
loop scan_elf64_segment_types
elf64_segment_type_ok:
mov [ebx],ah
mov word [ebx+30h],1
cmp ah,50h
jb elf64_segment_flags
or dword [ebx],6474E500h
jmp elf64_segment_flags
elf64_segment_flags_ok:
pop edx eax
cmp byte [ebx],1
jne no_elf64_segment_merging
cmp [merge_segment],0
jne merge_elf64_segment
no_elf64_segment_merging:
mov ecx,edi
sub ecx,[code_start]
mov [ebx+8],ecx
and ecx,0FFFh
add eax,ecx
adc edx,0
mov [ebx+10h],eax
mov [ebx+10h+4],edx
mov [ebx+18h],eax
mov [ebx+18h+4],edx
jmp elf_segment_addressing_setup
merge_elf64_segment:
xor ecx,ecx
xchg ecx,[merge_segment]
cmp ecx,-1
je merge_elf64_header
mov eax,[ecx+10h]
mov edx,[ecx+10h+4]
mov ecx,[ecx+8]
elf64_segment_separated_base:
mov [ebx+10h],eax
mov [ebx+10h+4],edx
mov [ebx+18h],eax
mov [ebx+18h+4],edx
mov [ebx+8],ecx
neg ecx
add ecx,edi
sub ecx,[code_start]
add eax,ecx
adc edx,0
jmp elf_segment_addressing_setup
merge_elf64_header:
mov eax,[image_base]
mov edx,[image_base_high]
xor ecx,ecx
jmp elf64_segment_separated_base
close_elf64_segment:
cmp [number_of_sections],0
jne finish_elf64_segment
cmp edi,[symbols_stream]
jne first_elf64_segment_ok
or [merge_segment],-1
mov eax,[image_base]
mov edx,[image_base_high]
ret
first_elf64_segment_ok:
and [merge_segment],0
inc [number_of_sections]
finish_elf64_segment:
mov ebx,[number_of_sections]
dec ebx
imul ebx,38h
add ebx,[code_start]
add ebx,40h
mov eax,edi
sub eax,[code_start]
sub eax,[ebx+8]
mov edx,edi
cmp edi,[undefined_data_end]
jne elf64_segment_size_ok
cmp byte [ebx],1
jne elf64_segment_size_ok
mov edi,[undefined_data_start]
elf64_segment_size_ok:
mov [ebx+28h],eax
add eax,edi
sub eax,edx
mov [ebx+20h],eax
and [undefined_data_end],0
mov eax,[ebx+10h]
mov edx,[ebx+10h+4]
cmp byte [ebx],1
je elf64_segment_position_move_and_align
cmp [merge_segment],0
jne elf64_segment_position_move
cmp byte [ebx],4
je elf64_segment_position_ok
cmp byte [ebx],51h
je elf64_segment_position_ok
mov [merge_segment],ebx
elf64_segment_position_move:
add eax,[ebx+28h]
adc edx,0
jmp elf64_segment_position_ok
elf64_segment_position_move_and_align:
add eax,[ebx+28h]
adc edx,0
add eax,0FFFh
adc edx,0
elf64_segment_position_ok:
and eax,not 0FFFh
ret
close_elf_exe:
test [format_flags],8
jnz close_elf64_exe
call close_elf_segment
mov edx,[code_start]
mov eax,[number_of_sections]
mov byte [edx+1Ch],34h
mov [edx+2Ch],ax
shl eax,5
add eax,edx
add eax,34h
cmp eax,[symbols_stream]
je elf_exe_ok
or [next_pass_needed],-1
elf_exe_ok:
ret
close_elf64_exe:
call close_elf64_segment
mov edx,[code_start]
mov eax,[number_of_sections]
mov byte [edx+20h],40h
mov [edx+38h],ax
imul eax,38h
add eax,edx
add eax,40h
cmp eax,[symbols_stream]
je elf64_exe_ok
or [next_pass_needed],-1
elf64_exe_ok:
ret
/programs/develop/koldbg/fasm/messages.inc
0,0 → 1,52
 
; flat assembler core
; Copyright (c) 1999-2019, Tomasz Grysztar.
; All rights reserved.
 
_out_of_memory db 'out of memory',0
_stack_overflow db 'out of stack space',0
_main_file_not_found db 'source file not found',0
_unexpected_end_of_file db 'unexpected end of file',0
_code_cannot_be_generated db 'code cannot be generated',0
_format_limitations_exceeded db 'format limitations exceeded',0
_invalid_definition db 'invalid definition provided',0
_write_failed db 'write failed',0
_file_not_found db 'file not found',0
_error_reading_file db 'error reading file',0
_invalid_file_format db 'invalid file format',0
_invalid_macro_arguments db 'invalid macro arguments',0
_incomplete_macro db 'incomplete macro',0
_unexpected_characters db 'unexpected characters',0
_invalid_argument db 'invalid argument',0
_illegal_instruction db 'illegal instruction',0
_invalid_operand db 'invalid operand',0
_invalid_operand_size db 'invalid size of operand',0
_operand_size_not_specified db 'operand size not specified',0
_operand_sizes_do_not_match db 'operand sizes do not match',0
_invalid_address_size db 'invalid size of address value',0
_address_sizes_do_not_agree db 'address sizes do not agree',0
_disallowed_combination_of_registers db 'disallowed combination of registers',0
_long_immediate_not_encodable db 'not encodable with long immediate',0
_relative_jump_out_of_range db 'relative jump out of range',0
_invalid_expression db 'invalid expression',0
_invalid_address db 'invalid address',0
_invalid_value db 'invalid value',0
_value_out_of_range db 'value out of range',0
_undefined_symbol db 'undefined symbol',0
_symbol_out_of_scope_1 db 'symbol',0
_symbol_out_of_scope_2 db 'out of scope',0
_invalid_use_of_symbol db 'invalid use of symbol',0
_name_too_long db 'name too long',0
_invalid_name db 'invalid name',0
_reserved_word_used_as_symbol db 'reserved word used as symbol',0
_symbol_already_defined db 'symbol already defined',0
_missing_end_quote db 'missing end quote',0
_missing_end_directive db 'missing end directive',0
_unexpected_instruction db 'unexpected instruction',0
_extra_characters_on_line db 'extra characters on line',0
_section_not_aligned_enough db 'section is not aligned enough',0
_setting_already_specified db 'setting already specified',0
_data_already_defined db 'data already defined',0
_too_many_repeats db 'too many repeats',0
_invoked_error db 'error directive encountered in source file',0
_assertion_failed db 'assertion failed',0
/programs/develop/koldbg/fasm/parser.inc
0,0 → 1,1470
 
; flat assembler core
; Copyright (c) 1999-2019, Tomasz Grysztar.
; All rights reserved.
 
parser:
mov eax,[memory_end]
mov [labels_list],eax
mov eax,[additional_memory]
mov [free_additional_memory],eax
xor eax,eax
mov [current_locals_prefix],eax
mov [anonymous_reverse],eax
mov [anonymous_forward],eax
mov [hash_tree],eax
mov [blocks_stack],eax
mov [parsed_lines],eax
mov esi,[memory_start]
mov edi,[source_start]
parser_loop:
mov [current_line],esi
lea eax,[edi+100h]
cmp eax,[labels_list]
jae out_of_memory
cmp byte [esi+16],0
je empty_line
cmp byte [esi+16],3Bh
je empty_line
mov al,0Fh
stos byte [edi]
mov eax,esi
stos dword [edi]
inc [parsed_lines]
add esi,16
parse_line:
mov [formatter_symbols_allowed],0
mov [decorator_symbols_allowed],0
cmp byte [esi],1Ah
jne empty_instruction
push edi
add esi,2
movzx ecx,byte [esi-1]
cmp byte [esi+ecx],':'
je simple_label
cmp byte [esi+ecx],'='
je constant_label
call get_instruction
jnc main_instruction_identified
cmp byte [esi+ecx],1Ah
jne no_data_label
push esi ecx
lea esi,[esi+ecx+2]
movzx ecx,byte [esi-1]
call get_data_directive
jnc data_label
pop ecx esi
no_data_label:
call get_data_directive
jnc main_instruction_identified
pop edi
sub esi,2
xor bx,bx
call parse_line_contents
jmp parse_next_line
simple_label:
pop edi
call identify_label
cmp byte [esi+1],':'
je block_label
mov byte [edi],2
inc edi
stos dword [edi]
inc esi
xor al,al
stos byte [edi]
jmp parse_line
block_label:
mov byte [edi],4
inc edi
stos dword [edi]
add esi,2
jmp parse_line
constant_label:
pop edi
call get_label_id
mov byte [edi],3
inc edi
stos dword [edi]
xor al,al
stos byte [edi]
inc esi
xor bx,bx
call parse_line_contents
jmp parse_next_line
data_label:
pop ecx edx
pop edi
push eax ebx esi
mov esi,edx
movzx ecx,byte [esi-1]
call identify_label
mov byte [edi],2
inc edi
stos dword [edi]
pop esi ebx eax
stos byte [edi]
push edi
main_instruction_identified:
pop edi
mov dl,al
mov al,1
stos byte [edi]
mov ax,bx
stos word [edi]
mov al,dl
stos byte [edi]
cmp bx,if_directive-instruction_handler
je parse_block
cmp bx,repeat_directive-instruction_handler
je parse_block
cmp bx,while_directive-instruction_handler
je parse_block
cmp bx,end_directive-instruction_handler
je parse_end_directive
cmp bx,else_directive-instruction_handler
je parse_else
cmp bx,assert_directive-instruction_handler
je parse_assert
common_parse:
call parse_line_contents
jmp parse_next_line
empty_instruction:
lods byte [esi]
or al,al
jz parse_next_line
cmp al,':'
je invalid_name
dec esi
mov [parenthesis_stack],0
call parse_argument
jmp parse_next_line
empty_line:
add esi,16
skip_rest_of_line:
call skip_foreign_line
parse_next_line:
cmp esi,[source_start]
jb parser_loop
source_parsed:
cmp [blocks_stack],0
je blocks_stack_ok
pop eax
pop [current_line]
jmp missing_end_directive
blocks_stack_ok:
xor al,al
stos byte [edi]
add edi,0Fh
and edi,not 0Fh
mov [code_start],edi
ret
parse_block:
mov eax,esp
sub eax,[stack_limit]
cmp eax,100h
jb stack_overflow
push [current_line]
mov ax,bx
shl eax,16
push eax
inc [blocks_stack]
cmp bx,if_directive-instruction_handler
je parse_if
cmp bx,while_directive-instruction_handler
je parse_while
call parse_line_contents
jmp parse_next_line
parse_end_directive:
cmp byte [esi],1Ah
jne common_parse
push edi
inc esi
movzx ecx,byte [esi]
inc esi
call get_instruction
pop edi
jnc parse_end_block
sub esi,2
jmp common_parse
parse_end_block:
mov dl,al
mov al,1
stos byte [edi]
mov ax,bx
stos word [edi]
mov al,dl
stos byte [edi]
lods byte [esi]
or al,al
jnz extra_characters_on_line
cmp bx,if_directive-instruction_handler
je close_parsing_block
cmp bx,repeat_directive-instruction_handler
je close_parsing_block
cmp bx,while_directive-instruction_handler
je close_parsing_block
jmp parse_next_line
close_parsing_block:
cmp [blocks_stack],0
je unexpected_instruction
cmp bx,[esp+2]
jne unexpected_instruction
dec [blocks_stack]
pop eax edx
cmp bx,if_directive-instruction_handler
jne parse_next_line
test al,1100b
jz parse_next_line
test al,10000b
jnz parse_next_line
sub edi,8
jmp parse_next_line
parse_if:
push edi
call parse_line_contents
xor al,al
stos byte [edi]
xchg esi,[esp]
mov edi,esi
call preevaluate_logical_expression
pop esi
cmp al,'0'
je parse_false_condition_block
cmp al,'1'
je parse_true_condition_block
or byte [esp],10000b
jmp parse_next_line
parse_while:
push edi
call parse_line_contents
xor al,al
stos byte [edi]
xchg esi,[esp]
mov edi,esi
call preevaluate_logical_expression
pop esi
cmp al,'0'
je parse_false_condition_block
cmp al,'1'
jne parse_next_line
stos byte [edi]
jmp parse_next_line
parse_false_condition_block:
or byte [esp],1
sub edi,4
jmp skip_parsing
parse_true_condition_block:
or byte [esp],100b
sub edi,4
jmp parse_next_line
parse_else:
cmp [blocks_stack],0
je unexpected_instruction
cmp word [esp+2],if_directive-instruction_handler
jne unexpected_instruction
lods byte [esi]
or al,al
jz parse_pure_else
cmp al,1Ah
jne extra_characters_on_line
push edi
movzx ecx,byte [esi]
inc esi
call get_instruction
jc extra_characters_on_line
pop edi
cmp bx,if_directive-instruction_handler
jne extra_characters_on_line
test byte [esp],100b
jnz skip_true_condition_else
mov dl,al
mov al,1
stos byte [edi]
mov ax,bx
stos word [edi]
mov al,dl
stos byte [edi]
jmp parse_if
parse_assert:
push edi
call parse_line_contents
xor al,al
stos byte [edi]
xchg esi,[esp]
mov edi,esi
call preevaluate_logical_expression
pop esi
or al,al
jz parse_next_line
stos byte [edi]
jmp parse_next_line
skip_true_condition_else:
sub edi,4
or byte [esp],1
jmp skip_parsing_contents
parse_pure_else:
bts dword [esp],1
jc unexpected_instruction
test byte [esp],100b
jz parse_next_line
sub edi,4
or byte [esp],1
jmp skip_parsing
skip_parsing:
cmp esi,[source_start]
jae source_parsed
mov [current_line],esi
add esi,16
skip_parsing_line:
cmp byte [esi],1Ah
jne skip_parsing_contents
inc esi
movzx ecx,byte [esi]
inc esi
cmp byte [esi+ecx],':'
je skip_parsing_label
push edi
call get_instruction
pop edi
jnc skip_parsing_instruction
add esi,ecx
jmp skip_parsing_contents
skip_parsing_label:
lea esi,[esi+ecx+1]
jmp skip_parsing_line
skip_parsing_instruction:
cmp bx,if_directive-instruction_handler
je skip_parsing_block
cmp bx,repeat_directive-instruction_handler
je skip_parsing_block
cmp bx,while_directive-instruction_handler
je skip_parsing_block
cmp bx,end_directive-instruction_handler
je skip_parsing_end_directive
cmp bx,else_directive-instruction_handler
je skip_parsing_else
skip_parsing_contents:
lods byte [esi]
or al,al
jz skip_parsing
cmp al,1Ah
je skip_parsing_symbol
cmp al,3Bh
je skip_parsing_symbol
cmp al,22h
je skip_parsing_string
jmp skip_parsing_contents
skip_parsing_symbol:
lods byte [esi]
movzx eax,al
add esi,eax
jmp skip_parsing_contents
skip_parsing_string:
lods dword [esi]
add esi,eax
jmp skip_parsing_contents
skip_parsing_block:
mov eax,esp
sub eax,[stack_limit]
cmp eax,100h
jb stack_overflow
push [current_line]
mov ax,bx
shl eax,16
push eax
inc [blocks_stack]
jmp skip_parsing_contents
skip_parsing_end_directive:
cmp byte [esi],1Ah
jne skip_parsing_contents
push edi
inc esi
movzx ecx,byte [esi]
inc esi
call get_instruction
pop edi
jnc skip_parsing_end_block
add esi,ecx
jmp skip_parsing_contents
skip_parsing_end_block:
lods byte [esi]
or al,al
jnz extra_characters_on_line
cmp bx,if_directive-instruction_handler
je close_skip_parsing_block
cmp bx,repeat_directive-instruction_handler
je close_skip_parsing_block
cmp bx,while_directive-instruction_handler
je close_skip_parsing_block
jmp skip_parsing
close_skip_parsing_block:
cmp [blocks_stack],0
je unexpected_instruction
cmp bx,[esp+2]
jne unexpected_instruction
dec [blocks_stack]
pop eax edx
test al,1
jz skip_parsing
cmp bx,if_directive-instruction_handler
jne parse_next_line
test al,10000b
jz parse_next_line
mov al,0Fh
stos byte [edi]
mov eax,[current_line]
stos dword [edi]
inc [parsed_lines]
mov eax,1 + (end_directive-instruction_handler) shl 8
stos dword [edi]
mov eax,1 + (if_directive-instruction_handler) shl 8
stos dword [edi]
jmp parse_next_line
skip_parsing_else:
cmp [blocks_stack],0
je unexpected_instruction
cmp word [esp+2],if_directive-instruction_handler
jne unexpected_instruction
lods byte [esi]
or al,al
jz skip_parsing_pure_else
cmp al,1Ah
jne extra_characters_on_line
push edi
movzx ecx,byte [esi]
inc esi
call get_instruction
jc extra_characters_on_line
pop edi
cmp bx,if_directive-instruction_handler
jne extra_characters_on_line
mov al,[esp]
test al,1
jz skip_parsing_contents
test al,100b
jnz skip_parsing_contents
test al,10000b
jnz parse_else_if
xor al,al
mov [esp],al
mov al,0Fh
stos byte [edi]
mov eax,[current_line]
stos dword [edi]
inc [parsed_lines]
parse_else_if:
mov eax,1 + (if_directive-instruction_handler) shl 8
stos dword [edi]
jmp parse_if
skip_parsing_pure_else:
bts dword [esp],1
jc unexpected_instruction
mov al,[esp]
test al,1
jz skip_parsing
test al,100b
jnz skip_parsing
and al,not 1
or al,1000b
mov [esp],al
jmp parse_next_line
 
parse_line_contents:
mov [parenthesis_stack],0
parse_instruction_arguments:
cmp bx,prefix_instruction-instruction_handler
je allow_embedded_instruction
cmp bx,times_directive-instruction_handler
je parse_times_directive
cmp bx,end_directive-instruction_handler
je allow_embedded_instruction
cmp bx,label_directive-instruction_handler
je parse_label_directive
cmp bx,segment_directive-instruction_handler
je parse_segment_directive
cmp bx,load_directive-instruction_handler
je parse_load_directive
cmp bx,extrn_directive-instruction_handler
je parse_extrn_directive
cmp bx,public_directive-instruction_handler
je parse_public_directive
cmp bx,section_directive-instruction_handler
je parse_formatter_argument
cmp bx,format_directive-instruction_handler
je parse_formatter_argument
cmp bx,data_directive-instruction_handler
je parse_formatter_argument
jmp parse_argument
parse_formatter_argument:
or [formatter_symbols_allowed],-1
parse_argument:
lea eax,[edi+100h]
cmp eax,[labels_list]
jae out_of_memory
lods byte [esi]
cmp al,':'
je instruction_separator
cmp al,','
je separator
cmp al,'='
je expression_comparator
cmp al,'|'
je separator
cmp al,'&'
je separator
cmp al,'~'
je separator
cmp al,'>'
je greater
cmp al,'<'
je less
cmp al,')'
je close_parenthesis
or al,al
jz contents_parsed
cmp al,'['
je address_argument
cmp al,']'
je separator
cmp al,'{'
je open_decorator
cmp al,'}'
je close_decorator
cmp al,'#'
je unallowed_character
cmp al,'`'
je unallowed_character
cmp al,3Bh
je foreign_argument
cmp [decorator_symbols_allowed],0
je not_a_separator
cmp al,'-'
je separator
not_a_separator:
dec esi
cmp al,1Ah
jne expression_argument
push edi
mov edi,directive_operators
call get_operator
or al,al
jnz operator_argument
inc esi
movzx ecx,byte [esi]
inc esi
call get_symbol
jnc symbol_argument
cmp ecx,1
jne check_argument
cmp byte [esi],'?'
jne check_argument
pop edi
movs byte [edi],[esi]
jmp argument_parsed
foreign_argument:
dec esi
call skip_foreign_line
jmp contents_parsed
symbol_argument:
pop edi
stos word [edi]
cmp byte [esi],'+'
jne argument_parsed
and ax,0F0FFh
cmp ax,6010h
jne argument_parsed
movs byte [edi],[esi]
jmp argument_parsed
operator_argument:
pop edi
cmp al,85h
je ptr_argument
stos byte [edi]
cmp al,8Ch
je forced_expression
cmp al,81h
je forced_parenthesis
cmp al,80h
je parse_at_operator
cmp al,82h
je parse_from_operator
cmp al,89h
je parse_label_operator
cmp al,0F8h
je forced_expression
jmp argument_parsed
instruction_separator:
stos byte [edi]
allow_embedded_instruction:
cmp byte [esi],1Ah
jne parse_argument
push edi
inc esi
movzx ecx,byte [esi]
inc esi
call get_instruction
jnc embedded_instruction
call get_data_directive
jnc embedded_instruction
pop edi
sub esi,2
jmp parse_argument
embedded_instruction:
pop edi
mov dl,al
mov al,1
stos byte [edi]
mov ax,bx
stos word [edi]
mov al,dl
stos byte [edi]
jmp parse_instruction_arguments
parse_times_directive:
mov al,'('
stos byte [edi]
call convert_expression
mov al,')'
stos byte [edi]
cmp byte [esi],':'
jne allow_embedded_instruction
movs byte [edi],[esi]
jmp allow_embedded_instruction
parse_segment_directive:
or [formatter_symbols_allowed],-1
parse_label_directive:
cmp byte [esi],1Ah
jne argument_parsed
push esi
inc esi
movzx ecx,byte [esi]
inc esi
call identify_label
pop ebx
cmp eax,0Fh
je non_label_identified
mov byte [edi],2
inc edi
stos dword [edi]
xor al,al
stos byte [edi]
jmp argument_parsed
non_label_identified:
mov esi,ebx
jmp argument_parsed
parse_load_directive:
cmp byte [esi],1Ah
jne argument_parsed
push esi
inc esi
movzx ecx,byte [esi]
inc esi
call get_label_id
pop ebx
cmp eax,0Fh
je non_label_identified
mov byte [edi],2
inc edi
stos dword [edi]
xor al,al
stos byte [edi]
jmp argument_parsed
parse_public_directive:
cmp byte [esi],1Ah
jne parse_argument
inc esi
push esi
movzx ecx,byte [esi]
inc esi
push esi ecx
push edi
or [formatter_symbols_allowed],-1
call get_symbol
mov [formatter_symbols_allowed],0
pop edi
jc parse_public_label
cmp al,1Dh
jne parse_public_label
add esp,12
stos word [edi]
jmp parse_public_directive
parse_public_label:
pop ecx esi
mov al,2
stos byte [edi]
call get_label_id
stos dword [edi]
mov ax,8600h
stos word [edi]
pop ebx
push ebx esi edi
mov edi,directive_operators
call get_operator
pop edi edx ebx
cmp al,86h
je argument_parsed
mov esi,edx
xchg esi,ebx
movzx ecx,byte [esi]
inc esi
mov ax,'('
stos word [edi]
mov eax,ecx
stos dword [edi]
rep movs byte [edi],[esi]
xor al,al
stos byte [edi]
xchg esi,ebx
jmp argument_parsed
parse_extrn_directive:
cmp byte [esi],22h
je parse_quoted_extrn
cmp byte [esi],1Ah
jne parse_argument
push esi
movzx ecx,byte [esi+1]
add esi,2
mov ax,'('
stos word [edi]
mov eax,ecx
stos dword [edi]
rep movs byte [edi],[esi]
mov ax,8600h
stos word [edi]
pop esi
parse_label_operator:
cmp byte [esi],1Ah
jne argument_parsed
inc esi
movzx ecx,byte [esi]
inc esi
mov al,2
stos byte [edi]
call get_label_id
stos dword [edi]
xor al,al
stos byte [edi]
jmp argument_parsed
parse_from_operator:
cmp byte [esi],22h
je argument_parsed
parse_at_operator:
cmp byte [esi],':'
je argument_parsed
jmp forced_multipart_expression
parse_quoted_extrn:
inc esi
mov ax,'('
stos word [edi]
lods dword [esi]
mov ecx,eax
stos dword [edi]
rep movs byte [edi],[esi]
xor al,al
stos byte [edi]
push esi edi
mov edi,directive_operators
call get_operator
mov edx,esi
pop edi esi
cmp al,86h
jne argument_parsed
stos byte [edi]
mov esi,edx
jmp parse_label_operator
ptr_argument:
call parse_address
jmp address_parsed
check_argument:
push esi ecx
sub esi,2
mov edi,single_operand_operators
call get_operator
pop ecx esi
or al,al
jnz not_instruction
call get_instruction
jnc embedded_instruction
call get_data_directive
jnc embedded_instruction
not_instruction:
pop edi
sub esi,2
expression_argument:
cmp byte [esi],22h
jne not_string
mov eax,[esi+1]
lea ebx,[esi+5+eax]
push ebx ecx esi edi
call parse_expression
pop eax edx ecx ebx
cmp esi,ebx
jne expression_argument_parsed
mov edi,eax
mov esi,edx
string_argument:
inc esi
mov ax,'('
stos word [edi]
lods dword [esi]
mov ecx,eax
stos dword [edi]
shr ecx,1
jnc string_movsb_ok
movs byte [edi],[esi]
string_movsb_ok:
shr ecx,1
jnc string_movsw_ok
movs word [edi],[esi]
string_movsw_ok:
rep movs dword [edi],[esi]
xor al,al
stos byte [edi]
jmp expression_argument_parsed
parse_expression:
mov al,'('
stos byte [edi]
call convert_expression
mov al,')'
stos byte [edi]
ret
not_string:
cmp byte [esi],'('
jne expression
mov eax,esp
sub eax,[stack_limit]
cmp eax,100h
jb stack_overflow
push esi edi
inc esi
mov al,91h
stos byte [edi]
inc [parenthesis_stack]
jmp parse_argument
expression_comparator:
stos byte [edi]
jmp forced_expression
greater:
cmp byte [esi],'='
jne separator
inc esi
mov al,0F2h
jmp separator
less:
cmp byte [edi-1],0F6h
je separator
cmp byte [esi],'>'
je not_equal
cmp byte [esi],'='
jne separator
inc esi
mov al,0F3h
jmp separator
not_equal:
inc esi
mov al,0F1h
jmp expression_comparator
expression:
call parse_expression
jmp expression_argument_parsed
forced_expression:
xor al,al
xchg al,[formatter_symbols_allowed]
push eax
call parse_expression
forced_expression_parsed:
pop eax
mov [formatter_symbols_allowed],al
jmp argument_parsed
forced_multipart_expression:
xor al,al
xchg al,[formatter_symbols_allowed]
push eax
call parse_expression
cmp byte [esi],':'
jne forced_expression_parsed
movs byte [edi],[esi]
call parse_expression
jmp forced_expression_parsed
address_argument:
call parse_address
lods byte [esi]
cmp al,']'
je address_parsed
cmp al,','
je divided_address
dec esi
mov al,')'
stos byte [edi]
jmp argument_parsed
divided_address:
mov ax,'),'
stos word [edi]
jmp expression
address_parsed:
mov al,']'
stos byte [edi]
jmp argument_parsed
parse_address:
mov al,'['
stos byte [edi]
cmp word [esi],021Ah
jne convert_address
push esi
add esi,4
lea ebx,[esi+1]
cmp byte [esi],':'
pop esi
jne convert_address
add esi,2
mov ecx,2
push ebx edi
call get_symbol
pop edi esi
jc unknown_segment_prefix
cmp al,10h
jne unknown_segment_prefix
mov al,ah
and ah,11110000b
cmp ah,30h
jne unknown_segment_prefix
add al,30h
stos byte [edi]
jmp convert_address
unknown_segment_prefix:
sub esi,5
convert_address:
push edi
mov edi,address_sizes
call get_operator
pop edi
or al,al
jz convert_expression
add al,70h
stos byte [edi]
jmp convert_expression
forced_parenthesis:
cmp byte [esi],'('
jne argument_parsed
inc esi
mov al,91h
jmp separator
unallowed_character:
mov al,0FFh
jmp separator
open_decorator:
inc [decorator_symbols_allowed]
jmp separator
close_decorator:
dec [decorator_symbols_allowed]
jmp separator
close_parenthesis:
mov al,92h
separator:
stos byte [edi]
argument_parsed:
cmp [parenthesis_stack],0
je parse_argument
dec [parenthesis_stack]
add esp,8
jmp argument_parsed
expression_argument_parsed:
cmp [parenthesis_stack],0
je parse_argument
cmp byte [esi],')'
jne argument_parsed
dec [parenthesis_stack]
pop edi esi
jmp expression
contents_parsed:
cmp [parenthesis_stack],0
je contents_ok
dec [parenthesis_stack]
add esp,8
jmp contents_parsed
contents_ok:
ret
 
identify_label:
cmp byte [esi],'.'
je local_label_name
call get_label_id
cmp eax,10h
jb label_identified
or ebx,ebx
jz anonymous_label_name
dec ebx
mov [current_locals_prefix],ebx
label_identified:
ret
anonymous_label_name:
cmp byte [esi-1],'@'
je anonymous_label_name_ok
mov eax,0Fh
anonymous_label_name_ok:
ret
local_label_name:
call get_label_id
ret
 
get_operator:
cmp byte [esi],1Ah
jne get_simple_operator
mov edx,esi
push ebp
inc esi
lods byte [esi]
movzx ebp,al
push edi
mov ecx,ebp
call lower_case
pop edi
check_operator:
mov esi,converted
movzx ecx,byte [edi]
jecxz no_operator
inc edi
mov ebx,edi
add ebx,ecx
cmp ecx,ebp
jne next_operator
repe cmps byte [esi],[edi]
je operator_found
jb no_operator
next_operator:
mov edi,ebx
inc edi
jmp check_operator
no_operator:
mov esi,edx
mov ecx,ebp
pop ebp
no_simple_operator:
xor al,al
ret
operator_found:
lea esi,[edx+2+ebp]
mov ecx,ebp
pop ebp
mov al,[edi]
ret
get_simple_operator:
mov al,[esi]
cmp al,22h
je no_simple_operator
simple_operator:
cmp byte [edi],1
jb no_simple_operator
ja simple_next_operator
cmp al,[edi+1]
je simple_operator_found
simple_next_operator:
movzx ecx,byte [edi]
lea edi,[edi+1+ecx+1]
jmp simple_operator
simple_operator_found:
inc esi
mov al,[edi+2]
ret
 
get_symbol:
push esi
mov ebp,ecx
call lower_case
mov ecx,ebp
cmp cl,11
ja no_symbol
sub cl,1
jc no_symbol
movzx ebx,word [symbols+ecx*4]
add ebx,symbols
movzx edx,word [symbols+ecx*4+2]
scan_symbols:
or edx,edx
jz no_symbol
mov eax,edx
shr eax,1
lea edi,[ebp+2]
imul eax,edi
lea edi,[ebx+eax]
mov esi,converted
mov ecx,ebp
repe cmps byte [esi],[edi]
ja symbols_up
jb symbols_down
mov ax,[edi]
cmp al,18h
jb symbol_ok
cmp al,1Fh
je decorator_symbol
cmp [formatter_symbols_allowed],0
je no_symbol
symbol_ok:
pop esi
add esi,ebp
clc
ret
decorator_symbol:
cmp [decorator_symbols_allowed],0
jne symbol_ok
no_symbol:
pop esi
mov ecx,ebp
stc
ret
symbols_down:
shr edx,1
jmp scan_symbols
symbols_up:
lea ebx,[edi+ecx+2]
shr edx,1
adc edx,-1
jmp scan_symbols
 
get_data_directive:
push esi
mov ebp,ecx
call lower_case
mov ecx,ebp
cmp cl,4
ja no_instruction
sub cl,2
jc no_instruction
movzx ebx,word [data_directives+ecx*4]
add ebx,data_directives
movzx edx,word [data_directives+ecx*4+2]
jmp scan_instructions
 
get_instruction:
push esi
mov ebp,ecx
call lower_case
mov ecx,ebp
cmp cl,17
ja no_instruction
sub cl,2
jc no_instruction
movzx ebx,word [instructions+ecx*4]
add ebx,instructions
movzx edx,word [instructions+ecx*4+2]
scan_instructions:
or edx,edx
jz no_instruction
mov eax,edx
shr eax,1
lea edi,[ebp+3]
imul eax,edi
lea edi,[ebx+eax]
mov esi,converted
mov ecx,ebp
repe cmps byte [esi],[edi]
ja instructions_up
jb instructions_down
pop esi
add esi,ebp
mov al,[edi]
mov bx,[edi+1]
clc
ret
no_instruction:
pop esi
mov ecx,ebp
stc
ret
instructions_down:
shr edx,1
jmp scan_instructions
instructions_up:
lea ebx,[edi+ecx+3]
shr edx,1
adc edx,-1
jmp scan_instructions
 
get_label_id:
cmp ecx,100h
jae name_too_long
cmp byte [esi],'@'
je anonymous_label
cmp byte [esi],'.'
jne standard_label
cmp byte [esi+1],'.'
je standard_label
cmp [current_locals_prefix],0
je standard_label
push edi
mov edi,[additional_memory_end]
sub edi,2
sub edi,ecx
push ecx esi
mov esi,[current_locals_prefix]
lods byte [esi]
movzx ecx,al
sub edi,ecx
cmp edi,[free_additional_memory]
jb out_of_memory
mov word [edi],0
add edi,2
mov ebx,edi
rep movs byte [edi],[esi]
pop esi ecx
add al,cl
jc name_too_long
rep movs byte [edi],[esi]
pop edi
push ebx esi
movzx ecx,al
mov byte [ebx-1],al
mov esi,ebx
call get_label_id
pop esi ebx
cmp ebx,[eax+24]
jne composed_label_id_ok
lea edx,[ebx-2]
mov [additional_memory_end],edx
composed_label_id_ok:
ret
anonymous_label:
cmp ecx,2
jne standard_label
mov al,[esi+1]
mov ebx,characters
xlat byte [ebx]
cmp al,'@'
je new_anonymous
cmp al,'b'
je anonymous_back
cmp al,'r'
je anonymous_back
cmp al,'f'
jne standard_label
add esi,2
mov eax,[anonymous_forward]
or eax,eax
jnz anonymous_ok
mov eax,[current_line]
mov [error_line],eax
call allocate_label
mov [anonymous_forward],eax
anonymous_ok:
xor ebx,ebx
ret
anonymous_back:
mov eax,[anonymous_reverse]
add esi,2
or eax,eax
jz bogus_anonymous
jmp anonymous_ok
bogus_anonymous:
call allocate_label
mov [anonymous_reverse],eax
jmp anonymous_ok
new_anonymous:
add esi,2
mov eax,[anonymous_forward]
or eax,eax
jnz new_anonymous_ok
call allocate_label
new_anonymous_ok:
mov [anonymous_reverse],eax
mov [anonymous_forward],0
jmp anonymous_ok
standard_label:
cmp byte [esi],'%'
je get_predefined_id
cmp byte [esi],'$'
je current_address_label
cmp byte [esi],'?'
jne find_label
cmp ecx,1
jne find_label
inc esi
mov eax,0Fh
ret
current_address_label:
cmp ecx,3
je current_address_label_3_characters
ja find_label
inc esi
cmp ecx,1
jbe get_current_offset_id
inc esi
cmp byte [esi-1],'$'
je get_org_origin_id
cmp byte [esi-1],'%'
je get_file_offset_id
sub esi,2
jmp find_label
get_current_offset_id:
xor eax,eax
ret
get_counter_id:
mov eax,1
ret
get_timestamp_id:
mov eax,2
ret
get_org_origin_id:
mov eax,3
ret
get_file_offset_id:
mov eax,4
ret
current_address_label_3_characters:
cmp word [esi+1],'%%'
jne find_label
add esi,3
get_actual_file_offset_id:
mov eax,5
ret
get_predefined_id:
cmp ecx,2
ja find_label
inc esi
cmp cl,1
je get_counter_id
lods byte [esi]
mov ebx,characters
xlat [ebx]
cmp al,'t'
je get_timestamp_id
sub esi,2
find_label:
xor ebx,ebx
mov eax,2166136261
mov ebp,16777619
hash_label:
xor al,[esi+ebx]
mul ebp
inc bl
cmp bl,cl
jb hash_label
mov ebp,eax
shl eax,8
and ebp,0FFh shl 24
xor ebp,eax
or ebp,ebx
mov [label_hash],ebp
push edi esi
push ecx
mov ecx,32
mov ebx,hash_tree
follow_tree:
mov edx,[ebx]
or edx,edx
jz extend_tree
xor eax,eax
shl ebp,1
adc eax,0
lea ebx,[edx+eax*4]
dec ecx
jnz follow_tree
mov [label_leaf],ebx
pop edx
mov eax,[ebx]
or eax,eax
jz add_label
mov ebx,esi
mov ebp,[label_hash]
compare_labels:
mov esi,ebx
mov ecx,edx
mov edi,[eax+4]
mov edi,[edi+24]
repe cmps byte [esi],[edi]
je label_found
mov eax,[eax]
or eax,eax
jnz compare_labels
jmp add_label
label_found:
add esp,4
pop edi
mov eax,[eax+4]
ret
extend_tree:
mov edx,[free_additional_memory]
lea eax,[edx+8]
cmp eax,[additional_memory_end]
ja out_of_memory
mov [free_additional_memory],eax
xor eax,eax
mov [edx],eax
mov [edx+4],eax
shl ebp,1
adc eax,0
mov [ebx],edx
lea ebx,[edx+eax*4]
dec ecx
jnz extend_tree
mov [label_leaf],ebx
pop edx
add_label:
mov ecx,edx
pop esi
cmp byte [esi-2],0
je label_name_ok
mov al,[esi]
cmp al,30h
jb name_first_char_ok
cmp al,39h
jbe numeric_name
name_first_char_ok:
cmp al,'$'
jne check_for_reserved_word
numeric_name:
add esi,ecx
reserved_word:
mov eax,0Fh
pop edi
ret
check_for_reserved_word:
call get_instruction
jnc reserved_word
call get_data_directive
jnc reserved_word
call get_symbol
jnc reserved_word
sub esi,2
mov edi,operators
call get_operator
or al,al
jnz reserved_word
mov edi,single_operand_operators
call get_operator
or al,al
jnz reserved_word
mov edi,directive_operators
call get_operator
or al,al
jnz reserved_word
inc esi
movzx ecx,byte [esi]
inc esi
label_name_ok:
mov edx,[free_additional_memory]
lea eax,[edx+8]
cmp eax,[additional_memory_end]
ja out_of_memory
mov [free_additional_memory],eax
mov ebx,esi
add esi,ecx
mov eax,[label_leaf]
mov edi,[eax]
mov [edx],edi
mov [eax],edx
call allocate_label
mov [edx+4],eax
mov [eax+24],ebx
pop edi
ret
allocate_label:
mov eax,[labels_list]
mov ecx,LABEL_STRUCTURE_SIZE shr 2
initialize_label:
sub eax,4
mov dword [eax],0
loop initialize_label
mov [labels_list],eax
ret
 
LABEL_STRUCTURE_SIZE = 32
/programs/develop/koldbg/fasm/preproce.inc
0,0 → 1,2899
 
; flat assembler core
; Copyright (c) 1999-2019, Tomasz Grysztar.
; All rights reserved.
 
preprocessor:
mov edi,characters
xor al,al
make_characters_table:
stosb
inc al
jnz make_characters_table
mov esi,characters+'a'
mov edi,characters+'A'
mov ecx,26
rep movsb
mov edi,characters
mov esi,symbol_characters+1
movzx ecx,byte [esi-1]
xor eax,eax
mark_symbol_characters:
lodsb
mov byte [edi+eax],0
loop mark_symbol_characters
mov edi,locals_counter
mov ax,1 + '0' shl 8
stos word [edi]
mov edi,[memory_start]
mov [include_paths],edi
mov esi,include_variable
call get_environment_variable
xor al,al
stos byte [edi]
mov [memory_start],edi
mov eax,[additional_memory]
mov [free_additional_memory],eax
mov eax,[additional_memory_end]
mov [labels_list],eax
xor eax,eax
mov [source_start],eax
mov [tagged_blocks],eax
mov [hash_tree],eax
mov [error],eax
mov [macro_status],al
mov [current_line],eax
mov esi,[initial_definitions]
test esi,esi
jz predefinitions_ok
process_predefinitions:
movzx ecx,byte [esi]
test ecx,ecx
jz predefinitions_ok
inc esi
lea eax,[esi+ecx]
push eax
mov ch,10b
call add_preprocessor_symbol
pop esi
mov edi,[memory_start]
mov [edx+8],edi
convert_predefinition:
cmp edi,[memory_end]
jae out_of_memory
lods byte [esi]
or al,al
jz predefinition_converted
cmp al,20h
je convert_predefinition
mov ah,al
mov ebx,characters
xlat byte [ebx]
or al,al
jz predefinition_separator
cmp ah,27h
je predefinition_string
cmp ah,22h
je predefinition_string
mov byte [edi],1Ah
scas word [edi]
xchg al,ah
stos byte [edi]
mov ebx,characters
xor ecx,ecx
predefinition_symbol:
lods byte [esi]
stos byte [edi]
xlat byte [ebx]
or al,al
loopnzd predefinition_symbol
neg ecx
cmp ecx,255
ja invalid_definition
mov ebx,edi
sub ebx,ecx
mov byte [ebx-2],cl
found_predefinition_separator:
dec edi
mov ah,[esi-1]
predefinition_separator:
xchg al,ah
or al,al
jz predefinition_converted
cmp al,20h
je convert_predefinition
cmp al,3Bh
je invalid_definition
cmp al,5Ch
je predefinition_backslash
stos byte [edi]
jmp convert_predefinition
predefinition_string:
mov al,22h
stos byte [edi]
scas dword [edi]
mov ebx,edi
copy_predefinition_string:
lods byte [esi]
stos byte [edi]
or al,al
jz invalid_definition
cmp al,ah
jne copy_predefinition_string
lods byte [esi]
cmp al,ah
je copy_predefinition_string
dec esi
dec edi
mov eax,edi
sub eax,ebx
mov [ebx-4],eax
jmp convert_predefinition
predefinition_backslash:
mov byte [edi],0
lods byte [esi]
or al,al
jz invalid_definition
cmp al,20h
je invalid_definition
cmp al,3Bh
je invalid_definition
mov al,1Ah
stos byte [edi]
mov ecx,edi
mov ax,5C01h
stos word [edi]
dec esi
group_predefinition_backslashes:
lods byte [esi]
cmp al,5Ch
jne predefinition_backslashed_symbol
stos byte [edi]
inc byte [ecx]
jmp group_predefinition_backslashes
predefinition_backslashed_symbol:
cmp al,20h
je invalid_definition
cmp al,22h
je invalid_definition
cmp al,27h
je invalid_definition
cmp al,3Bh
je invalid_definition
mov ah,al
mov ebx,characters
xlat byte [ebx]
or al,al
jz predefinition_backslashed_symbol_character
mov al,ah
convert_predefinition_backslashed_symbol:
stos byte [edi]
xlat byte [ebx]
or al,al
jz found_predefinition_separator
inc byte [ecx]
jz invalid_definition
lods byte [esi]
jmp convert_predefinition_backslashed_symbol
predefinition_backslashed_symbol_character:
mov al,ah
stos byte [edi]
inc byte [ecx]
jmp convert_predefinition
predefinition_converted:
mov [memory_start],edi
sub edi,[edx+8]
mov [edx+12],edi
jmp process_predefinitions
predefinitions_ok:
mov esi,[input_file]
mov edx,esi
call open
jc main_file_not_found
mov edi,[memory_start]
call preprocess_file
cmp [macro_status],0
je process_postponed
mov eax,[error_line]
mov [current_line],eax
jmp incomplete_macro
process_postponed:
mov edx,hash_tree
mov ecx,32
find_postponed_list:
mov edx,[edx]
or edx,edx
loopnz find_postponed_list
jz preprocessing_finished
process_postponed_list:
mov eax,[edx]
or eax,eax
jz preprocessing_finished
push edx
mov ebx,edx
find_earliest_postponed:
mov eax,[edx]
or eax,eax
jz earliest_postponed_found
mov ebx,edx
mov edx,eax
jmp find_earliest_postponed
earliest_postponed_found:
mov [ebx],eax
call use_postponed_macro
pop edx
cmp [macro_status],0
je process_postponed_list
mov eax,[error_line]
mov [current_line],eax
jmp incomplete_macro
preprocessing_finished:
mov [source_start],edi
ret
use_postponed_macro:
lea esi,[edi-1]
push ecx esi
mov [struc_name],0
jmp use_macro
 
preprocess_file:
push [memory_end]
push esi
mov al,2
xor edx,edx
call lseek
push eax
xor al,al
xor edx,edx
call lseek
pop ecx
mov edx,[memory_end]
dec edx
mov byte [edx],1Ah
sub edx,ecx
jc out_of_memory
mov esi,edx
cmp edx,edi
jbe out_of_memory
mov [memory_end],edx
call read
call close
pop edx
xor ecx,ecx
mov ebx,esi
preprocess_source:
inc ecx
mov [current_line],edi
mov eax,edx
stos dword [edi]
mov eax,ecx
stos dword [edi]
mov eax,esi
sub eax,ebx
stos dword [edi]
xor eax,eax
stos dword [edi]
push ebx edx
call convert_line
call preprocess_line
pop edx ebx
next_line:
cmp byte [esi-1],0
je file_end
cmp byte [esi-1],1Ah
jne preprocess_source
file_end:
pop [memory_end]
clc
ret
 
convert_line:
push ecx
test [macro_status],0Fh
jz convert_line_data
mov ax,3Bh
stos word [edi]
convert_line_data:
cmp edi,[memory_end]
jae out_of_memory
lods byte [esi]
cmp al,20h
je convert_line_data
cmp al,9
je convert_line_data
mov ah,al
mov ebx,characters
xlat byte [ebx]
or al,al
jz convert_separator
cmp ah,27h
je convert_string
cmp ah,22h
je convert_string
mov byte [edi],1Ah
scas word [edi]
xchg al,ah
stos byte [edi]
mov ebx,characters
xor ecx,ecx
convert_symbol:
lods byte [esi]
stos byte [edi]
xlat byte [ebx]
or al,al
loopnzd convert_symbol
neg ecx
cmp ecx,255
ja name_too_long
mov ebx,edi
sub ebx,ecx
mov byte [ebx-2],cl
found_separator:
dec edi
mov ah,[esi-1]
convert_separator:
xchg al,ah
cmp al,20h
jb control_character
je convert_line_data
symbol_character:
cmp al,3Bh
je ignore_comment
cmp al,5Ch
je backslash_character
stos byte [edi]
jmp convert_line_data
control_character:
cmp al,1Ah
je line_end
cmp al,0Dh
je cr_character
cmp al,0Ah
je lf_character
cmp al,9
je convert_line_data
or al,al
jnz symbol_character
jmp line_end
lf_character:
lods byte [esi]
cmp al,0Dh
je line_end
dec esi
jmp line_end
cr_character:
lods byte [esi]
cmp al,0Ah
je line_end
dec esi
jmp line_end
convert_string:
mov al,22h
stos byte [edi]
scas dword [edi]
mov ebx,edi
copy_string:
lods byte [esi]
stos byte [edi]
cmp al,0Ah
je no_end_quote
cmp al,0Dh
je no_end_quote
or al,al
jz no_end_quote
cmp al,1Ah
je no_end_quote
cmp al,ah
jne copy_string
lods byte [esi]
cmp al,ah
je copy_string
dec esi
dec edi
mov eax,edi
sub eax,ebx
mov [ebx-4],eax
jmp convert_line_data
backslash_character:
mov byte [edi],0
lods byte [esi]
cmp al,20h
je concatenate_lines
cmp al,9
je concatenate_lines
cmp al,1Ah
je unexpected_end_of_file
or al,al
jz unexpected_end_of_file
cmp al,0Ah
je concatenate_lf
cmp al,0Dh
je concatenate_cr
cmp al,3Bh
je find_concatenated_line
mov al,1Ah
stos byte [edi]
mov ecx,edi
mov ax,5C01h
stos word [edi]
dec esi
group_backslashes:
lods byte [esi]
cmp al,5Ch
jne backslashed_symbol
stos byte [edi]
inc byte [ecx]
jz name_too_long
jmp group_backslashes
no_end_quote:
mov byte [ebx-5],0
jmp missing_end_quote
backslashed_symbol:
cmp al,1Ah
je unexpected_end_of_file
or al,al
jz unexpected_end_of_file
cmp al,0Ah
je extra_characters_on_line
cmp al,0Dh
je extra_characters_on_line
cmp al,20h
je extra_characters_on_line
cmp al,9
je extra_characters_on_line
cmp al,22h
je extra_characters_on_line
cmp al,27h
je extra_characters_on_line
cmp al,3Bh
je extra_characters_on_line
mov ah,al
mov ebx,characters
xlat byte [ebx]
or al,al
jz backslashed_symbol_character
mov al,ah
convert_backslashed_symbol:
stos byte [edi]
xlat byte [ebx]
or al,al
jz found_separator
inc byte [ecx]
jz name_too_long
lods byte [esi]
jmp convert_backslashed_symbol
backslashed_symbol_character:
mov al,ah
stos byte [edi]
inc byte [ecx]
jmp convert_line_data
concatenate_lines:
lods byte [esi]
cmp al,20h
je concatenate_lines
cmp al,9
je concatenate_lines
cmp al,1Ah
je unexpected_end_of_file
or al,al
jz unexpected_end_of_file
cmp al,0Ah
je concatenate_lf
cmp al,0Dh
je concatenate_cr
cmp al,3Bh
jne extra_characters_on_line
find_concatenated_line:
lods byte [esi]
cmp al,0Ah
je concatenate_lf
cmp al,0Dh
je concatenate_cr
or al,al
jz concatenate_ok
cmp al,1Ah
jne find_concatenated_line
jmp unexpected_end_of_file
concatenate_lf:
lods byte [esi]
cmp al,0Dh
je concatenate_ok
dec esi
jmp concatenate_ok
concatenate_cr:
lods byte [esi]
cmp al,0Ah
je concatenate_ok
dec esi
concatenate_ok:
inc dword [esp]
jmp convert_line_data
ignore_comment:
lods byte [esi]
cmp al,0Ah
je lf_character
cmp al,0Dh
je cr_character
or al,al
jz line_end
cmp al,1Ah
jne ignore_comment
line_end:
xor al,al
stos byte [edi]
pop ecx
ret
 
lower_case:
mov edi,converted
mov ebx,characters
convert_case:
lods byte [esi]
xlat byte [ebx]
stos byte [edi]
loop convert_case
case_ok:
ret
 
get_directive:
push edi
mov edx,esi
mov ebp,ecx
call lower_case
pop edi
scan_directives:
mov esi,converted
movzx eax,byte [edi]
or al,al
jz no_directive
mov ecx,ebp
inc edi
mov ebx,edi
add ebx,eax
mov ah,[esi]
cmp ah,[edi]
jb no_directive
ja next_directive
cmp cl,al
jne next_directive
repe cmps byte [esi],[edi]
jb no_directive
je directive_found
next_directive:
mov edi,ebx
add edi,2
jmp scan_directives
no_directive:
mov esi,edx
mov ecx,ebp
stc
ret
directive_found:
call get_directive_handler_base
directive_handler:
lea esi,[edx+ebp]
movzx ecx,word [ebx]
add eax,ecx
clc
ret
get_directive_handler_base:
mov eax,[esp]
ret
 
preprocess_line:
mov eax,esp
sub eax,[stack_limit]
cmp eax,100h
jb stack_overflow
push ecx esi
preprocess_current_line:
mov esi,[current_line]
add esi,16
cmp word [esi],3Bh
jne line_start_ok
add esi,2
line_start_ok:
test [macro_status],0F0h
jnz macro_preprocessing
cmp byte [esi],1Ah
jne not_fix_constant
movzx edx,byte [esi+1]
lea edx,[esi+2+edx]
cmp word [edx],031Ah
jne not_fix_constant
mov ebx,characters
movzx eax,byte [edx+2]
xlat byte [ebx]
ror eax,8
mov al,[edx+3]
xlat byte [ebx]
ror eax,8
mov al,[edx+4]
xlat byte [ebx]
ror eax,16
cmp eax,'fix'
je define_fix_constant
not_fix_constant:
call process_fix_constants
jmp initial_preprocessing_ok
macro_preprocessing:
call process_macro_operators
initial_preprocessing_ok:
mov esi,[current_line]
add esi,16
mov al,[macro_status]
test al,2
jnz skip_macro_block
test al,1
jnz find_macro_block
preprocess_instruction:
mov [current_offset],esi
lods byte [esi]
movzx ecx,byte [esi]
inc esi
cmp al,1Ah
jne not_preprocessor_symbol
cmp cl,3
jb not_preprocessor_directive
push edi
mov edi,preprocessor_directives
call get_directive
pop edi
jc not_preprocessor_directive
mov byte [edx-2],3Bh
jmp near eax
not_preprocessor_directive:
xor ch,ch
call get_preprocessor_symbol
jc not_macro
mov byte [ebx-2],3Bh
mov [struc_name],0
jmp use_macro
not_macro:
mov [struc_name],esi
add esi,ecx
lods byte [esi]
cmp al,':'
je preprocess_label
cmp al,1Ah
jne not_preprocessor_symbol
lods byte [esi]
cmp al,3
jne not_symbolic_constant
mov ebx,characters
movzx eax,byte [esi]
xlat byte [ebx]
ror eax,8
mov al,[esi+1]
xlat byte [ebx]
ror eax,8
mov al,[esi+2]
xlat byte [ebx]
ror eax,16
cmp eax,'equ'
je define_equ_constant
mov al,3
not_symbolic_constant:
mov ch,1
mov cl,al
call get_preprocessor_symbol
jc not_preprocessor_symbol
push edx esi
mov esi,[struc_name]
mov [struc_label],esi
sub [struc_label],2
mov cl,[esi-1]
mov ch,10b
call get_preprocessor_symbol
jc struc_name_ok
mov ecx,[edx+12]
add ecx,3
lea ebx,[edi+ecx]
mov ecx,edi
sub ecx,[struc_label]
lea esi,[edi-1]
lea edi,[ebx-1]
std
rep movs byte [edi],[esi]
cld
mov edi,[struc_label]
mov esi,[edx+8]
mov ecx,[edx+12]
add [struc_name],ecx
add [struc_name],3
call move_data
mov al,3Ah
stos byte [edi]
mov ax,3Bh
stos word [edi]
mov edi,ebx
pop esi
add esi,[edx+12]
add esi,3
pop edx
jmp use_macro
struc_name_ok:
mov edx,[struc_name]
movzx eax,byte [edx-1]
add edx,eax
push edi
lea esi,[edi-1]
mov ecx,edi
sub ecx,edx
std
rep movs byte [edi],[esi]
cld
pop edi
inc edi
mov al,3Ah
mov [edx],al
inc al
mov [edx+1],al
pop esi edx
inc esi
jmp use_macro
preprocess_label:
dec esi
sub esi,ecx
lea ebp,[esi-2]
mov ch,10b
call get_preprocessor_symbol
jnc symbolic_constant_in_label
lea esi,[esi+ecx+1]
cmp byte [esi],':'
jne preprocess_instruction
inc esi
jmp preprocess_instruction
symbolic_constant_in_label:
mov ebx,[edx+8]
mov ecx,[edx+12]
add ecx,ebx
check_for_broken_label:
cmp ebx,ecx
je label_broken
cmp byte [ebx],1Ah
jne label_broken
movzx eax,byte [ebx+1]
lea ebx,[ebx+2+eax]
cmp ebx,ecx
je label_constant_ok
cmp byte [ebx],':'
jne label_broken
inc ebx
cmp byte [ebx],':'
jne check_for_broken_label
inc ebx
jmp check_for_broken_label
label_broken:
push line_preprocessed
jmp replace_symbolic_constant
label_constant_ok:
mov ecx,edi
sub ecx,esi
mov edi,[edx+12]
add edi,ebp
push edi
lea eax,[edi+ecx]
push eax
cmp esi,edi
je replace_label
jb move_rest_of_line_up
rep movs byte [edi],[esi]
jmp replace_label
move_rest_of_line_up:
lea esi,[esi+ecx-1]
lea edi,[edi+ecx-1]
std
rep movs byte [edi],[esi]
cld
replace_label:
mov ecx,[edx+12]
mov edi,[esp+4]
sub edi,ecx
mov esi,[edx+8]
rep movs byte [edi],[esi]
pop edi esi
inc esi
jmp preprocess_instruction
not_preprocessor_symbol:
mov esi,[current_offset]
call process_equ_constants
line_preprocessed:
pop esi ecx
ret
 
get_preprocessor_symbol:
push ebp edi esi
mov ebp,ecx
shl ebp,22
movzx ecx,cl
mov ebx,hash_tree
mov edi,10
follow_hashes_roots:
mov edx,[ebx]
or edx,edx
jz preprocessor_symbol_not_found
xor eax,eax
shl ebp,1
adc eax,0
lea ebx,[edx+eax*4]
dec edi
jnz follow_hashes_roots
mov edi,ebx
call calculate_hash
mov ebp,eax
and ebp,3FFh
shl ebp,10
xor ebp,eax
mov ebx,edi
mov edi,22
follow_hashes_tree:
mov edx,[ebx]
or edx,edx
jz preprocessor_symbol_not_found
xor eax,eax
shl ebp,1
adc eax,0
lea ebx,[edx+eax*4]
dec edi
jnz follow_hashes_tree
mov al,cl
mov edx,[ebx]
or edx,edx
jz preprocessor_symbol_not_found
compare_with_preprocessor_symbol:
mov edi,[edx+4]
cmp edi,1
jbe next_equal_hash
repe cmps byte [esi],[edi]
je preprocessor_symbol_found
mov cl,al
mov esi,[esp]
next_equal_hash:
mov edx,[edx]
or edx,edx
jnz compare_with_preprocessor_symbol
preprocessor_symbol_not_found:
pop esi edi ebp
stc
ret
preprocessor_symbol_found:
pop ebx edi ebp
clc
ret
calculate_hash:
xor ebx,ebx
mov eax,2166136261
mov ebp,16777619
fnv1a_hash:
xor al,[esi+ebx]
mul ebp
inc bl
cmp bl,cl
jb fnv1a_hash
ret
add_preprocessor_symbol:
push edi esi
xor eax,eax
or cl,cl
jz reshape_hash
cmp ch,11b
je preprocessor_symbol_name_ok
push ecx
movzx ecx,cl
mov edi,preprocessor_directives
call get_directive
jnc reserved_word_used_as_symbol
pop ecx
preprocessor_symbol_name_ok:
call calculate_hash
reshape_hash:
mov ebp,eax
and ebp,3FFh
shr eax,10
xor ebp,eax
shl ecx,22
or ebp,ecx
mov ebx,hash_tree
mov ecx,32
find_leave_for_symbol:
mov edx,[ebx]
or edx,edx
jz extend_hashes_tree
xor eax,eax
rol ebp,1
adc eax,0
lea ebx,[edx+eax*4]
dec ecx
jnz find_leave_for_symbol
mov edx,[ebx]
or edx,edx
jz add_symbol_entry
shr ebp,30
cmp ebp,11b
je reuse_symbol_entry
cmp dword [edx+4],0
jne add_symbol_entry
find_entry_to_reuse:
mov edi,[edx]
or edi,edi
jz reuse_symbol_entry
cmp dword [edi+4],0
jne reuse_symbol_entry
mov edx,edi
jmp find_entry_to_reuse
add_symbol_entry:
mov eax,edx
mov edx,[labels_list]
sub edx,16
cmp edx,[free_additional_memory]
jb out_of_memory
mov [labels_list],edx
mov [edx],eax
mov [ebx],edx
reuse_symbol_entry:
pop esi edi
mov [edx+4],esi
ret
extend_hashes_tree:
mov edx,[labels_list]
sub edx,8
cmp edx,[free_additional_memory]
jb out_of_memory
mov [labels_list],edx
xor eax,eax
mov [edx],eax
mov [edx+4],eax
shl ebp,1
adc eax,0
mov [ebx],edx
lea ebx,[edx+eax*4]
dec ecx
jnz extend_hashes_tree
mov edx,[labels_list]
sub edx,16
cmp edx,[free_additional_memory]
jb out_of_memory
mov [labels_list],edx
mov dword [edx],0
mov [ebx],edx
pop esi edi
mov [edx+4],esi
ret
 
define_fix_constant:
add edx,5
add esi,2
push edx
mov ch,11b
jmp define_preprocessor_constant
define_equ_constant:
add esi,3
push esi
call process_equ_constants
mov esi,[struc_name]
mov ch,10b
define_preprocessor_constant:
mov byte [esi-2],3Bh
mov cl,[esi-1]
call add_preprocessor_symbol
pop ebx
mov ecx,edi
dec ecx
sub ecx,ebx
mov [edx+8],ebx
mov [edx+12],ecx
jmp line_preprocessed
define_symbolic_constant:
lods byte [esi]
cmp al,1Ah
jne invalid_name
lods byte [esi]
mov cl,al
mov ch,10b
call add_preprocessor_symbol
movzx eax,byte [esi-1]
add esi,eax
lea ecx,[edi-1]
sub ecx,esi
mov [edx+8],esi
mov [edx+12],ecx
jmp line_preprocessed
 
define_struc:
mov ch,1
jmp make_macro
define_macro:
xor ch,ch
make_macro:
lods byte [esi]
cmp al,1Ah
jne invalid_name
lods byte [esi]
mov cl,al
call add_preprocessor_symbol
mov eax,[current_line]
mov [edx+12],eax
movzx eax,byte [esi-1]
add esi,eax
mov [edx+8],esi
mov al,[macro_status]
and al,0F0h
or al,1
mov [macro_status],al
mov eax,[current_line]
mov [error_line],eax
xor ebp,ebp
lods byte [esi]
or al,al
jz line_preprocessed
cmp al,'{'
je found_macro_block
dec esi
skip_macro_arguments:
lods byte [esi]
cmp al,1Ah
je skip_macro_argument
cmp al,'['
jne invalid_macro_arguments
or ebp,-1
jz invalid_macro_arguments
lods byte [esi]
cmp al,1Ah
jne invalid_macro_arguments
skip_macro_argument:
movzx eax,byte [esi]
inc esi
add esi,eax
lods byte [esi]
cmp al,':'
je macro_argument_with_default_value
cmp al,'='
je macro_argument_with_default_value
cmp al,'*'
jne macro_argument_end
lods byte [esi]
macro_argument_end:
cmp al,','
je skip_macro_arguments
cmp al,'&'
je macro_arguments_finisher
cmp al,']'
jne end_macro_arguments
not ebp
macro_arguments_finisher:
lods byte [esi]
end_macro_arguments:
or ebp,ebp
jnz invalid_macro_arguments
or al,al
jz line_preprocessed
cmp al,'{'
je found_macro_block
jmp invalid_macro_arguments
macro_argument_with_default_value:
or [skip_default_argument_value],-1
call skip_macro_argument_value
inc esi
jmp macro_argument_end
skip_macro_argument_value:
cmp byte [esi],'<'
jne simple_argument
mov ecx,1
inc esi
enclosed_argument:
lods byte [esi]
or al,al
jz invalid_macro_arguments
cmp al,1Ah
je enclosed_symbol
cmp al,22h
je enclosed_string
cmp al,'>'
je enclosed_argument_end
cmp al,'<'
jne enclosed_argument
inc ecx
jmp enclosed_argument
enclosed_symbol:
movzx eax,byte [esi]
inc esi
add esi,eax
jmp enclosed_argument
enclosed_string:
lods dword [esi]
add esi,eax
jmp enclosed_argument
enclosed_argument_end:
loop enclosed_argument
lods byte [esi]
or al,al
jz argument_value_end
cmp al,','
je argument_value_end
cmp [skip_default_argument_value],0
je invalid_macro_arguments
cmp al,'{'
je argument_value_end
cmp al,'&'
je argument_value_end
or ebp,ebp
jz invalid_macro_arguments
cmp al,']'
je argument_value_end
jmp invalid_macro_arguments
simple_argument:
lods byte [esi]
or al,al
jz argument_value_end
cmp al,','
je argument_value_end
cmp al,22h
je argument_string
cmp al,1Ah
je argument_symbol
cmp [skip_default_argument_value],0
je simple_argument
cmp al,'{'
je argument_value_end
cmp al,'&'
je argument_value_end
or ebp,ebp
jz simple_argument
cmp al,']'
je argument_value_end
argument_symbol:
movzx eax,byte [esi]
inc esi
add esi,eax
jmp simple_argument
argument_string:
lods dword [esi]
add esi,eax
jmp simple_argument
argument_value_end:
dec esi
ret
find_macro_block:
add esi,2
lods byte [esi]
or al,al
jz line_preprocessed
cmp al,'{'
jne unexpected_characters
found_macro_block:
or [macro_status],2
skip_macro_block:
lods byte [esi]
cmp al,1Ah
je skip_macro_symbol
cmp al,3Bh
je skip_macro_symbol
cmp al,22h
je skip_macro_string
or al,al
jz line_preprocessed
cmp al,'}'
jne skip_macro_block
mov al,[macro_status]
and [macro_status],0F0h
test al,8
jnz use_instant_macro
cmp byte [esi],0
je line_preprocessed
mov ecx,edi
sub ecx,esi
mov edx,esi
lea esi,[esi+ecx-1]
lea edi,[edi+1+16]
mov ebx,edi
dec edi
std
rep movs byte [edi],[esi]
cld
mov edi,edx
xor al,al
stos byte [edi]
mov esi,[current_line]
mov [current_line],edi
mov ecx,4
rep movs dword [edi],[esi]
mov edi,ebx
jmp initial_preprocessing_ok
skip_macro_symbol:
movzx eax,byte [esi]
inc esi
add esi,eax
jmp skip_macro_block
skip_macro_string:
lods dword [esi]
add esi,eax
jmp skip_macro_block
postpone_directive:
push esi
mov esi,edx
xor ecx,ecx
call add_preprocessor_symbol
mov eax,[current_line]
mov [error_line],eax
mov [edx+12],eax
pop esi
mov [edx+8],esi
mov al,[macro_status]
and al,0F0h
or al,1
mov [macro_status],al
lods byte [esi]
or al,al
jz line_preprocessed
cmp al,'{'
jne unexpected_characters
jmp found_macro_block
rept_directive:
mov [base_code],0
jmp define_instant_macro
irp_directive:
mov [base_code],1
jmp define_instant_macro
irps_directive:
mov [base_code],2
jmp define_instant_macro
irpv_directive:
mov [base_code],3
jmp define_instant_macro
match_directive:
mov [base_code],10h
define_instant_macro:
mov al,[macro_status]
and al,0F0h
or al,8+1
mov [macro_status],al
mov eax,[current_line]
mov [error_line],eax
mov [instant_macro_start],esi
cmp [base_code],10h
je prepare_match
skip_parameters:
lods byte [esi]
or al,al
jz parameters_skipped
cmp al,'{'
je parameters_skipped
cmp al,22h
je skip_quoted_parameter
cmp al,1Ah
jne skip_parameters
lods byte [esi]
movzx eax,al
add esi,eax
jmp skip_parameters
skip_quoted_parameter:
lods dword [esi]
add esi,eax
jmp skip_parameters
parameters_skipped:
dec esi
mov [parameters_end],esi
lods byte [esi]
cmp al,'{'
je found_macro_block
or al,al
jnz invalid_macro_arguments
jmp line_preprocessed
prepare_match:
call skip_pattern
mov [value_type],80h+10b
call process_symbolic_constants
jmp parameters_skipped
skip_pattern:
lods byte [esi]
or al,al
jz invalid_macro_arguments
cmp al,','
je pattern_skipped
cmp al,22h
je skip_quoted_string_in_pattern
cmp al,1Ah
je skip_symbol_in_pattern
cmp al,'='
jne skip_pattern
mov al,[esi]
cmp al,1Ah
je skip_pattern
cmp al,22h
je skip_pattern
inc esi
jmp skip_pattern
skip_symbol_in_pattern:
lods byte [esi]
movzx eax,al
add esi,eax
jmp skip_pattern
skip_quoted_string_in_pattern:
lods dword [esi]
add esi,eax
jmp skip_pattern
pattern_skipped:
ret
 
purge_macro:
xor ch,ch
jmp restore_preprocessor_symbol
purge_struc:
mov ch,1
jmp restore_preprocessor_symbol
restore_equ_constant:
mov ch,10b
restore_preprocessor_symbol:
push ecx
lods byte [esi]
cmp al,1Ah
jne invalid_name
lods byte [esi]
mov cl,al
call get_preprocessor_symbol
jc no_symbol_to_restore
mov dword [edx+4],0
jmp symbol_restored
no_symbol_to_restore:
add esi,ecx
symbol_restored:
pop ecx
lods byte [esi]
cmp al,','
je restore_preprocessor_symbol
or al,al
jnz extra_characters_on_line
jmp line_preprocessed
 
process_fix_constants:
mov [value_type],11b
jmp process_symbolic_constants
process_equ_constants:
mov [value_type],10b
process_symbolic_constants:
mov ebp,esi
lods byte [esi]
cmp al,1Ah
je check_symbol
cmp al,22h
je ignore_string
cmp al,'{'
je check_brace
or al,al
jnz process_symbolic_constants
ret
ignore_string:
lods dword [esi]
add esi,eax
jmp process_symbolic_constants
check_brace:
test [value_type],80h
jz process_symbolic_constants
ret
no_replacing:
movzx ecx,byte [esi-1]
add esi,ecx
jmp process_symbolic_constants
check_symbol:
mov cl,[esi]
inc esi
mov ch,[value_type]
call get_preprocessor_symbol
jc no_replacing
mov [current_section],edi
replace_symbolic_constant:
mov ecx,[edx+12]
mov edx,[edx+8]
xchg esi,edx
call move_data
mov esi,edx
process_after_replaced:
lods byte [esi]
cmp al,1Ah
je symbol_after_replaced
stos byte [edi]
cmp al,22h
je string_after_replaced
cmp al,'{'
je brace_after_replaced
or al,al
jnz process_after_replaced
mov ecx,edi
sub ecx,esi
mov edi,ebp
call move_data
mov esi,edi
ret
move_data:
lea eax,[edi+ecx]
cmp eax,[memory_end]
jae out_of_memory
shr ecx,1
jnc movsb_ok
movs byte [edi],[esi]
movsb_ok:
shr ecx,1
jnc movsw_ok
movs word [edi],[esi]
movsw_ok:
rep movs dword [edi],[esi]
ret
string_after_replaced:
lods dword [esi]
stos dword [edi]
mov ecx,eax
call move_data
jmp process_after_replaced
brace_after_replaced:
test [value_type],80h
jz process_after_replaced
mov edx,edi
mov ecx,[current_section]
sub edx,ecx
sub ecx,esi
rep movs byte [edi],[esi]
mov ecx,edi
sub ecx,esi
mov edi,ebp
call move_data
lea esi,[ebp+edx]
ret
symbol_after_replaced:
mov cl,[esi]
inc esi
mov ch,[value_type]
call get_preprocessor_symbol
jnc replace_symbolic_constant
movzx ecx,byte [esi-1]
mov al,1Ah
mov ah,cl
stos word [edi]
call move_data
jmp process_after_replaced
process_macro_operators:
xor dl,dl
mov ebp,edi
before_macro_operators:
mov edi,esi
lods byte [esi]
cmp al,'`'
je symbol_conversion
cmp al,'#'
je concatenation
cmp al,1Ah
je symbol_before_macro_operators
cmp al,3Bh
je no_more_macro_operators
cmp al,22h
je string_before_macro_operators
xor dl,dl
or al,al
jnz before_macro_operators
mov edi,esi
ret
no_more_macro_operators:
mov edi,ebp
ret
symbol_before_macro_operators:
mov dl,1Ah
mov ebx,esi
lods byte [esi]
movzx ecx,al
jecxz symbol_before_macro_operators_ok
mov edi,esi
cmp byte [esi],'\'
je escaped_symbol
symbol_before_macro_operators_ok:
add esi,ecx
jmp before_macro_operators
string_before_macro_operators:
mov dl,22h
mov ebx,esi
lods dword [esi]
add esi,eax
jmp before_macro_operators
escaped_symbol:
dec byte [edi-1]
dec ecx
inc esi
cmp ecx,1
rep movs byte [edi],[esi]
jne after_macro_operators
mov al,[esi-1]
mov ecx,ebx
mov ebx,characters
xlat byte [ebx]
mov ebx,ecx
or al,al
jnz after_macro_operators
sub edi,3
mov al,[esi-1]
stos byte [edi]
xor dl,dl
jmp after_macro_operators
reduce_symbol_conversion:
inc esi
symbol_conversion:
mov edx,esi
mov al,[esi]
cmp al,1Ah
jne symbol_character_conversion
lods word [esi]
movzx ecx,ah
lea ebx,[edi+3]
jecxz convert_to_quoted_string
cmp byte [esi],'\'
jne convert_to_quoted_string
inc esi
dec ecx
dec ebx
jmp convert_to_quoted_string
symbol_character_conversion:
cmp al,22h
je after_macro_operators
cmp al,'`'
je reduce_symbol_conversion
lea ebx,[edi+5]
xor ecx,ecx
or al,al
jz convert_to_quoted_string
cmp al,'#'
je convert_to_quoted_string
inc ecx
convert_to_quoted_string:
sub ebx,edx
ja shift_line_data
mov al,22h
mov dl,al
stos byte [edi]
mov ebx,edi
mov eax,ecx
stos dword [edi]
rep movs byte [edi],[esi]
cmp edi,esi
je before_macro_operators
jmp after_macro_operators
shift_line_data:
push ecx
mov edx,esi
lea esi,[ebp-1]
add ebp,ebx
lea edi,[ebp-1]
lea ecx,[esi+1]
sub ecx,edx
std
rep movs byte [edi],[esi]
cld
pop eax
sub edi,3
mov dl,22h
mov [edi-1],dl
mov ebx,edi
mov [edi],eax
lea esi,[edi+4+eax]
jmp before_macro_operators
concatenation:
cmp dl,1Ah
je symbol_concatenation
cmp dl,22h
je string_concatenation
no_concatenation:
cmp esi,edi
je before_macro_operators
jmp after_macro_operators
symbol_concatenation:
cmp byte [esi],1Ah
jne no_concatenation
inc esi
lods byte [esi]
movzx ecx,al
jecxz do_symbol_concatenation
cmp byte [esi],'\'
je concatenate_escaped_symbol
do_symbol_concatenation:
add [ebx],cl
jc name_too_long
rep movs byte [edi],[esi]
jmp after_macro_operators
concatenate_escaped_symbol:
inc esi
dec ecx
jz do_symbol_concatenation
movzx eax,byte [esi]
cmp byte [characters+eax],0
jne do_symbol_concatenation
sub esi,3
jmp no_concatenation
string_concatenation:
cmp byte [esi],22h
je do_string_concatenation
cmp byte [esi],'`'
jne no_concatenation
concatenate_converted_symbol:
inc esi
mov al,[esi]
cmp al,'`'
je concatenate_converted_symbol
cmp al,22h
je do_string_concatenation
cmp al,1Ah
jne concatenate_converted_symbol_character
inc esi
lods byte [esi]
movzx ecx,al
jecxz finish_concatenating_converted_symbol
cmp byte [esi],'\'
jne finish_concatenating_converted_symbol
inc esi
dec ecx
finish_concatenating_converted_symbol:
add [ebx],ecx
rep movs byte [edi],[esi]
jmp after_macro_operators
concatenate_converted_symbol_character:
or al,al
jz after_macro_operators
cmp al,'#'
je after_macro_operators
inc dword [ebx]
movs byte [edi],[esi]
jmp after_macro_operators
do_string_concatenation:
inc esi
lods dword [esi]
mov ecx,eax
add [ebx],eax
rep movs byte [edi],[esi]
after_macro_operators:
lods byte [esi]
cmp al,'`'
je symbol_conversion
cmp al,'#'
je concatenation
stos byte [edi]
cmp al,1Ah
je symbol_after_macro_operators
cmp al,3Bh
je no_more_macro_operators
cmp al,22h
je string_after_macro_operators
xor dl,dl
or al,al
jnz after_macro_operators
ret
symbol_after_macro_operators:
mov dl,1Ah
mov ebx,edi
lods byte [esi]
stos byte [edi]
movzx ecx,al
jecxz symbol_after_macro_operatorss_ok
cmp byte [esi],'\'
je escaped_symbol
symbol_after_macro_operatorss_ok:
rep movs byte [edi],[esi]
jmp after_macro_operators
string_after_macro_operators:
mov dl,22h
mov ebx,edi
lods dword [esi]
stos dword [edi]
mov ecx,eax
rep movs byte [edi],[esi]
jmp after_macro_operators
 
use_macro:
push [free_additional_memory]
push [macro_symbols]
mov [macro_symbols],0
push [counter_limit]
push dword [edx+4]
mov dword [edx+4],1
push edx
mov ebx,esi
mov esi,[edx+8]
mov eax,[edx+12]
mov [macro_line],eax
mov [counter_limit],0
xor ebp,ebp
process_macro_arguments:
mov al,[esi]
or al,al
jz arguments_end
cmp al,'{'
je arguments_end
inc esi
cmp al,'['
jne get_macro_arguments
mov ebp,esi
inc esi
inc [counter_limit]
get_macro_arguments:
call get_macro_argument
lods byte [esi]
cmp al,','
je next_argument
cmp al,']'
je next_arguments_group
cmp al,'&'
je arguments_end
dec esi
jmp arguments_end
next_argument:
cmp byte [ebx],','
jne process_macro_arguments
inc ebx
jmp process_macro_arguments
next_arguments_group:
cmp byte [ebx],','
jne arguments_end
inc ebx
inc [counter_limit]
mov esi,ebp
jmp process_macro_arguments
get_macro_argument:
lods byte [esi]
movzx ecx,al
mov eax,[counter_limit]
call add_macro_symbol
add esi,ecx
xor eax,eax
mov [default_argument_value],eax
cmp byte [esi],'*'
je required_value
cmp byte [esi],':'
je get_default_value
cmp byte [esi],'='
jne default_value_ok
get_default_value:
inc esi
mov [default_argument_value],esi
or [skip_default_argument_value],-1
call skip_macro_argument_value
jmp default_value_ok
required_value:
inc esi
or [default_argument_value],-1
default_value_ok:
xchg esi,ebx
mov [edx+12],esi
mov [skip_default_argument_value],0
cmp byte [ebx],'&'
je greedy_macro_argument
call skip_macro_argument_value
call finish_macro_argument
jmp got_macro_argument
greedy_macro_argument:
call skip_foreign_line
dec esi
mov eax,[edx+12]
mov ecx,esi
sub ecx,eax
mov [edx+8],ecx
got_macro_argument:
xchg esi,ebx
cmp dword [edx+8],0
jne macro_argument_ok
mov eax,[default_argument_value]
or eax,eax
jz macro_argument_ok
cmp eax,-1
je invalid_macro_arguments
mov [edx+12],eax
call finish_macro_argument
macro_argument_ok:
ret
finish_macro_argument:
mov eax,[edx+12]
mov ecx,esi
sub ecx,eax
cmp byte [eax],'<'
jne argument_value_length_ok
inc dword [edx+12]
sub ecx,2
or ecx,80000000h
argument_value_length_ok:
mov [edx+8],ecx
ret
arguments_end:
cmp byte [ebx],0
jne invalid_macro_arguments
mov eax,[esp+4]
dec eax
call process_macro
pop edx
pop dword [edx+4]
pop [counter_limit]
pop [macro_symbols]
pop [free_additional_memory]
jmp line_preprocessed
use_instant_macro:
push edi [current_line] esi
mov eax,[error_line]
mov [current_line],eax
mov [macro_line],eax
mov esi,[instant_macro_start]
cmp [base_code],10h
jae do_match
cmp [base_code],0
jne do_irp
call precalculate_value
cmp eax,0
jl value_out_of_range
push [free_additional_memory]
push [macro_symbols]
mov [macro_symbols],0
push [counter_limit]
mov [struc_name],0
mov [counter_limit],eax
lods byte [esi]
or al,al
jz rept_counters_ok
cmp al,'{'
je rept_counters_ok
cmp al,1Ah
jne invalid_macro_arguments
add_rept_counter:
lods byte [esi]
movzx ecx,al
xor eax,eax
call add_macro_symbol
add esi,ecx
xor eax,eax
mov dword [edx+12],eax
inc eax
mov dword [edx+8],eax
lods byte [esi]
cmp al,':'
jne rept_counter_added
push edx
call precalculate_value
mov edx,eax
add edx,[counter_limit]
jo value_out_of_range
pop edx
mov dword [edx+8],eax
lods byte [esi]
rept_counter_added:
cmp al,','
jne rept_counters_ok
lods byte [esi]
cmp al,1Ah
jne invalid_macro_arguments
jmp add_rept_counter
rept_counters_ok:
dec esi
cmp [counter_limit],0
je instant_macro_finish
instant_macro_parameters_ok:
xor eax,eax
call process_macro
instant_macro_finish:
pop [counter_limit]
pop [macro_symbols]
pop [free_additional_memory]
instant_macro_done:
pop ebx esi edx
cmp byte [ebx],0
je line_preprocessed
mov [current_line],edi
mov ecx,4
rep movs dword [edi],[esi]
test [macro_status],0Fh
jz instant_macro_attached_line
mov ax,3Bh
stos word [edi]
instant_macro_attached_line:
mov esi,ebx
sub edx,ebx
mov ecx,edx
call move_data
jmp initial_preprocessing_ok
precalculate_value:
push edi
call convert_expression
mov al,')'
stosb
push esi
mov esi,[esp+4]
mov [error_line],0
mov [value_size],0
call calculate_expression
cmp [error_line],0
je value_precalculated
jmp [error]
value_precalculated:
mov eax,[edi]
mov ecx,[edi+4]
cdq
cmp edx,ecx
jne value_out_of_range
cmp dl,[edi+13]
jne value_out_of_range
pop esi edi
ret
do_irp:
cmp byte [esi],1Ah
jne invalid_macro_arguments
movzx eax,byte [esi+1]
lea esi,[esi+2+eax]
lods byte [esi]
cmp [base_code],1
ja irps_name_ok
cmp al,':'
je irp_with_default_value
cmp al,'='
je irp_with_default_value
cmp al,'*'
jne irp_name_ok
lods byte [esi]
irp_name_ok:
cmp al,','
jne invalid_macro_arguments
jmp irp_parameters_start
irp_with_default_value:
xor ebp,ebp
or [skip_default_argument_value],-1
call skip_macro_argument_value
cmp byte [esi],','
jne invalid_macro_arguments
inc esi
jmp irp_parameters_start
irps_name_ok:
cmp al,','
jne invalid_macro_arguments
cmp [base_code],3
je irp_parameters_start
mov al,[esi]
or al,al
jz instant_macro_done
cmp al,'{'
je instant_macro_done
irp_parameters_start:
xor eax,eax
push [free_additional_memory]
push [macro_symbols]
mov [macro_symbols],eax
push [counter_limit]
mov [counter_limit],eax
mov [struc_name],eax
cmp [base_code],3
je get_irpv_parameter
mov ebx,esi
cmp [base_code],2
je get_irps_parameter
mov edx,[parameters_end]
mov al,[edx]
push eax
mov byte [edx],0
get_irp_parameter:
inc [counter_limit]
mov esi,[instant_macro_start]
inc esi
call get_macro_argument
cmp byte [ebx],','
jne irp_parameters_end
inc ebx
jmp get_irp_parameter
irp_parameters_end:
mov esi,ebx
pop eax
mov [esi],al
jmp instant_macro_parameters_ok
get_irps_parameter:
mov esi,[instant_macro_start]
inc esi
lods byte [esi]
movzx ecx,al
inc [counter_limit]
mov eax,[counter_limit]
call add_macro_symbol
mov [edx+12],ebx
cmp byte [ebx],1Ah
je irps_symbol
cmp byte [ebx],22h
je irps_quoted_string
mov eax,1
jmp irps_parameter_ok
irps_quoted_string:
mov eax,[ebx+1]
add eax,1+4
jmp irps_parameter_ok
irps_symbol:
movzx eax,byte [ebx+1]
add eax,1+1
irps_parameter_ok:
mov [edx+8],eax
add ebx,eax
cmp byte [ebx],0
je irps_parameters_end
cmp byte [ebx],'{'
jne get_irps_parameter
irps_parameters_end:
mov esi,ebx
jmp instant_macro_parameters_ok
get_irpv_parameter:
lods byte [esi]
cmp al,1Ah
jne invalid_macro_arguments
lods byte [esi]
mov ebp,esi
mov cl,al
mov ch,10b
call get_preprocessor_symbol
jc instant_macro_finish
push edx
mark_variable_value:
inc [counter_limit]
mov [edx+4],ebp
next_variable_value:
mov edx,[edx]
or edx,edx
jz variable_values_marked
mov eax,[edx+4]
cmp eax,1
jbe next_variable_value
mov esi,ebp
movzx ecx,byte [esi-1]
xchg edi,eax
repe cmps byte [esi],[edi]
xchg edi,eax
je mark_variable_value
jmp next_variable_value
variable_values_marked:
pop edx
push [counter_limit]
add_irpv_value:
push edx
mov esi,[instant_macro_start]
inc esi
lods byte [esi]
movzx ecx,al
mov eax,[esp+4]
call add_macro_symbol
mov ebx,edx
pop edx
mov ecx,[edx+12]
mov eax,[edx+8]
mov [ebx+12],eax
mov [ebx+8],ecx
collect_next_variable_value:
mov edx,[edx]
or edx,edx
jz variable_values_collected
cmp ebp,[edx+4]
jne collect_next_variable_value
dec dword [esp]
jnz add_irpv_value
variable_values_collected:
pop eax
mov esi,ebp
movzx ecx,byte [esi-1]
add esi,ecx
cmp byte [esi],0
je instant_macro_parameters_ok
cmp byte [esi],'{'
jne invalid_macro_arguments
jmp instant_macro_parameters_ok
 
do_match:
mov ebx,esi
call skip_pattern
call exact_match
mov edx,edi
mov al,[ebx]
cmp al,1Ah
je free_match
cmp al,','
jne instant_macro_done
cmp esi,[parameters_end]
je matched_pattern
jmp instant_macro_done
free_match:
add edx,12
cmp edx,[memory_end]
ja out_of_memory
mov [edx-12],ebx
mov [edx-8],esi
call skip_match_element
jc try_different_matching
mov [edx-4],esi
movzx eax,byte [ebx+1]
lea ebx,[ebx+2+eax]
cmp byte [ebx],1Ah
je free_match
find_exact_match:
call exact_match
cmp esi,[parameters_end]
je end_matching
cmp byte [ebx],1Ah
je free_match
mov ebx,[edx-12]
movzx eax,byte [ebx+1]
lea ebx,[ebx+2+eax]
mov esi,[edx-4]
jmp match_more_elements
try_different_matching:
sub edx,12
cmp edx,edi
je instant_macro_done
mov ebx,[edx-12]
movzx eax,byte [ebx+1]
lea ebx,[ebx+2+eax]
cmp byte [ebx],1Ah
je try_different_matching
mov esi,[edx-4]
match_more_elements:
call skip_match_element
jc try_different_matching
mov [edx-4],esi
jmp find_exact_match
skip_match_element:
cmp esi,[parameters_end]
je cannot_match
mov al,[esi]
cmp al,1Ah
je skip_match_symbol
cmp al,22h
je skip_match_quoted_string
add esi,1
ret
skip_match_quoted_string:
mov eax,[esi+1]
add esi,5
jmp skip_match_ok
skip_match_symbol:
movzx eax,byte [esi+1]
add esi,2
skip_match_ok:
add esi,eax
ret
cannot_match:
stc
ret
exact_match:
cmp esi,[parameters_end]
je exact_match_complete
mov ah,[esi]
mov al,[ebx]
cmp al,','
je exact_match_complete
cmp al,1Ah
je exact_match_complete
cmp al,'='
je match_verbatim
call match_elements
je exact_match
exact_match_complete:
ret
match_verbatim:
inc ebx
call match_elements
je exact_match
dec ebx
ret
match_elements:
mov al,[ebx]
cmp al,1Ah
je match_symbols
cmp al,22h
je match_quoted_strings
cmp al,ah
je symbol_characters_matched
ret
symbol_characters_matched:
lea ebx,[ebx+1]
lea esi,[esi+1]
ret
match_quoted_strings:
mov ecx,[ebx+1]
add ecx,5
jmp compare_elements
match_symbols:
movzx ecx,byte [ebx+1]
add ecx,2
compare_elements:
mov eax,esi
mov ebp,edi
mov edi,ebx
repe cmps byte [esi],[edi]
jne elements_mismatch
mov ebx,edi
mov edi,ebp
ret
elements_mismatch:
mov esi,eax
mov edi,ebp
ret
end_matching:
cmp byte [ebx],','
jne instant_macro_done
matched_pattern:
xor eax,eax
push [free_additional_memory]
push [macro_symbols]
mov [macro_symbols],eax
push [counter_limit]
mov [counter_limit],eax
mov [struc_name],eax
push esi edi edx
add_matched_symbol:
cmp edi,[esp]
je matched_symbols_ok
mov esi,[edi]
inc esi
lods byte [esi]
movzx ecx,al
xor eax,eax
call add_macro_symbol
mov eax,[edi+4]
mov dword [edx+12],eax
mov ecx,[edi+8]
sub ecx,eax
mov dword [edx+8],ecx
add edi,12
jmp add_matched_symbol
matched_symbols_ok:
pop edx edi esi
jmp instant_macro_parameters_ok
 
process_macro:
push dword [macro_status]
or [macro_status],10h
push [counter]
push [macro_block]
push [macro_block_line]
push [macro_block_line_number]
push [struc_label]
push [struc_name]
push eax
push [current_line]
lods byte [esi]
cmp al,'{'
je macro_instructions_start
or al,al
jnz unexpected_characters
find_macro_instructions:
mov [macro_line],esi
add esi,16+2
lods byte [esi]
or al,al
jz find_macro_instructions
cmp al,'{'
je macro_instructions_start
cmp al,3Bh
jne unexpected_characters
call skip_foreign_symbol
jmp find_macro_instructions
macro_instructions_start:
mov ecx,80000000h
mov [macro_block],esi
mov eax,[macro_line]
mov [macro_block_line],eax
mov [macro_block_line_number],ecx
xor eax,eax
mov [counter],eax
cmp [counter_limit],eax
je process_macro_line
inc [counter]
process_macro_line:
lods byte [esi]
or al,al
jz process_next_line
cmp al,'}'
je macro_block_processed
dec esi
mov [current_line],edi
lea eax,[edi+10h]
cmp eax,[memory_end]
jae out_of_memory
mov eax,[esp+4]
or eax,eax
jz instant_macro_line_header
stos dword [edi]
mov eax,ecx
stos dword [edi]
mov eax,[esp]
stos dword [edi]
mov eax,[macro_line]
stos dword [edi]
jmp macro_line_header_ok
instant_macro_line_header:
mov eax,[esp]
add eax,16
find_defining_directive:
inc eax
cmp byte [eax-1],3Bh
je defining_directive_ok
cmp byte [eax-1],1Ah
jne find_defining_directive
push eax
movzx eax,byte [eax]
inc eax
add [esp],eax
pop eax
jmp find_defining_directive
defining_directive_ok:
stos dword [edi]
mov eax,ecx
stos dword [edi]
mov eax,[macro_line]
stos dword [edi]
stos dword [edi]
macro_line_header_ok:
or [macro_status],20h
push ebx ecx
test [macro_status],0Fh
jz process_macro_line_element
mov ax,3Bh
stos word [edi]
process_macro_line_element:
lea eax,[edi+100h]
cmp eax,[memory_end]
jae out_of_memory
lods byte [esi]
cmp al,'}'
je macro_line_processed
or al,al
jz macro_line_processed
cmp al,1Ah
je process_macro_symbol
cmp al,3Bh
je macro_foreign_line
and [macro_status],not 20h
stos byte [edi]
cmp al,22h
jne process_macro_line_element
copy_macro_string:
mov ecx,[esi]
add ecx,4
call move_data
jmp process_macro_line_element
process_macro_symbol:
push esi edi
test [macro_status],20h
jz not_macro_directive
movzx ecx,byte [esi]
inc esi
mov edi,macro_directives
call get_directive
jnc process_macro_directive
dec esi
jmp not_macro_directive
process_macro_directive:
mov edx,eax
pop edi eax
mov byte [edi],0
inc edi
pop ecx ebx
jmp near edx
not_macro_directive:
and [macro_status],not 20h
movzx ecx,byte [esi]
inc esi
mov eax,[counter]
call get_macro_symbol
jnc group_macro_symbol
xor eax,eax
cmp [counter],eax
je multiple_macro_symbol_values
call get_macro_symbol
jc not_macro_symbol
replace_macro_symbol:
pop edi eax
mov ecx,[edx+8]
mov edx,[edx+12]
or edx,edx
jz replace_macro_counter
and ecx,not 80000000h
xchg esi,edx
call move_data
mov esi,edx
jmp process_macro_line_element
group_macro_symbol:
xor eax,eax
cmp [counter],eax
je replace_macro_symbol
push esi edx
sub esi,ecx
call get_macro_symbol
mov ebx,edx
pop edx esi
jc replace_macro_symbol
cmp edx,ebx
ja replace_macro_symbol
mov edx,ebx
jmp replace_macro_symbol
multiple_macro_symbol_values:
inc eax
push eax
call get_macro_symbol
pop eax
jc not_macro_symbol
pop edi
push ecx
mov ecx,[edx+8]
mov edx,[edx+12]
xchg esi,edx
btr ecx,31
jc enclose_macro_symbol_value
rep movs byte [edi],[esi]
jmp macro_symbol_value_ok
enclose_macro_symbol_value:
mov byte [edi],'<'
inc edi
rep movs byte [edi],[esi]
mov byte [edi],'>'
inc edi
macro_symbol_value_ok:
cmp eax,[counter_limit]
je multiple_macro_symbol_values_ok
mov byte [edi],','
inc edi
mov esi,edx
pop ecx
push edi
sub esi,ecx
jmp multiple_macro_symbol_values
multiple_macro_symbol_values_ok:
pop ecx eax
mov esi,edx
jmp process_macro_line_element
replace_macro_counter:
mov eax,[counter]
and eax,not 80000000h
jz group_macro_counter
add ecx,eax
dec ecx
call store_number_symbol
jmp process_macro_line_element
group_macro_counter:
mov edx,ecx
xor ecx,ecx
multiple_macro_counter_values:
push ecx edx
add ecx,edx
call store_number_symbol
pop edx ecx
inc ecx
cmp ecx,[counter_limit]
je process_macro_line_element
mov byte [edi],','
inc edi
jmp multiple_macro_counter_values
store_number_symbol:
cmp ecx,0
jge numer_symbol_sign_ok
neg ecx
mov al,'-'
stos byte [edi]
numer_symbol_sign_ok:
mov ax,1Ah
stos word [edi]
push edi
mov eax,ecx
mov ecx,1000000000
xor edx,edx
xor bl,bl
store_number_digits:
div ecx
push edx
or bl,bl
jnz store_number_digit
cmp ecx,1
je store_number_digit
or al,al
jz number_digit_ok
not bl
store_number_digit:
add al,30h
stos byte [edi]
number_digit_ok:
mov eax,ecx
xor edx,edx
mov ecx,10
div ecx
mov ecx,eax
pop eax
or ecx,ecx
jnz store_number_digits
pop ebx
mov eax,edi
sub eax,ebx
mov [ebx-1],al
ret
not_macro_symbol:
pop edi esi
mov al,1Ah
stos byte [edi]
mov al,[esi]
inc esi
stos byte [edi]
cmp byte [esi],'.'
jne copy_raw_symbol
mov ebx,[esp+8+8]
or ebx,ebx
jz copy_raw_symbol
cmp al,1
je copy_struc_name
xchg esi,ebx
movzx ecx,byte [esi-1]
add [edi-1],cl
jc name_too_long
rep movs byte [edi],[esi]
xchg esi,ebx
copy_raw_symbol:
movzx ecx,al
rep movs byte [edi],[esi]
jmp process_macro_line_element
copy_struc_name:
inc esi
xchg esi,ebx
movzx ecx,byte [esi-1]
mov [edi-1],cl
rep movs byte [edi],[esi]
xchg esi,ebx
mov eax,[esp+8+12]
cmp byte [eax],3Bh
je process_macro_line_element
cmp byte [eax],1Ah
jne disable_replaced_struc_name
mov byte [eax],3Bh
jmp process_macro_line_element
disable_replaced_struc_name:
mov ebx,[esp+8+8]
push esi edi
lea edi,[ebx-3]
lea esi,[edi-2]
lea ecx,[esi+1]
sub ecx,eax
std
rep movs byte [edi],[esi]
cld
mov word [eax],3Bh
pop edi esi
jmp process_macro_line_element
skip_foreign_symbol:
lods byte [esi]
movzx eax,al
add esi,eax
skip_foreign_line:
lods byte [esi]
cmp al,1Ah
je skip_foreign_symbol
cmp al,3Bh
je skip_foreign_symbol
cmp al,22h
je skip_foreign_string
or al,al
jnz skip_foreign_line
ret
skip_foreign_string:
lods dword [esi]
add esi,eax
jmp skip_foreign_line
macro_foreign_line:
call skip_foreign_symbol
macro_line_processed:
mov byte [edi],0
inc edi
push eax
call preprocess_line
pop eax
pop ecx ebx
cmp al,'}'
je macro_block_processed
process_next_line:
inc ecx
mov [macro_line],esi
add esi,16+2
jmp process_macro_line
macro_block_processed:
call close_macro_block
jc process_macro_line
pop [current_line]
add esp,12
pop [macro_block_line_number]
pop [macro_block_line]
pop [macro_block]
pop [counter]
pop eax
and al,0F0h
and [macro_status],0Fh
or [macro_status],al
ret
 
local_symbols:
lods byte [esi]
cmp al,1Ah
jne invalid_argument
mov byte [edi-1],3Bh
xor al,al
stos byte [edi]
make_local_symbol:
push ecx
lods byte [esi]
movzx ecx,al
mov eax,[counter]
call add_macro_symbol
mov [edx+12],edi
movzx eax,[locals_counter]
add eax,ecx
inc eax
cmp eax,100h
jae name_too_long
lea ebp,[edi+2+eax]
cmp ebp,[memory_end]
jae out_of_memory
mov ah,al
mov al,1Ah
stos word [edi]
rep movs byte [edi],[esi]
mov al,'?'
stos byte [edi]
push esi
mov esi,locals_counter+1
movzx ecx,[locals_counter]
rep movs byte [edi],[esi]
pop esi
mov eax,edi
sub eax,[edx+12]
mov [edx+8],eax
xor al,al
stos byte [edi]
mov eax,locals_counter
movzx ecx,byte [eax]
counter_loop:
inc byte [eax+ecx]
cmp byte [eax+ecx],'9'+1
jb counter_ok
jne letter_digit
mov byte [eax+ecx],'A'
jmp counter_ok
letter_digit:
cmp byte [eax+ecx],'Z'+1
jb counter_ok
jne small_letter_digit
mov byte [eax+ecx],'a'
jmp counter_ok
small_letter_digit:
cmp byte [eax+ecx],'z'+1
jb counter_ok
mov byte [eax+ecx],'0'
loop counter_loop
inc byte [eax]
movzx ecx,byte [eax]
mov byte [eax+ecx],'0'
counter_ok:
pop ecx
lods byte [esi]
cmp al,'}'
je macro_block_processed
or al,al
jz process_next_line
cmp al,','
jne extra_characters_on_line
dec edi
lods byte [esi]
cmp al,1Ah
je make_local_symbol
jmp invalid_argument
common_block:
call close_macro_block
jc process_macro_line
mov [counter],0
jmp new_macro_block
forward_block:
cmp [counter_limit],0
je common_block
call close_macro_block
jc process_macro_line
mov [counter],1
jmp new_macro_block
reverse_block:
cmp [counter_limit],0
je common_block
call close_macro_block
jc process_macro_line
mov eax,[counter_limit]
or eax,80000000h
mov [counter],eax
new_macro_block:
mov [macro_block],esi
mov eax,[macro_line]
mov [macro_block_line],eax
mov [macro_block_line_number],ecx
jmp process_macro_line
close_macro_block:
cmp esi,[macro_block]
je block_closed
cmp [counter],0
je block_closed
jl reverse_counter
mov eax,[counter]
cmp eax,[counter_limit]
je block_closed
inc [counter]
jmp continue_block
reverse_counter:
mov eax,[counter]
dec eax
cmp eax,80000000h
je block_closed
mov [counter],eax
continue_block:
mov esi,[macro_block]
mov eax,[macro_block_line]
mov [macro_line],eax
mov ecx,[macro_block_line_number]
stc
ret
block_closed:
clc
ret
get_macro_symbol:
push ecx
call find_macro_symbol_leaf
jc macro_symbol_not_found
mov edx,[ebx]
mov ebx,esi
try_macro_symbol:
or edx,edx
jz macro_symbol_not_found
mov ecx,[esp]
mov edi,[edx+4]
repe cmps byte [esi],[edi]
je macro_symbol_found
mov esi,ebx
mov edx,[edx]
jmp try_macro_symbol
macro_symbol_found:
pop ecx
clc
ret
macro_symbol_not_found:
pop ecx
stc
ret
find_macro_symbol_leaf:
shl eax,8
mov al,cl
mov ebp,eax
mov ebx,macro_symbols
follow_macro_symbols_tree:
mov edx,[ebx]
or edx,edx
jz no_such_macro_symbol
xor eax,eax
shr ebp,1
adc eax,0
lea ebx,[edx+eax*4]
or ebp,ebp
jnz follow_macro_symbols_tree
add ebx,8
clc
ret
no_such_macro_symbol:
stc
ret
add_macro_symbol:
push ebx ebp
call find_macro_symbol_leaf
jc extend_macro_symbol_tree
mov eax,[ebx]
make_macro_symbol:
mov edx,[free_additional_memory]
add edx,16
cmp edx,[labels_list]
ja out_of_memory
xchg edx,[free_additional_memory]
mov [ebx],edx
mov [edx],eax
mov [edx+4],esi
pop ebp ebx
ret
extend_macro_symbol_tree:
mov edx,[free_additional_memory]
add edx,16
cmp edx,[labels_list]
ja out_of_memory
xchg edx,[free_additional_memory]
xor eax,eax
mov [edx],eax
mov [edx+4],eax
mov [edx+8],eax
mov [edx+12],eax
shr ebp,1
adc eax,0
mov [ebx],edx
lea ebx,[edx+eax*4]
or ebp,ebp
jnz extend_macro_symbol_tree
add ebx,8
xor eax,eax
jmp make_macro_symbol
 
include_file:
lods byte [esi]
cmp al,22h
jne invalid_argument
lods dword [esi]
cmp byte [esi+eax],0
jne extra_characters_on_line
push esi
push edi
mov ebx,[current_line]
find_current_file_path:
mov esi,[ebx]
test byte [ebx+7],80h
jz copy_current_file_path
mov ebx,[ebx+8]
jmp find_current_file_path
copy_current_file_path:
lods byte [esi]
stos byte [edi]
or al,al
jnz copy_current_file_path
cut_current_file_name:
cmp edi,[esp]
je current_file_path_ok
cmp byte [edi-1],'\'
je current_file_path_ok
cmp byte [edi-1],'/'
je current_file_path_ok
dec edi
jmp cut_current_file_name
current_file_path_ok:
mov esi,[esp+4]
call expand_path
pop edx
mov esi,edx
call open
jnc include_path_ok
mov ebp,[include_paths]
try_include_directories:
mov edi,esi
mov esi,ebp
cmp byte [esi],0
je try_in_current_directory
push ebp
push edi
call get_include_directory
mov [esp+4],esi
mov esi,[esp+8]
call expand_path
pop edx
mov esi,edx
call open
pop ebp
jnc include_path_ok
jmp try_include_directories
mov edi,esi
try_in_current_directory:
mov esi,[esp]
push edi
call expand_path
pop edx
mov esi,edx
call open
jc file_not_found
include_path_ok:
mov edi,[esp]
copy_preprocessed_path:
lods byte [esi]
stos byte [edi]
or al,al
jnz copy_preprocessed_path
pop esi
lea ecx,[edi-1]
sub ecx,esi
mov [esi-4],ecx
push dword [macro_status]
and [macro_status],0Fh
call preprocess_file
pop eax
and al,0F0h
and [macro_status],0Fh
or [macro_status],al
jmp line_preprocessed
/programs/develop/koldbg/fasm/symbdump.inc
0,0 → 1,450
 
; flat assembler core
; Copyright (c) 1999-2019, Tomasz Grysztar.
; All rights reserved.
 
dump_symbols:
mov edi,[code_start]
call setup_dump_header
mov esi,[input_file]
call copy_asciiz
cmp edi,[tagged_blocks]
jae out_of_memory
mov eax,edi
sub eax,ebx
mov [ebx-40h+0Ch],eax
mov esi,[output_file]
call copy_asciiz
cmp edi,[tagged_blocks]
jae out_of_memory
mov edx,[symbols_stream]
mov ebp,[free_additional_memory]
and [number_of_sections],0
cmp [output_format],4
je prepare_strings_table
cmp [output_format],5
jne strings_table_ready
bt [format_flags],0
jc strings_table_ready
prepare_strings_table:
cmp edx,ebp
je strings_table_ready
mov al,[edx]
test al,al
jz prepare_string
cmp al,80h
je prepare_string
add edx,0Ch
cmp al,0C0h
jb prepare_strings_table
add edx,4
jmp prepare_strings_table
prepare_string:
mov esi,edi
sub esi,ebx
xchg esi,[edx+4]
test al,al
jz prepare_section_string
or dword [edx+4],1 shl 31
add edx,0Ch
prepare_external_string:
mov ecx,[esi]
add esi,4
rep movs byte [edi],[esi]
mov byte [edi],0
inc edi
cmp edi,[tagged_blocks]
jae out_of_memory
jmp prepare_strings_table
prepare_section_string:
mov ecx,[number_of_sections]
mov eax,ecx
inc eax
mov [number_of_sections],eax
xchg eax,[edx+4]
shl ecx,2
add ecx,[free_additional_memory]
mov [ecx],eax
add edx,20h
test esi,esi
jz prepare_default_section_string
cmp [output_format],5
jne prepare_external_string
bt [format_flags],0
jc prepare_external_string
mov esi,[esi]
add esi,[resource_data]
copy_elf_section_name:
lods byte [esi]
cmp edi,[tagged_blocks]
jae out_of_memory
stos byte [edi]
test al,al
jnz copy_elf_section_name
jmp prepare_strings_table
prepare_default_section_string:
mov eax,'.fla'
stos dword [edi]
mov ax,'t'
stos word [edi]
cmp edi,[tagged_blocks]
jae out_of_memory
jmp prepare_strings_table
strings_table_ready:
mov edx,[tagged_blocks]
mov ebp,[memory_end]
sub ebp,[labels_list]
add ebp,edx
prepare_labels_dump:
cmp edx,ebp
je labels_dump_ok
mov eax,[edx+24]
test eax,eax
jz label_dump_name_ok
cmp eax,[memory_start]
jb label_name_outside_source
cmp eax,[source_start]
ja label_name_outside_source
sub eax,[memory_start]
dec eax
mov [edx+24],eax
jmp label_dump_name_ok
label_name_outside_source:
mov esi,eax
mov eax,edi
sub eax,ebx
or eax,1 shl 31
mov [edx+24],eax
movzx ecx,byte [esi-1]
lea eax,[edi+ecx+1]
cmp edi,[tagged_blocks]
jae out_of_memory
rep movsb
xor al,al
stosb
label_dump_name_ok:
mov eax,[edx+28]
test eax,eax
jz label_dump_line_ok
sub eax,[memory_start]
mov [edx+28],eax
label_dump_line_ok:
test byte [edx+9],4
jz convert_base_symbol_for_label
xor eax,eax
mov [edx],eax
mov [edx+4],eax
jmp base_symbol_for_label_ok
convert_base_symbol_for_label:
mov eax,[edx+20]
test eax,eax
jz base_symbol_for_label_ok
cmp eax,[symbols_stream]
mov eax,[eax+4]
jae base_symbol_for_label_ok
xor eax,eax
base_symbol_for_label_ok:
mov [edx+20],eax
mov ax,[current_pass]
cmp ax,[edx+16]
je label_defined_flag_ok
and byte [edx+8],not 1
label_defined_flag_ok:
cmp ax,[edx+18]
je label_used_flag_ok
and byte [edx+8],not 8
label_used_flag_ok:
add edx,LABEL_STRUCTURE_SIZE
jmp prepare_labels_dump
labels_dump_ok:
mov eax,edi
sub eax,ebx
mov [ebx-40h+14h],eax
add eax,40h
mov [ebx-40h+18h],eax
mov ecx,[memory_end]
sub ecx,[labels_list]
mov [ebx-40h+1Ch],ecx
add eax,ecx
mov [ebx-40h+20h],eax
mov ecx,[source_start]
sub ecx,[memory_start]
mov [ebx-40h+24h],ecx
add eax,ecx
mov [ebx-40h+28h],eax
mov eax,[number_of_sections]
shl eax,2
mov [ebx-40h+34h],eax
call prepare_preprocessed_source
mov esi,[labels_list]
mov ebp,edi
make_lines_dump:
cmp esi,[tagged_blocks]
je lines_dump_ok
mov eax,[esi-4]
mov ecx,[esi-8]
sub esi,8
sub esi,ecx
cmp eax,1
je process_line_dump
cmp eax,2
jne make_lines_dump
add dword [ebx-40h+3Ch],8
jmp make_lines_dump
process_line_dump:
push ebx
mov ebx,[esi+8]
mov eax,[esi+4]
sub eax,[code_start]
add eax,[headers_size]
test byte [ebx+0Ah],1
jz store_offset
xor eax,eax
store_offset:
stos dword [edi]
mov eax,[esi]
sub eax,[memory_start]
stos dword [edi]
mov eax,[esi+4]
xor edx,edx
xor cl,cl
sub eax,[ebx]
sbb edx,[ebx+4]
sbb cl,[ebx+8]
stos dword [edi]
mov eax,edx
stos dword [edi]
mov eax,[ebx+10h]
stos dword [edi]
mov eax,[ebx+14h]
test eax,eax
jz base_symbol_for_line_ok
cmp eax,[symbols_stream]
mov eax,[eax+4]
jae base_symbol_for_line_ok
xor eax,eax
base_symbol_for_line_ok:
stos dword [edi]
mov al,[ebx+9]
stos byte [edi]
mov al,[esi+10h]
stos byte [edi]
mov al,[ebx+0Ah]
and al,1
stos byte [edi]
mov al,cl
stos byte [edi]
pop ebx
cmp edi,[tagged_blocks]
jae out_of_memory
mov eax,edi
sub eax,1Ch
sub eax,ebp
mov [esi],eax
jmp make_lines_dump
lines_dump_ok:
mov edx,edi
mov eax,[current_offset]
sub eax,[code_start]
add eax,[headers_size]
stos dword [edi]
mov ecx,edi
sub ecx,ebx
sub ecx,[ebx-40h+14h]
mov [ebx-40h+2Ch],ecx
add ecx,[ebx-40h+28h]
mov [ebx-40h+30h],ecx
add ecx,[ebx-40h+34h]
mov [ebx-40h+38h],ecx
find_inexisting_offsets:
sub edx,1Ch
cmp edx,ebp
jb write_symbols
test byte [edx+1Ah],1
jnz find_inexisting_offsets
cmp eax,[edx]
jb correct_inexisting_offset
mov eax,[edx]
jmp find_inexisting_offsets
correct_inexisting_offset:
and dword [edx],0
or byte [edx+1Ah],2
jmp find_inexisting_offsets
write_symbols:
mov edx,[symbols_file]
call create
jc write_failed
mov edx,[code_start]
mov ecx,[edx+14h]
add ecx,40h
call write
jc write_failed
mov edx,[tagged_blocks]
mov ecx,[memory_end]
sub ecx,[labels_list]
call write
jc write_failed
mov edx,[memory_start]
mov ecx,[source_start]
sub ecx,edx
call write
jc write_failed
mov edx,ebp
mov ecx,edi
sub ecx,edx
call write
jc write_failed
mov edx,[free_additional_memory]
mov ecx,[number_of_sections]
shl ecx,2
call write
jc write_failed
mov esi,[labels_list]
mov edi,[memory_start]
make_references_dump:
cmp esi,[tagged_blocks]
je references_dump_ok
mov eax,[esi-4]
mov ecx,[esi-8]
sub esi,8
sub esi,ecx
cmp eax,2
je dump_reference
cmp eax,1
jne make_references_dump
mov edx,[esi]
jmp make_references_dump
dump_reference:
mov eax,[memory_end]
sub eax,[esi]
sub eax,LABEL_STRUCTURE_SIZE
stosd
mov eax,edx
stosd
cmp edi,[tagged_blocks]
jb make_references_dump
jmp out_of_memory
references_dump_ok:
mov edx,[memory_start]
mov ecx,edi
sub ecx,edx
call write
jc write_failed
call close
ret
setup_dump_header:
xor eax,eax
mov ecx,40h shr 2
rep stos dword [edi]
mov ebx,edi
mov dword [ebx-40h],'fas'+1Ah shl 24
mov dword [ebx-40h+4],VERSION_MAJOR + VERSION_MINOR shl 8 + 40h shl 16
mov dword [ebx-40h+10h],40h
ret
prepare_preprocessed_source:
mov esi,[memory_start]
mov ebp,[source_start]
test ebp,ebp
jnz prepare_preprocessed_line
mov ebp,[current_line]
inc ebp
prepare_preprocessed_line:
cmp esi,ebp
jae preprocessed_source_ok
mov eax,[memory_start]
mov edx,[input_file]
cmp [esi],edx
jne line_not_from_main_input
mov [esi],eax
line_not_from_main_input:
sub [esi],eax
test byte [esi+7],1 shl 7
jz prepare_next_preprocessed_line
sub [esi+8],eax
sub [esi+12],eax
prepare_next_preprocessed_line:
call skip_preprocessed_line
jmp prepare_preprocessed_line
preprocessed_source_ok:
ret
skip_preprocessed_line:
add esi,16
skip_preprocessed_line_content:
lods byte [esi]
cmp al,1Ah
je skip_preprocessed_symbol
cmp al,3Bh
je skip_preprocessed_symbol
cmp al,22h
je skip_preprocessed_string
or al,al
jnz skip_preprocessed_line_content
ret
skip_preprocessed_string:
lods dword [esi]
add esi,eax
jmp skip_preprocessed_line_content
skip_preprocessed_symbol:
lods byte [esi]
movzx eax,al
add esi,eax
jmp skip_preprocessed_line_content
restore_preprocessed_source:
mov esi,[memory_start]
mov ebp,[source_start]
test ebp,ebp
jnz restore_preprocessed_line
mov ebp,[current_line]
inc ebp
restore_preprocessed_line:
cmp esi,ebp
jae preprocessed_source_restored
mov eax,[memory_start]
add [esi],eax
cmp [esi],eax
jne preprocessed_line_source_restored
mov edx,[input_file]
mov [esi],edx
preprocessed_line_source_restored:
test byte [esi+7],1 shl 7
jz restore_next_preprocessed_line
add [esi+8],eax
add [esi+12],eax
restore_next_preprocessed_line:
call skip_preprocessed_line
jmp restore_preprocessed_line
preprocessed_source_restored:
ret
dump_preprocessed_source:
mov edi,[free_additional_memory]
call setup_dump_header
mov esi,[input_file]
call copy_asciiz
cmp edi,[additional_memory_end]
jae out_of_memory
mov eax,edi
sub eax,ebx
dec eax
mov [ebx-40h+0Ch],eax
mov eax,edi
sub eax,ebx
mov [ebx-40h+14h],eax
add eax,40h
mov [ebx-40h+20h],eax
call prepare_preprocessed_source
sub esi,[memory_start]
mov [ebx-40h+24h],esi
mov edx,[symbols_file]
call create
jc write_failed
mov edx,[free_additional_memory]
mov ecx,[edx+14h]
add ecx,40h
call write
jc write_failed
mov edx,[memory_start]
mov ecx,esi
call write
jc write_failed
call close
ret
/programs/develop/koldbg/fasm/tables.inc
0,0 → 1,4374
 
; flat assembler core
; Copyright (c) 1999-2019, Tomasz Grysztar.
; All rights reserved.
 
include_variable db 'INCLUDE',0
 
symbol_characters db 27
db 9,0Ah,0Dh,1Ah,20h,'+-/*=<>()[]{}:,|&~#`;\'
 
preprocessor_directives:
db 6,'define'
dw define_symbolic_constant-directive_handler
db 7,'include'
dw include_file-directive_handler
db 3,'irp'
dw irp_directive-directive_handler
db 4,'irps'
dw irps_directive-directive_handler
db 4,'irpv'
dw irpv_directive-directive_handler
db 5,'macro'
dw define_macro-directive_handler
db 5,'match'
dw match_directive-directive_handler
db 8,'postpone'
dw postpone_directive-directive_handler
db 5,'purge'
dw purge_macro-directive_handler
db 4,'rept'
dw rept_directive-directive_handler
db 7,'restore'
dw restore_equ_constant-directive_handler
db 7,'restruc'
dw purge_struc-directive_handler
db 5,'struc'
dw define_struc-directive_handler
db 0
 
macro_directives:
db 6,'common'
dw common_block-directive_handler
db 7,'forward'
dw forward_block-directive_handler
db 5,'local'
dw local_symbols-directive_handler
db 7,'reverse'
dw reverse_block-directive_handler
db 0
 
operators:
db 1,'+',80h
db 1,'-',81h
db 1,'*',90h
db 1,'/',91h
db 3,'and',0B0h
db 3,'mod',0A0h
db 2,'or',0B1h
db 3,'shl',0C0h
db 3,'shr',0C1h
db 3,'xor',0B2h
db 0
 
single_operand_operators:
db 1,'+',82h
db 1,'-',83h
db 3,'bsf',0E0h
db 3,'bsr',0E1h
db 3,'not',0D0h
db 3,'plt',0F1h
db 3,'rva',0F0h
db 0
 
directive_operators:
db 5,'align',8Ch
db 2,'as',86h
db 2,'at',80h
db 7,'defined',88h
db 8,'definite',8Ah
db 3,'dup',81h
db 2,'eq',0F0h
db 6,'eqtype',0F7h
db 4,'from',82h
db 2,'in',0F6h
db 2,'on',84h
db 3,'ptr',85h
db 10,'relativeto',0F8h
db 4,'used',89h
db 0
 
address_sizes:
db 4,'byte',1
db 5,'dword',4
db 5,'qword',8
db 4,'word',2
db 0
 
symbols:
dw symbols_1-symbols,(symbols_2-symbols_1)/(1+2)
dw symbols_2-symbols,(symbols_3-symbols_2)/(2+2)
dw symbols_3-symbols,(symbols_4-symbols_3)/(3+2)
dw symbols_4-symbols,(symbols_5-symbols_4)/(4+2)
dw symbols_5-symbols,(symbols_6-symbols_5)/(5+2)
dw symbols_6-symbols,(symbols_7-symbols_6)/(6+2)
dw symbols_7-symbols,(symbols_8-symbols_7)/(7+2)
dw symbols_8-symbols,(symbols_9-symbols_8)/(8+2)
dw symbols_9-symbols,(symbols_10-symbols_9)/(9+2)
dw symbols_10-symbols,(symbols_11-symbols_10)/(10+2)
dw symbols_11-symbols,(symbols_end-symbols_11)/(11+2)
 
symbols_1:
db 'z',1Fh,0
symbols_2:
db 'ah',10h,04h
db 'al',10h,10h
db 'ax',10h,20h
db 'bh',10h,07h
db 'bl',10h,13h
db 'bp',10h,25h
db 'bx',10h,23h
db 'ch',10h,05h
db 'cl',10h,11h
db 'cs',10h,32h
db 'cx',10h,21h
db 'dh',10h,06h
db 'di',10h,27h
db 'dl',10h,12h
db 'ds',10h,34h
db 'dx',10h,22h
db 'es',10h,31h
db 'fs',10h,35h
db 'gs',10h,36h
db 'k0',14h,50h
db 'k1',14h,51h
db 'k2',14h,52h
db 'k3',14h,53h
db 'k4',14h,54h
db 'k5',14h,55h
db 'k6',14h,56h
db 'k7',14h,57h
db 'ms',1Ch,41h
db 'mz',18h,20h
db 'nx',1Bh,83h
db 'pe',18h,30h
db 'r8',10h,88h
db 'r9',10h,89h
db 'rd',1Fh,21h
db 'rn',1Fh,20h
db 'ru',1Fh,22h
db 'rz',1Fh,23h
db 'si',10h,26h
db 'sp',10h,24h
db 'ss',10h,33h
db 'st',10h,0A0h
symbols_3:
db 'bpl',10h,15h
db 'cr0',14h,00h
db 'cr1',14h,01h
db 'cr2',14h,02h
db 'cr3',14h,03h
db 'cr4',14h,04h
db 'cr5',14h,05h
db 'cr6',14h,06h
db 'cr7',14h,07h
db 'cr8',14h,08h
db 'cr9',14h,09h
db 'dil',10h,17h
db 'dll',1Bh,80h
db 'dr0',14h,10h
db 'dr1',14h,11h
db 'dr2',14h,12h
db 'dr3',14h,13h
db 'dr4',14h,14h
db 'dr5',14h,15h
db 'dr6',14h,16h
db 'dr7',14h,17h
db 'dr8',14h,18h
db 'dr9',14h,19h
db 'eax',10h,40h
db 'ebp',10h,45h
db 'ebx',10h,43h
db 'ecx',10h,41h
db 'edi',10h,47h
db 'edx',10h,42h
db 'efi',1Bh,10
db 'eip',10h,94h
db 'elf',18h,50h
db 'esi',10h,46h
db 'esp',10h,44h
db 'far',12h,3
db 'gui',1Bh,2
db 'mm0',10h,0B0h
db 'mm1',10h,0B1h
db 'mm2',10h,0B2h
db 'mm3',10h,0B3h
db 'mm4',10h,0B4h
db 'mm5',10h,0B5h
db 'mm6',10h,0B6h
db 'mm7',10h,0B7h
db 'r10',10h,8Ah
db 'r11',10h,8Bh
db 'r12',10h,8Ch
db 'r13',10h,8Dh
db 'r14',10h,8Eh
db 'r15',10h,8Fh
db 'r8b',10h,18h
db 'r8d',10h,48h
db 'r8l',10h,18h
db 'r8w',10h,28h
db 'r9b',10h,19h
db 'r9d',10h,49h
db 'r9l',10h,19h
db 'r9w',10h,29h
db 'rax',10h,80h
db 'rbp',10h,85h
db 'rbx',10h,83h
db 'rcx',10h,81h
db 'rdi',10h,87h
db 'rdx',10h,82h
db 'rip',10h,98h
db 'rsi',10h,86h
db 'rsp',10h,84h
db 'sae',1Fh,30h
db 'sil',10h,16h
db 'spl',10h,14h
db 'st0',10h,0A0h
db 'st1',10h,0A1h
db 'st2',10h,0A2h
db 'st3',10h,0A3h
db 'st4',10h,0A4h
db 'st5',10h,0A5h
db 'st6',10h,0A6h
db 'st7',10h,0A7h
db 'tr0',14h,40h
db 'tr1',14h,41h
db 'tr2',14h,42h
db 'tr3',14h,43h
db 'tr4',14h,44h
db 'tr5',14h,45h
db 'tr6',14h,46h
db 'tr7',14h,47h
db 'wdm',1Bh,81h
symbols_4:
db '1to2',1Fh,11h
db '1to4',1Fh,12h
db '1to8',1Fh,13h
db 'bnd0',14h,60h
db 'bnd1',14h,61h
db 'bnd2',14h,62h
db 'bnd3',14h,63h
db 'byte',11h,1
db 'code',19h,5
db 'coff',18h,40h
db 'cr10',14h,0Ah
db 'cr11',14h,0Bh
db 'cr12',14h,0Ch
db 'cr13',14h,0Dh
db 'cr14',14h,0Eh
db 'cr15',14h,0Fh
db 'data',19h,6
db 'dr10',14h,1Ah
db 'dr11',14h,1Bh
db 'dr12',14h,1Ch
db 'dr13',14h,1Dh
db 'dr14',14h,1Eh
db 'dr15',14h,1Fh
db 'ms64',1Ch,49h
db 'near',12h,2
db 'note',1Eh,4
db 'pe64',18h,3Ch
db 'r10b',10h,1Ah
db 'r10d',10h,4Ah
db 'r10l',10h,1Ah
db 'r10w',10h,2Ah
db 'r11b',10h,1Bh
db 'r11d',10h,4Bh
db 'r11l',10h,1Bh
db 'r11w',10h,2Bh
db 'r12b',10h,1Ch
db 'r12d',10h,4Ch
db 'r12l',10h,1Ch
db 'r12w',10h,2Ch
db 'r13b',10h,1Dh
db 'r13d',10h,4Dh
db 'r13l',10h,1Dh
db 'r13w',10h,2Dh
db 'r14b',10h,1Eh
db 'r14d',10h,4Eh
db 'r14l',10h,1Eh
db 'r14w',10h,2Eh
db 'r15b',10h,1Fh
db 'r15d',10h,4Fh
db 'r15l',10h,1Fh
db 'r15w',10h,2Fh
db 'word',11h,2
db 'xmm0',10h,0C0h
db 'xmm1',10h,0C1h
db 'xmm2',10h,0C2h
db 'xmm3',10h,0C3h
db 'xmm4',10h,0C4h
db 'xmm5',10h,0C5h
db 'xmm6',10h,0C6h
db 'xmm7',10h,0C7h
db 'xmm8',10h,0C8h
db 'xmm9',10h,0C9h
db 'ymm0',10h,0E0h
db 'ymm1',10h,0E1h
db 'ymm2',10h,0E2h
db 'ymm3',10h,0E3h
db 'ymm4',10h,0E4h
db 'ymm5',10h,0E5h
db 'ymm6',10h,0E6h
db 'ymm7',10h,0E7h
db 'ymm8',10h,0E8h
db 'ymm9',10h,0E9h
db 'zmm0',10h,60h
db 'zmm1',10h,61h
db 'zmm2',10h,62h
db 'zmm3',10h,63h
db 'zmm4',10h,64h
db 'zmm5',10h,65h
db 'zmm6',10h,66h
db 'zmm7',10h,67h
db 'zmm8',10h,68h
db 'zmm9',10h,69h
symbols_5:
db '1to16',1Fh,14h
db 'dword',11h,4
db 'elf64',18h,58h
db 'fword',11h,6
db 'large',1Bh,82h
db 'pword',11h,6
db 'qword',11h,8
db 'short',12h,1
db 'tbyte',11h,0Ah
db 'tword',11h,0Ah
db 'use16',13h,16
db 'use32',13h,32
db 'use64',13h,64
db 'xmm10',10h,0CAh
db 'xmm11',10h,0CBh
db 'xmm12',10h,0CCh
db 'xmm13',10h,0CDh
db 'xmm14',10h,0CEh
db 'xmm15',10h,0CFh
db 'xmm16',10h,0D0h
db 'xmm17',10h,0D1h
db 'xmm18',10h,0D2h
db 'xmm19',10h,0D3h
db 'xmm20',10h,0D4h
db 'xmm21',10h,0D5h
db 'xmm22',10h,0D6h
db 'xmm23',10h,0D7h
db 'xmm24',10h,0D8h
db 'xmm25',10h,0D9h
db 'xmm26',10h,0DAh
db 'xmm27',10h,0DBh
db 'xmm28',10h,0DCh
db 'xmm29',10h,0DDh
db 'xmm30',10h,0DEh
db 'xmm31',10h,0DFh
db 'xword',11h,16
db 'ymm10',10h,0EAh
db 'ymm11',10h,0EBh
db 'ymm12',10h,0ECh
db 'ymm13',10h,0EDh
db 'ymm14',10h,0EEh
db 'ymm15',10h,0EFh
db 'ymm16',10h,0F0h
db 'ymm17',10h,0F1h
db 'ymm18',10h,0F2h
db 'ymm19',10h,0F3h
db 'ymm20',10h,0F4h
db 'ymm21',10h,0F5h
db 'ymm22',10h,0F6h
db 'ymm23',10h,0F7h
db 'ymm24',10h,0F8h
db 'ymm25',10h,0F9h
db 'ymm26',10h,0FAh
db 'ymm27',10h,0FBh
db 'ymm28',10h,0FCh
db 'ymm29',10h,0FDh
db 'ymm30',10h,0FEh
db 'ymm31',10h,0FFh
db 'yword',11h,32
db 'zmm10',10h,6Ah
db 'zmm11',10h,6Bh
db 'zmm12',10h,6Ch
db 'zmm13',10h,6Dh
db 'zmm14',10h,6Eh
db 'zmm15',10h,6Fh
db 'zmm16',10h,70h
db 'zmm17',10h,71h
db 'zmm18',10h,72h
db 'zmm19',10h,73h
db 'zmm20',10h,74h
db 'zmm21',10h,75h
db 'zmm22',10h,76h
db 'zmm23',10h,77h
db 'zmm24',10h,78h
db 'zmm25',10h,79h
db 'zmm26',10h,7Ah
db 'zmm27',10h,7Bh
db 'zmm28',10h,7Ch
db 'zmm29',10h,7Dh
db 'zmm30',10h,7Eh
db 'zmm31',10h,7Fh
db 'zword',11h,64
symbols_6:
db 'binary',18h,10h
db 'dqword',11h,16
db 'export',1Ah,0
db 'fixups',1Ah,5
db 'import',1Ah,1
db 'native',1Bh,1
db 'qqword',11h,32
db 'static',1Dh,1
symbols_7:
db 'console',1Bh,3
db 'dqqword',11h,64
db 'dynamic',1Eh,2
db 'efiboot',1Bh,11
symbols_8:
db 'gnurelro',1Eh,52h
db 'gnustack',1Eh,51h
db 'linkinfo',19h,9
db 'readable',19h,30
db 'resource',1Ah,2
db 'writable',19h,31
symbols_9:
db 'shareable',19h,28
db 'writeable',19h,31
symbols_10:
db 'efiruntime',1Bh,12
db 'executable',19h,29
db 'gnuehframe',1Eh,50h
db 'linkremove',19h,11
symbols_11:
db 'discardable',19h,25
db 'interpreter',1Eh,3
db 'notpageable',19h,27
symbols_end:
 
instructions:
dw instructions_2-instructions,(instructions_3-instructions_2)/(2+3)
dw instructions_3-instructions,(instructions_4-instructions_3)/(3+3)
dw instructions_4-instructions,(instructions_5-instructions_4)/(4+3)
dw instructions_5-instructions,(instructions_6-instructions_5)/(5+3)
dw instructions_6-instructions,(instructions_7-instructions_6)/(6+3)
dw instructions_7-instructions,(instructions_8-instructions_7)/(7+3)
dw instructions_8-instructions,(instructions_9-instructions_8)/(8+3)
dw instructions_9-instructions,(instructions_10-instructions_9)/(9+3)
dw instructions_10-instructions,(instructions_11-instructions_10)/(10+3)
dw instructions_11-instructions,(instructions_12-instructions_11)/(11+3)
dw instructions_12-instructions,(instructions_13-instructions_12)/(12+3)
dw instructions_13-instructions,(instructions_14-instructions_13)/(13+3)
dw instructions_14-instructions,(instructions_15-instructions_14)/(14+3)
dw instructions_15-instructions,(instructions_16-instructions_15)/(15+3)
dw instructions_16-instructions,(instructions_17-instructions_16)/(16+3)
dw instructions_17-instructions,(instructions_end-instructions_17)/(16+3)
 
instructions_2:
db 'bt',4
dw bt_instruction-instruction_handler
db 'if',0
dw if_directive-instruction_handler
db 'in',0
dw in_instruction-instruction_handler
db 'ja',77h
dw conditional_jump-instruction_handler
db 'jb',72h
dw conditional_jump-instruction_handler
db 'jc',72h
dw conditional_jump-instruction_handler
db 'je',74h
dw conditional_jump-instruction_handler
db 'jg',7Fh
dw conditional_jump-instruction_handler
db 'jl',7Ch
dw conditional_jump-instruction_handler
db 'jo',70h
dw conditional_jump-instruction_handler
db 'jp',7Ah
dw conditional_jump-instruction_handler
db 'js',78h
dw conditional_jump-instruction_handler
db 'jz',74h
dw conditional_jump-instruction_handler
db 'or',08h
dw basic_instruction-instruction_handler
instructions_3:
db 'aaa',37h
dw simple_instruction_except64-instruction_handler
db 'aad',0D5h
dw aa_instruction-instruction_handler
db 'aam',0D4h
dw aa_instruction-instruction_handler
db 'aas',3Fh
dw simple_instruction_except64-instruction_handler
db 'adc',10h
dw basic_instruction-instruction_handler
db 'add',00h
dw basic_instruction-instruction_handler
db 'and',20h
dw basic_instruction-instruction_handler
db 'bnd',0F2h
dw bnd_prefix_instruction-instruction_handler
db 'bsf',0BCh
dw bs_instruction-instruction_handler
db 'bsr',0BDh
dw bs_instruction-instruction_handler
db 'btc',7
dw bt_instruction-instruction_handler
db 'btr',6
dw bt_instruction-instruction_handler
db 'bts',5
dw bt_instruction-instruction_handler
db 'cbw',98h
dw simple_instruction_16bit-instruction_handler
db 'cdq',99h
dw simple_instruction_32bit-instruction_handler
db 'clc',0F8h
dw simple_instruction-instruction_handler
db 'cld',0FCh
dw simple_instruction-instruction_handler
db 'cli',0FAh
dw simple_instruction-instruction_handler
db 'cmc',0F5h
dw simple_instruction-instruction_handler
db 'cmp',38h
dw basic_instruction-instruction_handler
db 'cqo',99h
dw simple_instruction_64bit-instruction_handler
db 'cwd',99h
dw simple_instruction_16bit-instruction_handler
db 'daa',27h
dw simple_instruction_except64-instruction_handler
db 'das',2Fh
dw simple_instruction_except64-instruction_handler
db 'dec',1
dw inc_instruction-instruction_handler
db 'div',6
dw single_operand_instruction-instruction_handler
db 'end',0
dw end_directive-instruction_handler
db 'err',0
dw err_directive-instruction_handler
db 'fld',0
dw fld_instruction-instruction_handler
db 'fst',2
dw fld_instruction-instruction_handler
db 'hlt',0F4h
dw simple_instruction-instruction_handler
db 'inc',0
dw inc_instruction-instruction_handler
db 'ins',6Ch
dw ins_instruction-instruction_handler
db 'int',0CDh
dw int_instruction-instruction_handler
db 'jae',73h
dw conditional_jump-instruction_handler
db 'jbe',76h
dw conditional_jump-instruction_handler
db 'jge',7Dh
dw conditional_jump-instruction_handler
db 'jle',7Eh
dw conditional_jump-instruction_handler
db 'jmp',0
dw jmp_instruction-instruction_handler
db 'jna',76h
dw conditional_jump-instruction_handler
db 'jnb',73h
dw conditional_jump-instruction_handler
db 'jnc',73h
dw conditional_jump-instruction_handler
db 'jne',75h
dw conditional_jump-instruction_handler
db 'jng',7Eh
dw conditional_jump-instruction_handler
db 'jnl',7Dh
dw conditional_jump-instruction_handler
db 'jno',71h
dw conditional_jump-instruction_handler
db 'jnp',7Bh
dw conditional_jump-instruction_handler
db 'jns',79h
dw conditional_jump-instruction_handler
db 'jnz',75h
dw conditional_jump-instruction_handler
db 'jpe',7Ah
dw conditional_jump-instruction_handler
db 'jpo',7Bh
dw conditional_jump-instruction_handler
db 'lar',2
dw lar_instruction-instruction_handler
db 'lds',3
dw ls_instruction-instruction_handler
db 'lea',0
dw lea_instruction-instruction_handler
db 'les',0
dw ls_instruction-instruction_handler
db 'lfs',4
dw ls_instruction-instruction_handler
db 'lgs',5
dw ls_instruction-instruction_handler
db 'lsl',3
dw lar_instruction-instruction_handler
db 'lss',2
dw ls_instruction-instruction_handler
db 'ltr',3
dw pm_word_instruction-instruction_handler
db 'mov',0
dw mov_instruction-instruction_handler
db 'mul',4
dw single_operand_instruction-instruction_handler
db 'neg',3
dw single_operand_instruction-instruction_handler
db 'nop',90h
dw nop_instruction-instruction_handler
db 'not',2
dw single_operand_instruction-instruction_handler
db 'org',0
dw org_directive-instruction_handler
db 'out',0
dw out_instruction-instruction_handler
db 'pop',0
dw pop_instruction-instruction_handler
db 'por',0EBh
dw basic_mmx_instruction-instruction_handler
db 'rcl',2
dw sh_instruction-instruction_handler
db 'rcr',3
dw sh_instruction-instruction_handler
db 'rep',0F3h
dw prefix_instruction-instruction_handler
db 'ret',0C2h
dw ret_instruction-instruction_handler
db 'rol',0
dw sh_instruction-instruction_handler
db 'ror',1
dw sh_instruction-instruction_handler
db 'rsm',0AAh
dw simple_extended_instruction-instruction_handler
db 'sal',4
dw sh_instruction-instruction_handler
db 'sar',7
dw sh_instruction-instruction_handler
db 'sbb',18h
dw basic_instruction-instruction_handler
db 'shl',4
dw sh_instruction-instruction_handler
db 'shr',5
dw sh_instruction-instruction_handler
db 'stc',0F9h
dw simple_instruction-instruction_handler
db 'std',0FDh
dw simple_instruction-instruction_handler
db 'sti',0FBh
dw simple_instruction-instruction_handler
db 'str',1
dw pm_store_word_instruction-instruction_handler
db 'sub',28h
dw basic_instruction-instruction_handler
db 'ud0',0FFh
dw ud_instruction-instruction_handler
db 'ud1',0B9h
dw ud_instruction-instruction_handler
db 'ud2',0Bh
dw simple_extended_instruction-instruction_handler
db 'xor',30h
dw basic_instruction-instruction_handler
instructions_4:
db 'adcx',66h
dw adx_instruction-instruction_handler
db 'adox',0F3h
dw adx_instruction-instruction_handler
db 'andn',0F2h
dw andn_instruction-instruction_handler
db 'arpl',0
dw arpl_instruction-instruction_handler
db 'blci',26h
dw tbm_instruction-instruction_handler
db 'blcs',13h
dw tbm_instruction-instruction_handler
db 'blsi',3
dw bmi_instruction-instruction_handler
db 'blsr',1
dw bmi_instruction-instruction_handler
db 'bzhi',0F5h
dw bzhi_instruction-instruction_handler
db 'call',0
dw call_instruction-instruction_handler
db 'cdqe',98h
dw simple_instruction_64bit-instruction_handler
db 'clac',0CAh
dw simple_instruction_0f_01-instruction_handler
db 'clgi',0DDh
dw simple_instruction_0f_01-instruction_handler
db 'clts',6
dw simple_extended_instruction-instruction_handler
db 'clwb',6
dw clflushopt_instruction-instruction_handler
db 'cmps',0A6h
dw cmps_instruction-instruction_handler
db 'cwde',98h
dw simple_instruction_32bit-instruction_handler
db 'data',0
dw data_directive-instruction_handler
db 'dppd',41h
dw sse4_instruction_66_3a_imm8-instruction_handler
db 'dpps',40h
dw sse4_instruction_66_3a_imm8-instruction_handler
db 'else',0
dw else_directive-instruction_handler
db 'emms',77h
dw simple_extended_instruction-instruction_handler
db 'fabs',100001b
dw simple_fpu_instruction-instruction_handler
db 'fadd',0
dw basic_fpu_instruction-instruction_handler
db 'fbld',4
dw fbld_instruction-instruction_handler
db 'fchs',100000b
dw simple_fpu_instruction-instruction_handler
db 'fcom',2
dw basic_fpu_instruction-instruction_handler
db 'fcos',111111b
dw simple_fpu_instruction-instruction_handler
db 'fdiv',6
dw basic_fpu_instruction-instruction_handler
db 'feni',0E0h
dw finit_instruction-instruction_handler
db 'fild',0
dw fild_instruction-instruction_handler
db 'fist',2
dw fild_instruction-instruction_handler
db 'fld1',101000b
dw simple_fpu_instruction-instruction_handler
db 'fldz',101110b
dw simple_fpu_instruction-instruction_handler
db 'fmul',1
dw basic_fpu_instruction-instruction_handler
db 'fnop',010000b
dw simple_fpu_instruction-instruction_handler
db 'fsin',111110b
dw simple_fpu_instruction-instruction_handler
db 'fstp',3
dw fld_instruction-instruction_handler
db 'fsub',4
dw basic_fpu_instruction-instruction_handler
db 'ftst',100100b
dw simple_fpu_instruction-instruction_handler
db 'fxam',100101b
dw simple_fpu_instruction-instruction_handler
db 'fxch',0
dw fxch_instruction-instruction_handler
db 'heap',0
dw heap_directive-instruction_handler
db 'idiv',7
dw single_operand_instruction-instruction_handler
db 'imul',0
dw imul_instruction-instruction_handler
db 'insb',6Ch
dw simple_instruction-instruction_handler
db 'insd',6Dh
dw simple_instruction_32bit-instruction_handler
db 'insw',6Dh
dw simple_instruction_16bit-instruction_handler
db 'int1',0F1h
dw simple_instruction-instruction_handler
db 'int3',0CCh
dw simple_instruction-instruction_handler
db 'into',0CEh
dw simple_instruction_except64-instruction_handler
db 'invd',8
dw simple_extended_instruction-instruction_handler
db 'iret',0CFh
dw iret_instruction-instruction_handler
db 'jcxz',0E3h
dw loop_instruction_16bit-instruction_handler
db 'jnae',72h
dw conditional_jump-instruction_handler
db 'jnbe',77h
dw conditional_jump-instruction_handler
db 'jnge',7Ch
dw conditional_jump-instruction_handler
db 'jnle',7Fh
dw conditional_jump-instruction_handler
db 'korb',45h
dw mask_instruction_b-instruction_handler
db 'kord',45h
dw mask_instruction_d-instruction_handler
db 'korq',45h
dw mask_instruction_q-instruction_handler
db 'korw',45h
dw mask_instruction_w-instruction_handler
db 'lahf',9Fh
dw simple_instruction-instruction_handler
db 'lgdt',2
dw lgdt_instruction-instruction_handler
db 'lidt',3
dw lgdt_instruction-instruction_handler
db 'lldt',2
dw pm_word_instruction-instruction_handler
db 'lmsw',16h
dw pm_word_instruction-instruction_handler
db 'load',0
dw load_directive-instruction_handler
db 'lock',0F0h
dw prefix_instruction-instruction_handler
db 'lods',0ACh
dw lods_instruction-instruction_handler
db 'loop',0E2h
dw loop_instruction-instruction_handler
db 'movd',0
dw movd_instruction-instruction_handler
db 'movq',0
dw movq_instruction-instruction_handler
db 'movs',0A4h
dw movs_instruction-instruction_handler
db 'mulx',0F6h
dw pdep_instruction-instruction_handler
db 'orpd',56h
dw sse_pd_instruction-instruction_handler
db 'orps',56h
dw sse_ps_instruction-instruction_handler
db 'outs',6Eh
dw outs_instruction-instruction_handler
db 'pand',0DBh
dw basic_mmx_instruction-instruction_handler
db 'pdep',0F5h
dw pdep_instruction-instruction_handler
db 'pext',0F5h
dw pext_instruction-instruction_handler
db 'popa',61h
dw simple_instruction_except64-instruction_handler
db 'popd',4
dw pop_instruction-instruction_handler
db 'popf',9Dh
dw simple_instruction-instruction_handler
db 'popq',8
dw pop_instruction-instruction_handler
db 'popw',2
dw pop_instruction-instruction_handler
db 'push',0
dw push_instruction-instruction_handler
db 'pxor',0EFh
dw basic_mmx_instruction-instruction_handler
db 'repe',0F3h
dw prefix_instruction-instruction_handler
db 'repz',0F3h
dw prefix_instruction-instruction_handler
db 'retd',0C2h
dw ret_instruction_32bit_except64-instruction_handler
db 'retf',0CAh
dw retf_instruction-instruction_handler
db 'retn',0C2h
dw ret_instruction-instruction_handler
db 'retq',0C2h
dw ret_instruction_only64-instruction_handler
db 'retw',0C2h
dw ret_instruction_16bit-instruction_handler
db 'rorx',0F0h
dw rorx_instruction-instruction_handler
db 'sahf',9Eh
dw simple_instruction-instruction_handler
db 'salc',0D6h
dw simple_instruction_except64-instruction_handler
db 'sarx',0F7h
dw sarx_instruction-instruction_handler
db 'scas',0AEh
dw stos_instruction-instruction_handler
db 'seta',97h
dw set_instruction-instruction_handler
db 'setb',92h
dw set_instruction-instruction_handler
db 'setc',92h
dw set_instruction-instruction_handler
db 'sete',94h
dw set_instruction-instruction_handler
db 'setg',9Fh
dw set_instruction-instruction_handler
db 'setl',9Ch
dw set_instruction-instruction_handler
db 'seto',90h
dw set_instruction-instruction_handler
db 'setp',9Ah
dw set_instruction-instruction_handler
db 'sets',98h
dw set_instruction-instruction_handler
db 'setz',94h
dw set_instruction-instruction_handler
db 'sgdt',0
dw lgdt_instruction-instruction_handler
db 'shld',0A4h
dw shd_instruction-instruction_handler
db 'shlx',0F7h
dw shlx_instruction-instruction_handler
db 'shrd',0ACh
dw shd_instruction-instruction_handler
db 'shrx',0F7h
dw shrx_instruction-instruction_handler
db 'sidt',1
dw lgdt_instruction-instruction_handler
db 'sldt',0
dw pm_store_word_instruction-instruction_handler
db 'smsw',14h
dw pm_store_word_instruction-instruction_handler
db 'stac',0CBh
dw simple_instruction_0f_01-instruction_handler
db 'stgi',0DCh
dw simple_instruction_0f_01-instruction_handler
db 'stos',0AAh
dw stos_instruction-instruction_handler
db 'test',0
dw test_instruction-instruction_handler
db 'verr',4
dw pm_word_instruction-instruction_handler
db 'verw',5
dw pm_word_instruction-instruction_handler
db 'vpor',0EBh
dw avx_pd_instruction_noevex-instruction_handler
db 'wait',9Bh
dw simple_instruction-instruction_handler
db 'xadd',0C0h
dw basic_486_instruction-instruction_handler
db 'xchg',0
dw xchg_instruction-instruction_handler
db 'xend',0D5h
dw simple_instruction_0f_01-instruction_handler
db 'xlat',0D7h
dw xlat_instruction-instruction_handler
instructions_5:
db 'addpd',58h
dw sse_pd_instruction-instruction_handler
db 'addps',58h
dw sse_ps_instruction-instruction_handler
db 'addsd',58h
dw sse_sd_instruction-instruction_handler
db 'addss',58h
dw sse_ss_instruction-instruction_handler
db 'align',0
dw align_directive-instruction_handler
db 'andpd',54h
dw sse_pd_instruction-instruction_handler
db 'andps',54h
dw sse_ps_instruction-instruction_handler
db 'bextr',0F7h
dw bextr_instruction-instruction_handler
db 'blcic',15h
dw tbm_instruction-instruction_handler
db 'blsic',16h
dw tbm_instruction-instruction_handler
db 'bndcl',1Ah
dw bndcl_instruction-instruction_handler
db 'bndcn',1Bh
dw bndcu_instruction-instruction_handler
db 'bndcu',1Ah
dw bndcu_instruction-instruction_handler
db 'bndmk',1Bh
dw bndmk_instruction-instruction_handler
db 'bound',0
dw bound_instruction-instruction_handler
db 'break',0
dw break_directive-instruction_handler
db 'bswap',0
dw bswap_instruction-instruction_handler
db 'cmova',47h
dw bs_instruction-instruction_handler
db 'cmovb',42h
dw bs_instruction-instruction_handler
db 'cmovc',42h
dw bs_instruction-instruction_handler
db 'cmove',44h
dw bs_instruction-instruction_handler
db 'cmovg',4Fh
dw bs_instruction-instruction_handler
db 'cmovl',4Ch
dw bs_instruction-instruction_handler
db 'cmovo',40h
dw bs_instruction-instruction_handler
db 'cmovp',4Ah
dw bs_instruction-instruction_handler
db 'cmovs',48h
dw bs_instruction-instruction_handler
db 'cmovz',44h
dw bs_instruction-instruction_handler
db 'cmppd',-1
dw cmp_pd_instruction-instruction_handler
db 'cmpps',-1
dw cmp_ps_instruction-instruction_handler
db 'cmpsb',0A6h
dw simple_instruction-instruction_handler
db 'cmpsd',-1
dw cmpsd_instruction-instruction_handler
db 'cmpsq',0A7h
dw simple_instruction_64bit-instruction_handler
db 'cmpss',-1
dw cmp_ss_instruction-instruction_handler
db 'cmpsw',0A7h
dw simple_instruction_16bit-instruction_handler
db 'cpuid',0A2h
dw simple_extended_instruction-instruction_handler
db 'crc32',0
dw crc32_instruction-instruction_handler
db 'divpd',5Eh
dw sse_pd_instruction-instruction_handler
db 'divps',5Eh
dw sse_ps_instruction-instruction_handler
db 'divsd',5Eh
dw sse_sd_instruction-instruction_handler
db 'divss',5Eh
dw sse_ss_instruction-instruction_handler
db 'enter',0
dw enter_instruction-instruction_handler
db 'entry',0
dw entry_directive-instruction_handler
db 'extrn',0
dw extrn_directive-instruction_handler
db 'extrq',0
dw extrq_instruction-instruction_handler
db 'f2xm1',110000b
dw simple_fpu_instruction-instruction_handler
db 'faddp',0
dw faddp_instruction-instruction_handler
db 'fbstp',6
dw fbld_instruction-instruction_handler
db 'fclex',0E2h
dw finit_instruction-instruction_handler
db 'fcomi',0F0h
dw fcomi_instruction-instruction_handler
db 'fcomp',3
dw basic_fpu_instruction-instruction_handler
db 'fdisi',0E1h
dw finit_instruction-instruction_handler
db 'fdivp',7
dw faddp_instruction-instruction_handler
db 'fdivr',7
dw basic_fpu_instruction-instruction_handler
db 'femms',0Eh
dw simple_extended_instruction-instruction_handler
db 'ffree',0
dw ffree_instruction-instruction_handler
db 'fiadd',0
dw fi_instruction-instruction_handler
db 'ficom',2
dw fi_instruction-instruction_handler
db 'fidiv',6
dw fi_instruction-instruction_handler
db 'fimul',1
dw fi_instruction-instruction_handler
db 'finit',0E3h
dw finit_instruction-instruction_handler
db 'fistp',3
dw fild_instruction-instruction_handler
db 'fisub',4
dw fi_instruction-instruction_handler
db 'fldcw',5
dw fldcw_instruction-instruction_handler
db 'fldpi',101011b
dw simple_fpu_instruction-instruction_handler
db 'fmulp',1
dw faddp_instruction-instruction_handler
db 'fneni',0E0h
dw fninit_instruction-instruction_handler
db 'fprem',111000b
dw simple_fpu_instruction-instruction_handler
db 'fptan',110010b
dw simple_fpu_instruction-instruction_handler
db 'fsave',6
dw fsave_instruction-instruction_handler
db 'fsqrt',111010b
dw simple_fpu_instruction-instruction_handler
db 'fstcw',7
dw fstcw_instruction-instruction_handler
db 'fstsw',0
dw fstsw_instruction-instruction_handler
db 'fsubp',5
dw faddp_instruction-instruction_handler
db 'fsubr',5
dw basic_fpu_instruction-instruction_handler
db 'fucom',4
dw ffree_instruction-instruction_handler
db 'fwait',9Bh
dw simple_instruction-instruction_handler
db 'fyl2x',110001b
dw simple_fpu_instruction-instruction_handler
db 'icebp',0F1h
dw simple_instruction-instruction_handler
db 'iretd',0CFh
dw simple_instruction_32bit-instruction_handler
db 'iretq',0CFh
dw simple_instruction_64bit-instruction_handler
db 'iretw',0CFh
dw simple_instruction_16bit-instruction_handler
db 'jecxz',0E3h
dw loop_instruction_32bit-instruction_handler
db 'jrcxz',0E3h
dw loop_instruction_64bit-instruction_handler
db 'kaddb',4Ah
dw mask_instruction_b-instruction_handler
db 'kaddd',4Ah
dw mask_instruction_d-instruction_handler
db 'kaddq',4Ah
dw mask_instruction_q-instruction_handler
db 'kaddw',4Ah
dw mask_instruction_w-instruction_handler
db 'kandb',41h
dw mask_instruction_b-instruction_handler
db 'kandd',41h
dw mask_instruction_d-instruction_handler
db 'kandq',41h
dw mask_instruction_q-instruction_handler
db 'kandw',41h
dw mask_instruction_w-instruction_handler
db 'kmovb',1
dw kmov_instruction-instruction_handler
db 'kmovd',4
dw kmov_instruction-instruction_handler
db 'kmovq',8
dw kmov_instruction-instruction_handler
db 'kmovw',2
dw kmov_instruction-instruction_handler
db 'knotb',44h
dw mask_instruction_single_source_b-instruction_handler
db 'knotd',44h
dw mask_instruction_single_source_d-instruction_handler
db 'knotq',44h
dw mask_instruction_single_source_q-instruction_handler
db 'knotw',44h
dw mask_instruction_single_source_w-instruction_handler
db 'kxorb',47h
dw mask_instruction_b-instruction_handler
db 'kxord',47h
dw mask_instruction_d-instruction_handler
db 'kxorq',47h
dw mask_instruction_q-instruction_handler
db 'kxorw',47h
dw mask_instruction_w-instruction_handler
db 'label',0
dw label_directive-instruction_handler
db 'lddqu',0
dw lddqu_instruction-instruction_handler
db 'leave',0C9h
dw simple_instruction-instruction_handler
db 'lodsb',0ACh
dw simple_instruction-instruction_handler
db 'lodsd',0ADh
dw simple_instruction_32bit-instruction_handler
db 'lodsq',0ADh
dw simple_instruction_64bit-instruction_handler
db 'lodsw',0ADh
dw simple_instruction_16bit-instruction_handler
db 'loopd',0E2h
dw loop_instruction_32bit-instruction_handler
db 'loope',0E1h
dw loop_instruction-instruction_handler
db 'loopq',0E2h
dw loop_instruction_64bit-instruction_handler
db 'loopw',0E2h
dw loop_instruction_16bit-instruction_handler
db 'loopz',0E1h
dw loop_instruction-instruction_handler
db 'lzcnt',0BDh
dw popcnt_instruction-instruction_handler
db 'maxpd',5Fh
dw sse_pd_instruction-instruction_handler
db 'maxps',5Fh
dw sse_ps_instruction-instruction_handler
db 'maxsd',5Fh
dw sse_sd_instruction-instruction_handler
db 'maxss',5Fh
dw sse_ss_instruction-instruction_handler
db 'minpd',5Dh
dw sse_pd_instruction-instruction_handler
db 'minps',5Dh
dw sse_ps_instruction-instruction_handler
db 'minsd',5Dh
dw sse_sd_instruction-instruction_handler
db 'minss',5Dh
dw sse_ss_instruction-instruction_handler
db 'movbe',0F0h
dw movbe_instruction-instruction_handler
db 'movsb',0A4h
dw simple_instruction-instruction_handler
db 'movsd',0
dw movsd_instruction-instruction_handler
db 'movsq',0A5h
dw simple_instruction_64bit-instruction_handler
db 'movss',0
dw movss_instruction-instruction_handler
db 'movsw',0A5h
dw simple_instruction_16bit-instruction_handler
db 'movsx',0BEh
dw movx_instruction-instruction_handler
db 'movzx',0B6h
dw movx_instruction-instruction_handler
db 'mulpd',59h
dw sse_pd_instruction-instruction_handler
db 'mulps',59h
dw sse_ps_instruction-instruction_handler
db 'mulsd',59h
dw sse_sd_instruction-instruction_handler
db 'mulss',59h
dw sse_ss_instruction-instruction_handler
db 'mwait',0C9h
dw monitor_instruction-instruction_handler
db 'outsb',6Eh
dw simple_instruction-instruction_handler
db 'outsd',6Fh
dw simple_instruction_32bit-instruction_handler
db 'outsw',6Fh
dw simple_instruction_16bit-instruction_handler
db 'pabsb',1Ch
dw ssse3_instruction-instruction_handler
db 'pabsd',1Eh
dw ssse3_instruction-instruction_handler
db 'pabsw',1Dh
dw ssse3_instruction-instruction_handler
db 'paddb',0FCh
dw basic_mmx_instruction-instruction_handler
db 'paddd',0FEh
dw basic_mmx_instruction-instruction_handler
db 'paddq',0D4h
dw basic_mmx_instruction-instruction_handler
db 'paddw',0FDh
dw basic_mmx_instruction-instruction_handler
db 'pandn',0DFh
dw basic_mmx_instruction-instruction_handler
db 'pause',0
dw pause_instruction-instruction_handler
db 'pavgb',0E0h
dw basic_mmx_instruction-instruction_handler
db 'pavgw',0E3h
dw basic_mmx_instruction-instruction_handler
db 'pf2id',1Dh
dw amd3dnow_instruction-instruction_handler
db 'pf2iw',1Ch
dw amd3dnow_instruction-instruction_handler
db 'pfacc',0AEh
dw amd3dnow_instruction-instruction_handler
db 'pfadd',9Eh
dw amd3dnow_instruction-instruction_handler
db 'pfmax',0A4h
dw amd3dnow_instruction-instruction_handler
db 'pfmin',94h
dw amd3dnow_instruction-instruction_handler
db 'pfmul',0B4h
dw amd3dnow_instruction-instruction_handler
db 'pfrcp',96h
dw amd3dnow_instruction-instruction_handler
db 'pfsub',9Ah
dw amd3dnow_instruction-instruction_handler
db 'pi2fd',0Dh
dw amd3dnow_instruction-instruction_handler
db 'pi2fw',0Ch
dw amd3dnow_instruction-instruction_handler
db 'popad',61h
dw simple_instruction_32bit_except64-instruction_handler
db 'popaw',61h
dw simple_instruction_16bit_except64-instruction_handler
db 'popfd',9Dh
dw simple_instruction_32bit_except64-instruction_handler
db 'popfq',9Dh
dw simple_instruction_only64-instruction_handler
db 'popfw',9Dh
dw simple_instruction_16bit-instruction_handler
db 'pslld',0F2h
dw mmx_bit_shift_instruction-instruction_handler
db 'psllq',0F3h
dw mmx_bit_shift_instruction-instruction_handler
db 'psllw',0F1h
dw mmx_bit_shift_instruction-instruction_handler
db 'psrad',0E2h
dw mmx_bit_shift_instruction-instruction_handler
db 'psraw',0E1h
dw mmx_bit_shift_instruction-instruction_handler
db 'psrld',0D2h
dw mmx_bit_shift_instruction-instruction_handler
db 'psrlq',0D3h
dw mmx_bit_shift_instruction-instruction_handler
db 'psrlw',0D1h
dw mmx_bit_shift_instruction-instruction_handler
db 'psubb',0F8h
dw basic_mmx_instruction-instruction_handler
db 'psubd',0FAh
dw basic_mmx_instruction-instruction_handler
db 'psubq',0FBh
dw basic_mmx_instruction-instruction_handler
db 'psubw',0F9h
dw basic_mmx_instruction-instruction_handler
db 'ptest',17h
dw sse4_instruction_66_38-instruction_handler
db 'pusha',60h
dw simple_instruction_except64-instruction_handler
db 'pushd',4
dw push_instruction-instruction_handler
db 'pushf',9Ch
dw simple_instruction-instruction_handler
db 'pushq',8
dw push_instruction-instruction_handler
db 'pushw',2
dw push_instruction-instruction_handler
db 'rcpps',53h
dw sse_ps_instruction-instruction_handler
db 'rcpss',53h
dw sse_ss_instruction-instruction_handler
db 'rdmsr',32h
dw simple_extended_instruction-instruction_handler
db 'rdpid',7
dw rdpid_instruction-instruction_handler
db 'rdpmc',33h
dw simple_extended_instruction-instruction_handler
db 'rdpru',0FDh
dw simple_instruction_0f_01-instruction_handler
db 'rdtsc',31h
dw simple_extended_instruction-instruction_handler
db 'repne',0F2h
dw prefix_instruction-instruction_handler
db 'repnz',0F2h
dw prefix_instruction-instruction_handler
db 'retfd',0CAh
dw retf_instruction_32bit-instruction_handler
db 'retfq',0CAh
dw retf_instruction_64bit-instruction_handler
db 'retfw',0CAh
dw retf_instruction_16bit-instruction_handler
db 'retnd',0C2h
dw ret_instruction_32bit_except64-instruction_handler
db 'retnq',0C2h
dw ret_instruction_only64-instruction_handler
db 'retnw',0C2h
dw ret_instruction_16bit-instruction_handler
db 'scasb',0AEh
dw simple_instruction-instruction_handler
db 'scasd',0AFh
dw simple_instruction_32bit-instruction_handler
db 'scasq',0AFh
dw simple_instruction_64bit-instruction_handler
db 'scasw',0AFh
dw simple_instruction_16bit-instruction_handler
db 'setae',93h
dw set_instruction-instruction_handler
db 'setbe',96h
dw set_instruction-instruction_handler
db 'setge',9Dh
dw set_instruction-instruction_handler
db 'setle',9Eh
dw set_instruction-instruction_handler
db 'setna',96h
dw set_instruction-instruction_handler
db 'setnb',93h
dw set_instruction-instruction_handler
db 'setnc',93h
dw set_instruction-instruction_handler
db 'setne',95h
dw set_instruction-instruction_handler
db 'setng',9Eh
dw set_instruction-instruction_handler
db 'setnl',9Dh
dw set_instruction-instruction_handler
db 'setno',91h
dw set_instruction-instruction_handler
db 'setnp',9Bh
dw set_instruction-instruction_handler
db 'setns',99h
dw set_instruction-instruction_handler
db 'setnz',95h
dw set_instruction-instruction_handler
db 'setpe',9Ah
dw set_instruction-instruction_handler
db 'setpo',9Bh
dw set_instruction-instruction_handler
db 'stack',0
dw stack_directive-instruction_handler
db 'store',0
dw store_directive-instruction_handler
db 'stosb',0AAh
dw simple_instruction-instruction_handler
db 'stosd',0ABh
dw simple_instruction_32bit-instruction_handler
db 'stosq',0ABh
dw simple_instruction_64bit-instruction_handler
db 'stosw',0ABh
dw simple_instruction_16bit-instruction_handler
db 'subpd',5Ch
dw sse_pd_instruction-instruction_handler
db 'subps',5Ch
dw sse_ps_instruction-instruction_handler
db 'subsd',5Ch
dw sse_sd_instruction-instruction_handler
db 'subss',5Ch
dw sse_ss_instruction-instruction_handler
db 'times',0
dw times_directive-instruction_handler
db 'tzcnt',0BCh
dw popcnt_instruction-instruction_handler
db 'tzmsk',14h
dw tbm_instruction-instruction_handler
db 'vdppd',41h
dw avx_128bit_instruction_3a_imm8_noevex-instruction_handler
db 'vdpps',40h
dw avx_pi_instruction_3a_imm8_noevex-instruction_handler
db 'vmovd',0
dw avx_movd_instruction-instruction_handler
db 'vmovq',0
dw avx_movq_instruction-instruction_handler
db 'vmrun',0D8h
dw simple_svm_instruction-instruction_handler
db 'vmxon',6
dw vmxon_instruction-instruction_handler
db 'vorpd',56h
dw avx_pd_instruction-instruction_handler
db 'vorps',56h
dw avx_ps_instruction-instruction_handler
db 'vpand',0DBh
dw avx_pd_instruction_noevex-instruction_handler
db 'vpord',0EBh
dw avx_d_instruction_evex-instruction_handler
db 'vporq',0EBh
dw avx_q_instruction_evex-instruction_handler
db 'vpxor',0EFh
dw avx_pd_instruction_noevex-instruction_handler
db 'while',0
dw while_directive-instruction_handler
db 'wrmsr',30h
dw simple_extended_instruction-instruction_handler
db 'wrssd',0F6h
dw wrssd_instruction-instruction_handler
db 'wrssq',0F6h
dw wrssq_instruction-instruction_handler
db 'xlatb',0D7h
dw simple_instruction-instruction_handler
db 'xorpd',57h
dw sse_pd_instruction-instruction_handler
db 'xorps',57h
dw sse_ps_instruction-instruction_handler
db 'xsave',100b
dw fxsave_instruction-instruction_handler
db 'xtest',0D6h
dw simple_instruction_0f_01-instruction_handler
instructions_6:
db 'aesdec',0DEh
dw sse4_instruction_66_38-instruction_handler
db 'aesenc',0DCh
dw sse4_instruction_66_38-instruction_handler
db 'aesimc',0DBh
dw sse4_instruction_66_38-instruction_handler
db 'andnpd',55h
dw sse_pd_instruction-instruction_handler
db 'andnps',55h
dw sse_ps_instruction-instruction_handler
db 'assert',0
dw assert_directive-instruction_handler
db 'blcmsk',21h
dw tbm_instruction-instruction_handler
db 'blsmsk',2
dw bmi_instruction-instruction_handler
db 'bndldx',1Ah
dw bndldx_instruction-instruction_handler
db 'bndmov',1Ah
dw bndmov_instruction-instruction_handler
db 'bndstx',1Bh
dw bndstx_instruction-instruction_handler
db 'clzero',0
dw clzero_instruction-instruction_handler
db 'cmovae',43h
dw bs_instruction-instruction_handler
db 'cmovbe',46h
dw bs_instruction-instruction_handler
db 'cmovge',4Dh
dw bs_instruction-instruction_handler
db 'cmovle',4Eh
dw bs_instruction-instruction_handler
db 'cmovna',46h
dw bs_instruction-instruction_handler
db 'cmovnb',43h
dw bs_instruction-instruction_handler
db 'cmovnc',43h
dw bs_instruction-instruction_handler
db 'cmovne',45h
dw bs_instruction-instruction_handler
db 'cmovng',4Eh
dw bs_instruction-instruction_handler
db 'cmovnl',4Dh
dw bs_instruction-instruction_handler
db 'cmovno',41h
dw bs_instruction-instruction_handler
db 'cmovnp',4Bh
dw bs_instruction-instruction_handler
db 'cmovns',49h
dw bs_instruction-instruction_handler
db 'cmovnz',45h
dw bs_instruction-instruction_handler
db 'cmovpe',4Ah
dw bs_instruction-instruction_handler
db 'cmovpo',4Bh
dw bs_instruction-instruction_handler
db 'comisd',2Fh
dw comisd_instruction-instruction_handler
db 'comiss',2Fh
dw comiss_instruction-instruction_handler
db 'fcmovb',0C0h
dw fcmov_instruction-instruction_handler
db 'fcmove',0C8h
dw fcmov_instruction-instruction_handler
db 'fcmovu',0D8h
dw fcmov_instruction-instruction_handler
db 'fcomip',0F0h
dw fcomip_instruction-instruction_handler
db 'fcompp',0
dw fcompp_instruction-instruction_handler
db 'fdivrp',6
dw faddp_instruction-instruction_handler
db 'ffreep',0
dw ffreep_instruction-instruction_handler
db 'ficomp',3
dw fi_instruction-instruction_handler
db 'fidivr',7
dw fi_instruction-instruction_handler
db 'fisttp',1
dw fild_instruction-instruction_handler
db 'fisubr',5
dw fi_instruction-instruction_handler
db 'fldenv',4
dw fldenv_instruction-instruction_handler
db 'fldl2e',101010b
dw simple_fpu_instruction-instruction_handler
db 'fldl2t',101001b
dw simple_fpu_instruction-instruction_handler
db 'fldlg2',101100b
dw simple_fpu_instruction-instruction_handler
db 'fldln2',101101b
dw simple_fpu_instruction-instruction_handler
db 'fnclex',0E2h
dw fninit_instruction-instruction_handler
db 'fndisi',0E1h
dw fninit_instruction-instruction_handler
db 'fninit',0E3h
dw fninit_instruction-instruction_handler
db 'fnsave',6
dw fnsave_instruction-instruction_handler
db 'fnstcw',7
dw fldcw_instruction-instruction_handler
db 'fnstsw',0
dw fnstsw_instruction-instruction_handler
db 'format',0
dw format_directive-instruction_handler
db 'fpatan',110011b
dw simple_fpu_instruction-instruction_handler
db 'fprem1',110101b
dw simple_fpu_instruction-instruction_handler
db 'frstor',4
dw fnsave_instruction-instruction_handler
db 'frstpm',0E5h
dw fninit_instruction-instruction_handler
db 'fsaved',6
dw fsave_instruction_32bit-instruction_handler
db 'fsavew',6
dw fsave_instruction_16bit-instruction_handler
db 'fscale',111101b
dw simple_fpu_instruction-instruction_handler
db 'fsetpm',0E4h
dw fninit_instruction-instruction_handler
db 'fstenv',6
dw fstenv_instruction-instruction_handler
db 'fsubrp',4
dw faddp_instruction-instruction_handler
db 'fucomi',0E8h
dw fcomi_instruction-instruction_handler
db 'fucomp',5
dw ffree_instruction-instruction_handler
db 'fxsave',0
dw fxsave_instruction-instruction_handler
db 'getsec',37h
dw simple_extended_instruction-instruction_handler
db 'haddpd',07Ch
dw sse_pd_instruction-instruction_handler
db 'haddps',07Ch
dw cvtpd2dq_instruction-instruction_handler
db 'hsubpd',07Dh
dw sse_pd_instruction-instruction_handler
db 'hsubps',07Dh
dw cvtpd2dq_instruction-instruction_handler
db 'invept',80h
dw vmx_inv_instruction-instruction_handler
db 'invlpg',0
dw invlpg_instruction-instruction_handler
db 'kandnb',42h
dw mask_instruction_b-instruction_handler
db 'kandnd',42h
dw mask_instruction_d-instruction_handler
db 'kandnq',42h
dw mask_instruction_q-instruction_handler
db 'kandnw',42h
dw mask_instruction_w-instruction_handler
db 'ktestb',99h
dw mask_instruction_single_source_b-instruction_handler
db 'ktestd',99h
dw mask_instruction_single_source_d-instruction_handler
db 'ktestq',99h
dw mask_instruction_single_source_q-instruction_handler
db 'ktestw',99h
dw mask_instruction_single_source_w-instruction_handler
db 'kxnorb',46h
dw mask_instruction_b-instruction_handler
db 'kxnord',46h
dw mask_instruction_d-instruction_handler
db 'kxnorq',46h
dw mask_instruction_q-instruction_handler
db 'kxnorw',46h
dw mask_instruction_w-instruction_handler
db 'lfence',0E8h
dw fence_instruction-instruction_handler
db 'llwpcb',0
dw llwpcb_instruction-instruction_handler
db 'looped',0E1h
dw loop_instruction_32bit-instruction_handler
db 'loopeq',0E1h
dw loop_instruction_64bit-instruction_handler
db 'loopew',0E1h
dw loop_instruction_16bit-instruction_handler
db 'loopne',0E0h
dw loop_instruction-instruction_handler
db 'loopnz',0E0h
dw loop_instruction-instruction_handler
db 'loopzd',0E1h
dw loop_instruction_32bit-instruction_handler
db 'loopzq',0E1h
dw loop_instruction_64bit-instruction_handler
db 'loopzw',0E1h
dw loop_instruction_16bit-instruction_handler
db 'lwpins',0
dw lwpins_instruction-instruction_handler
db 'lwpval',1
dw lwpins_instruction-instruction_handler
db 'mfence',0F0h
dw fence_instruction-instruction_handler
db 'movapd',28h
dw movpd_instruction-instruction_handler
db 'movaps',28h
dw movps_instruction-instruction_handler
db 'movdqa',66h
dw movdq_instruction-instruction_handler
db 'movdqu',0F3h
dw movdq_instruction-instruction_handler
db 'movhpd',16h
dw movlpd_instruction-instruction_handler
db 'movhps',16h
dw movlps_instruction-instruction_handler
db 'movlpd',12h
dw movlpd_instruction-instruction_handler
db 'movlps',12h
dw movlps_instruction-instruction_handler
db 'movnti',0C3h
dw movnti_instruction-instruction_handler
db 'movntq',0E7h
dw movntq_instruction-instruction_handler
db 'movsxd',63h
dw movsxd_instruction-instruction_handler
db 'movupd',10h
dw movpd_instruction-instruction_handler
db 'movups',10h
dw movps_instruction-instruction_handler
db 'mwaitx',0FBh
dw monitor_instruction-instruction_handler
db 'paddsb',0ECh
dw basic_mmx_instruction-instruction_handler
db 'paddsw',0EDh
dw basic_mmx_instruction-instruction_handler
db 'pextrb',14h
dw pextrb_instruction-instruction_handler
db 'pextrd',16h
dw pextrd_instruction-instruction_handler
db 'pextrq',16h
dw pextrq_instruction-instruction_handler
db 'pextrw',15h
dw pextrw_instruction-instruction_handler
db 'pfnacc',8Ah
dw amd3dnow_instruction-instruction_handler
db 'pfsubr',0AAh
dw amd3dnow_instruction-instruction_handler
db 'phaddd',2
dw ssse3_instruction-instruction_handler
db 'phaddw',1
dw ssse3_instruction-instruction_handler
db 'phsubd',6
dw ssse3_instruction-instruction_handler
db 'phsubw',5
dw ssse3_instruction-instruction_handler
db 'pinsrb',20h
dw pinsrb_instruction-instruction_handler
db 'pinsrd',22h
dw pinsrd_instruction-instruction_handler
db 'pinsrq',22h
dw pinsrq_instruction-instruction_handler
db 'pinsrw',0C4h
dw pinsrw_instruction-instruction_handler
db 'pmaxsb',3Ch
dw sse4_instruction_66_38-instruction_handler
db 'pmaxsd',3Dh
dw sse4_instruction_66_38-instruction_handler
db 'pmaxsw',0EEh
dw basic_mmx_instruction-instruction_handler
db 'pmaxub',0DEh
dw basic_mmx_instruction-instruction_handler
db 'pmaxud',3Fh
dw sse4_instruction_66_38-instruction_handler
db 'pmaxuw',3Eh
dw sse4_instruction_66_38-instruction_handler
db 'pminsb',38h
dw sse4_instruction_66_38-instruction_handler
db 'pminsd',39h
dw sse4_instruction_66_38-instruction_handler
db 'pminsw',0EAh
dw basic_mmx_instruction-instruction_handler
db 'pminub',0DAh
dw basic_mmx_instruction-instruction_handler
db 'pminud',3Bh
dw sse4_instruction_66_38-instruction_handler
db 'pminuw',3Ah
dw sse4_instruction_66_38-instruction_handler
db 'pmuldq',28h
dw sse4_instruction_66_38-instruction_handler
db 'pmulhw',0E5h
dw basic_mmx_instruction-instruction_handler
db 'pmulld',40h
dw sse4_instruction_66_38-instruction_handler
db 'pmullw',0D5h
dw basic_mmx_instruction-instruction_handler
db 'popcnt',0B8h
dw popcnt_instruction-instruction_handler
db 'psadbw',0F6h
dw basic_mmx_instruction-instruction_handler
db 'pshufb',0
dw ssse3_instruction-instruction_handler
db 'pshufd',66h
dw pshufd_instruction-instruction_handler
db 'pshufw',0
dw pshufw_instruction-instruction_handler
db 'psignb',8
dw ssse3_instruction-instruction_handler
db 'psignd',0Ah
dw ssse3_instruction-instruction_handler
db 'psignw',9
dw ssse3_instruction-instruction_handler
db 'pslldq',111b
dw pslldq_instruction-instruction_handler
db 'psrldq',011b
dw pslldq_instruction-instruction_handler
db 'psubsb',0E8h
dw basic_mmx_instruction-instruction_handler
db 'psubsw',0E9h
dw basic_mmx_instruction-instruction_handler
db 'pswapd',0BBh
dw amd3dnow_instruction-instruction_handler
db 'public',0
dw public_directive-instruction_handler
db 'pushad',60h
dw simple_instruction_32bit_except64-instruction_handler
db 'pushaw',60h
dw simple_instruction_16bit_except64-instruction_handler
db 'pushfd',9Ch
dw simple_instruction_32bit_except64-instruction_handler
db 'pushfq',9Ch
dw simple_instruction_only64-instruction_handler
db 'pushfw',9Ch
dw simple_instruction_16bit-instruction_handler
db 'rdmsrq',32h
dw simple_extended_instruction_64bit-instruction_handler
db 'rdpkru',0EEh
dw simple_instruction_0f_01-instruction_handler
db 'rdrand',110b
dw rdrand_instruction-instruction_handler
db 'rdseed',111b
dw rdrand_instruction-instruction_handler
db 'rdsspd',1
dw rdsspd_instruction-instruction_handler
db 'rdsspq',1
dw rdsspq_instruction-instruction_handler
db 'rdtscp',0F9h
dw simple_instruction_0f_01-instruction_handler
db 'repeat',0
dw repeat_directive-instruction_handler
db 'setalc',0D6h
dw simple_instruction_except64-instruction_handler
db 'setnae',92h
dw set_instruction-instruction_handler
db 'setnbe',97h
dw set_instruction-instruction_handler
db 'setnge',9Ch
dw set_instruction-instruction_handler
db 'setnle',9Fh
dw set_instruction-instruction_handler
db 'sfence',0F8h
dw fence_instruction-instruction_handler
db 'shufpd',0C6h
dw sse_pd_instruction_imm8-instruction_handler
db 'shufps',0C6h
dw sse_ps_instruction_imm8-instruction_handler
db 'skinit',0
dw skinit_instruction-instruction_handler
db 'slwpcb',1
dw llwpcb_instruction-instruction_handler
db 'sqrtpd',51h
dw sse_pd_instruction-instruction_handler
db 'sqrtps',51h
dw sse_ps_instruction-instruction_handler
db 'sqrtsd',51h
dw sse_sd_instruction-instruction_handler
db 'sqrtss',51h
dw sse_ss_instruction-instruction_handler
db 'swapgs',0F8h
dw swapgs_instruction-instruction_handler
db 'sysret',07h
dw simple_extended_instruction-instruction_handler
db 't1mskc',17h
dw tbm_instruction-instruction_handler
db 'tpause',66h
dw tpause_instruction-instruction_handler
db 'umwait',0F2h
dw tpause_instruction-instruction_handler
db 'vaddpd',58h
dw avx_pd_instruction_er-instruction_handler
db 'vaddps',58h
dw avx_ps_instruction_er-instruction_handler
db 'vaddsd',58h
dw avx_sd_instruction_er-instruction_handler
db 'vaddss',58h
dw avx_ss_instruction_er-instruction_handler
db 'vandpd',54h
dw avx_pd_instruction-instruction_handler
db 'vandps',54h
dw avx_ps_instruction-instruction_handler
db 'vcmppd',-1
dw avx_cmp_pd_instruction-instruction_handler
db 'vcmpps',-1
dw avx_cmp_ps_instruction-instruction_handler
db 'vcmpsd',-1
dw avx_cmp_sd_instruction-instruction_handler
db 'vcmpss',-1
dw avx_cmp_ss_instruction-instruction_handler
db 'vdivpd',5Eh
dw avx_pd_instruction_er-instruction_handler
db 'vdivps',5Eh
dw avx_ps_instruction_er-instruction_handler
db 'vdivsd',5Eh
dw avx_sd_instruction_er-instruction_handler
db 'vdivss',5Eh
dw avx_ss_instruction_er-instruction_handler
db 'vlddqu',0F0h
dw avx_lddqu_instruction-instruction_handler
db 'vmaxpd',5Fh
dw avx_pd_instruction_sae-instruction_handler
db 'vmaxps',5Fh
dw avx_ps_instruction_sae-instruction_handler
db 'vmaxsd',5Fh
dw avx_sd_instruction_sae-instruction_handler
db 'vmaxss',5Fh
dw avx_ss_instruction_sae-instruction_handler
db 'vmcall',0C1h
dw simple_instruction_0f_01-instruction_handler
db 'vmfunc',0D4h
dw simple_instruction_0f_01-instruction_handler
db 'vminpd',5Dh
dw avx_pd_instruction_sae-instruction_handler
db 'vminps',5Dh
dw avx_ps_instruction_sae-instruction_handler
db 'vminsd',5Dh
dw avx_sd_instruction_sae-instruction_handler
db 'vminss',5Dh
dw avx_ss_instruction_sae-instruction_handler
db 'vmload',0DAh
dw simple_svm_instruction-instruction_handler
db 'vmovsd',0
dw avx_movsd_instruction-instruction_handler
db 'vmovss',0
dw avx_movss_instruction-instruction_handler
db 'vmread',0
dw vmread_instruction-instruction_handler
db 'vmsave',0DBh
dw simple_svm_instruction-instruction_handler
db 'vmulpd',59h
dw avx_pd_instruction_er-instruction_handler
db 'vmulps',59h
dw avx_ps_instruction_er-instruction_handler
db 'vmulsd',59h
dw avx_sd_instruction_er-instruction_handler
db 'vmulss',59h
dw avx_ss_instruction_er-instruction_handler
db 'vmxoff',0C4h
dw simple_instruction_0f_01-instruction_handler
db 'vpabsb',1Ch
dw avx_single_source_bw_instruction_38-instruction_handler
db 'vpabsd',1Eh
dw avx_single_source_d_instruction_38-instruction_handler
db 'vpabsq',1Fh
dw avx_single_source_q_instruction_38_evex-instruction_handler
db 'vpabsw',1Dh
dw avx_single_source_bw_instruction_38-instruction_handler
db 'vpaddb',0FCh
dw avx_bw_instruction-instruction_handler
db 'vpaddd',0FEh
dw avx_d_instruction-instruction_handler
db 'vpaddq',0D4h
dw avx_q_instruction-instruction_handler
db 'vpaddw',0FDh
dw avx_bw_instruction-instruction_handler
db 'vpandd',0DBh
dw avx_d_instruction_evex-instruction_handler
db 'vpandn',0DFh
dw avx_pd_instruction_noevex-instruction_handler
db 'vpandq',0DBh
dw avx_q_instruction_evex-instruction_handler
db 'vpavgb',0E0h
dw avx_bw_instruction-instruction_handler
db 'vpavgw',0E3h
dw avx_bw_instruction-instruction_handler
db 'vpcmov',0A2h
dw vpcmov_instruction-instruction_handler
db 'vpcmpb',-1
dw avx512_cmp_b_instruction-instruction_handler
db 'vpcmpd',-1
dw avx512_cmp_d_instruction-instruction_handler
db 'vpcmpq',-1
dw avx512_cmp_q_instruction-instruction_handler
db 'vpcmpw',-1
dw avx512_cmp_w_instruction-instruction_handler
db 'vpcomb',-1
dw xop_pcom_b_instruction-instruction_handler
db 'vpcomd',-1
dw xop_pcom_d_instruction-instruction_handler
db 'vpcomq',-1
dw xop_pcom_q_instruction-instruction_handler
db 'vpcomw',-1
dw xop_pcom_w_instruction-instruction_handler
db 'vpermb',8Dh
dw avx_bw_instruction_38_evex-instruction_handler
db 'vpermd',36h
dw avx_permd_instruction-instruction_handler
db 'vpermq',0
dw avx_permq_instruction-instruction_handler
db 'vpermw',8Dh
dw avx_bw_instruction_38_w1_evex-instruction_handler
db 'vpperm',0A3h
dw xop_128bit_instruction-instruction_handler
db 'vprold',1
dw avx512_rotate_d_instruction-instruction_handler
db 'vprolq',1
dw avx512_rotate_q_instruction-instruction_handler
db 'vprord',0
dw avx512_rotate_d_instruction-instruction_handler
db 'vprorq',0
dw avx512_rotate_q_instruction-instruction_handler
db 'vprotb',90h
dw xop_shift_instruction-instruction_handler
db 'vprotd',92h
dw xop_shift_instruction-instruction_handler
db 'vprotq',93h
dw xop_shift_instruction-instruction_handler
db 'vprotw',91h
dw xop_shift_instruction-instruction_handler
db 'vpshab',98h
dw xop_shift_instruction-instruction_handler
db 'vpshad',9Ah
dw xop_shift_instruction-instruction_handler
db 'vpshaq',9Bh
dw xop_shift_instruction-instruction_handler
db 'vpshaw',99h
dw xop_shift_instruction-instruction_handler
db 'vpshlb',94h
dw xop_shift_instruction-instruction_handler
db 'vpshld',96h
dw xop_shift_instruction-instruction_handler
db 'vpshlq',97h
dw xop_shift_instruction-instruction_handler
db 'vpshlw',95h
dw xop_shift_instruction-instruction_handler
db 'vpslld',0F2h
dw avx_shift_d_instruction-instruction_handler
db 'vpsllq',0F3h
dw avx_shift_q_instruction-instruction_handler
db 'vpsllw',0F1h
dw avx_shift_bw_instruction-instruction_handler
db 'vpsrad',0E2h
dw avx_shift_d_instruction-instruction_handler
db 'vpsraq',0E2h
dw avx_shift_q_instruction_evex-instruction_handler
db 'vpsraw',0E1h
dw avx_shift_bw_instruction-instruction_handler
db 'vpsrld',0D2h
dw avx_shift_d_instruction-instruction_handler
db 'vpsrlq',0D3h
dw avx_shift_q_instruction-instruction_handler
db 'vpsrlw',0D1h
dw avx_shift_bw_instruction-instruction_handler
db 'vpsubb',0F8h
dw avx_bw_instruction-instruction_handler
db 'vpsubd',0FAh
dw avx_d_instruction-instruction_handler
db 'vpsubq',0FBh
dw avx_q_instruction-instruction_handler
db 'vpsubw',0F9h
dw avx_bw_instruction-instruction_handler
db 'vptest',17h
dw avx_single_source_instruction_38_noevex-instruction_handler
db 'vpxord',0EFh
dw avx_d_instruction_evex-instruction_handler
db 'vpxorq',0EFh
dw avx_q_instruction_evex-instruction_handler
db 'vrcpps',53h
dw avx_single_source_ps_instruction_noevex-instruction_handler
db 'vrcpss',53h
dw avx_ss_instruction_noevex-instruction_handler
db 'vsubpd',5Ch
dw avx_pd_instruction_er-instruction_handler
db 'vsubps',5Ch
dw avx_ps_instruction_er-instruction_handler
db 'vsubsd',5Ch
dw avx_sd_instruction_er-instruction_handler
db 'vsubss',5Ch
dw avx_ss_instruction_er-instruction_handler
db 'vxorpd',57h
dw avx_pd_instruction-instruction_handler
db 'vxorps',57h
dw avx_ps_instruction-instruction_handler
db 'wbinvd',9
dw simple_extended_instruction-instruction_handler
db 'wrmsrq',30h
dw simple_extended_instruction_64bit-instruction_handler
db 'wrpkru',0EFh
dw simple_instruction_0f_01-instruction_handler
db 'wrussd',0F5h
dw wrussd_instruction-instruction_handler
db 'wrussq',0F5h
dw wrussq_instruction-instruction_handler
db 'xabort',0
dw xabort_instruction-instruction_handler
db 'xbegin',0
dw xbegin_instruction-instruction_handler
db 'xgetbv',0D0h
dw simple_instruction_0f_01-instruction_handler
db 'xrstor',101b
dw fxsave_instruction-instruction_handler
db 'xsavec',4
dw xsaves_instruction-instruction_handler
db 'xsaves',5
dw xsaves_instruction-instruction_handler
db 'xsetbv',0D1h
dw simple_instruction_0f_01-instruction_handler
instructions_7:
db 'blcfill',11h
dw tbm_instruction-instruction_handler
db 'blendpd',0Dh
dw sse4_instruction_66_3a_imm8-instruction_handler
db 'blendps',0Ch
dw sse4_instruction_66_3a_imm8-instruction_handler
db 'blsfill',12h
dw tbm_instruction-instruction_handler
db 'clflush',111b
dw clflush_instruction-instruction_handler
db 'cmovnae',42h
dw bs_instruction-instruction_handler
db 'cmovnbe',47h
dw bs_instruction-instruction_handler
db 'cmovnge',4Ch
dw bs_instruction-instruction_handler
db 'cmovnle',4Fh
dw bs_instruction-instruction_handler
db 'cmpeqpd',0
dw cmp_pd_instruction-instruction_handler
db 'cmpeqps',0
dw cmp_ps_instruction-instruction_handler
db 'cmpeqsd',0
dw cmp_sd_instruction-instruction_handler
db 'cmpeqss',0
dw cmp_ss_instruction-instruction_handler
db 'cmplepd',2
dw cmp_pd_instruction-instruction_handler
db 'cmpleps',2
dw cmp_ps_instruction-instruction_handler
db 'cmplesd',2
dw cmp_sd_instruction-instruction_handler
db 'cmpless',2
dw cmp_ss_instruction-instruction_handler
db 'cmpltpd',1
dw cmp_pd_instruction-instruction_handler
db 'cmpltps',1
dw cmp_ps_instruction-instruction_handler
db 'cmpltsd',1
dw cmp_sd_instruction-instruction_handler
db 'cmpltss',1
dw cmp_ss_instruction-instruction_handler
db 'cmpxchg',0B0h
dw basic_486_instruction-instruction_handler
db 'display',0
dw display_directive-instruction_handler
db 'endbr32',0FBh
dw endbr_instruction-instruction_handler
db 'endbr64',0FAh
dw endbr_instruction-instruction_handler
db 'fcmovbe',0D0h
dw fcmov_instruction-instruction_handler
db 'fcmovnb',0C0h
dw fcomi_instruction-instruction_handler
db 'fcmovne',0C8h
dw fcomi_instruction-instruction_handler
db 'fcmovnu',0D8h
dw fcomi_instruction-instruction_handler
db 'fdecstp',110110b
dw simple_fpu_instruction-instruction_handler
db 'fincstp',110111b
dw simple_fpu_instruction-instruction_handler
db 'fldenvd',4
dw fldenv_instruction_32bit-instruction_handler
db 'fldenvw',4
dw fldenv_instruction_16bit-instruction_handler
db 'fnsaved',6
dw fnsave_instruction_32bit-instruction_handler
db 'fnsavew',6
dw fnsave_instruction_16bit-instruction_handler
db 'fnstenv',6
dw fldenv_instruction-instruction_handler
db 'frndint',111100b
dw simple_fpu_instruction-instruction_handler
db 'frstord',4
dw fnsave_instruction_32bit-instruction_handler
db 'frstorw',4
dw fnsave_instruction_16bit-instruction_handler
db 'fsincos',111011b
dw simple_fpu_instruction-instruction_handler
db 'fstenvd',6
dw fstenv_instruction_32bit-instruction_handler
db 'fstenvw',6
dw fstenv_instruction_16bit-instruction_handler
db 'fucomip',0E8h
dw fcomip_instruction-instruction_handler
db 'fucompp',0
dw fucompp_instruction-instruction_handler
db 'fxrstor',1
dw fxsave_instruction-instruction_handler
db 'fxtract',110100b
dw simple_fpu_instruction-instruction_handler
db 'fyl2xp1',111001b
dw simple_fpu_instruction-instruction_handler
db 'incsspd',5
dw incsspd_instruction-instruction_handler
db 'incsspq',5
dw incsspq_instruction-instruction_handler
db 'insertq',0
dw insertq_instruction-instruction_handler
db 'invlpga',0DFh
dw invlpga_instruction-instruction_handler
db 'invpcid',82h
dw vmx_inv_instruction-instruction_handler
db 'invvpid',81h
dw vmx_inv_instruction-instruction_handler
db 'ldmxcsr',10b
dw stmxcsr_instruction-instruction_handler
db 'loopned',0E0h
dw loop_instruction_32bit-instruction_handler
db 'loopneq',0E0h
dw loop_instruction_64bit-instruction_handler
db 'loopnew',0E0h
dw loop_instruction_16bit-instruction_handler
db 'loopnzd',0E0h
dw loop_instruction_32bit-instruction_handler
db 'loopnzq',0E0h
dw loop_instruction_64bit-instruction_handler
db 'loopnzw',0E0h
dw loop_instruction_16bit-instruction_handler
db 'mcommit',0FAh
dw mcommit_instruction-instruction_handler
db 'monitor',0C8h
dw monitor_instruction-instruction_handler
db 'movddup',12h
dw sse_sd_instruction-instruction_handler
db 'movdiri',0F9h
dw movdiri_instruction-instruction_handler
db 'movdq2q',0
dw movdq2q_instruction-instruction_handler
db 'movhlps',12h
dw movhlps_instruction-instruction_handler
db 'movlhps',16h
dw movhlps_instruction-instruction_handler
db 'movntdq',0E7h
dw movntpd_instruction-instruction_handler
db 'movntpd',2Bh
dw movntpd_instruction-instruction_handler
db 'movntps',2Bh
dw movntps_instruction-instruction_handler
db 'movntsd',2Bh
dw movntsd_instruction-instruction_handler
db 'movntss',2Bh
dw movntss_instruction-instruction_handler
db 'movq2dq',0
dw movq2dq_instruction-instruction_handler
db 'mpsadbw',42h
dw sse4_instruction_66_3a_imm8-instruction_handler
db 'paddusb',0DCh
dw basic_mmx_instruction-instruction_handler
db 'paddusw',0DDh
dw basic_mmx_instruction-instruction_handler
db 'palignr',0
dw palignr_instruction-instruction_handler
db 'pavgusb',0BFh
dw amd3dnow_instruction-instruction_handler
db 'pblendw',0Eh
dw sse4_instruction_66_3a_imm8-instruction_handler
db 'pcmpeqb',74h
dw basic_mmx_instruction-instruction_handler
db 'pcmpeqd',76h
dw basic_mmx_instruction-instruction_handler
db 'pcmpeqq',29h
dw sse4_instruction_66_38-instruction_handler
db 'pcmpeqw',75h
dw basic_mmx_instruction-instruction_handler
db 'pcmpgtb',64h
dw basic_mmx_instruction-instruction_handler
db 'pcmpgtd',66h
dw basic_mmx_instruction-instruction_handler
db 'pcmpgtq',37h
dw sse4_instruction_66_38-instruction_handler
db 'pcmpgtw',65h
dw basic_mmx_instruction-instruction_handler
db 'pcommit',0F8h
dw pcommit_instruction-instruction_handler
db 'pconfig',0C5h
dw pconfig_instruction-instruction_handler
db 'pfcmpeq',0B0h
dw amd3dnow_instruction-instruction_handler
db 'pfcmpge',90h
dw amd3dnow_instruction-instruction_handler
db 'pfcmpgt',0A0h
dw amd3dnow_instruction-instruction_handler
db 'pfpnacc',8Eh
dw amd3dnow_instruction-instruction_handler
db 'pfrsqrt',97h
dw amd3dnow_instruction-instruction_handler
db 'phaddsw',3
dw ssse3_instruction-instruction_handler
db 'phsubsw',7
dw ssse3_instruction-instruction_handler
db 'pmaddwd',0F5h
dw basic_mmx_instruction-instruction_handler
db 'pmulhrw',0B7h
dw amd3dnow_instruction-instruction_handler
db 'pmulhuw',0E4h
dw basic_mmx_instruction-instruction_handler
db 'pmuludq',0F4h
dw basic_mmx_instruction-instruction_handler
db 'pshufhw',0F3h
dw pshufd_instruction-instruction_handler
db 'pshuflw',0F2h
dw pshufd_instruction-instruction_handler
db 'psubusb',0D8h
dw basic_mmx_instruction-instruction_handler
db 'psubusw',0D9h
dw basic_mmx_instruction-instruction_handler
db 'ptwrite',4
dw ptwrite_instruction-instruction_handler
db 'roundpd',9
dw sse4_instruction_66_3a_imm8-instruction_handler
db 'roundps',8
dw sse4_instruction_66_3a_imm8-instruction_handler
db 'roundsd',0Bh
dw sse4_sd_instruction_66_3a_imm8-instruction_handler
db 'roundss',0Ah
dw sse4_ss_instruction_66_3a_imm8-instruction_handler
db 'rsqrtps',52h
dw sse_ps_instruction-instruction_handler
db 'rsqrtss',52h
dw sse_ss_instruction-instruction_handler
db 'section',0
dw section_directive-instruction_handler
db 'segment',0
dw segment_directive-instruction_handler
db 'stmxcsr',11b
dw stmxcsr_instruction-instruction_handler
db 'syscall',05h
dw simple_extended_instruction-instruction_handler
db 'sysexit',35h
dw simple_extended_instruction-instruction_handler
db 'sysretq',07h
dw simple_extended_instruction_64bit-instruction_handler
db 'ucomisd',2Eh
dw comisd_instruction-instruction_handler
db 'ucomiss',2Eh
dw comiss_instruction-instruction_handler
db 'vaesdec',0DEh
dw avx_instruction_38_nomask-instruction_handler
db 'vaesenc',0DCh
dw avx_instruction_38_nomask-instruction_handler
db 'vaesimc',0DBh
dw avx_single_source_128bit_instruction_38_noevex-instruction_handler
db 'valignd',3
dw avx_d_instruction_3a_imm8_evex-instruction_handler
db 'valignq',3
dw avx_q_instruction_3a_imm8_evex-instruction_handler
db 'vandnpd',55h
dw avx_pd_instruction-instruction_handler
db 'vandnps',55h
dw avx_ps_instruction-instruction_handler
db 'vcomisd',2Fh
dw avx_comisd_instruction-instruction_handler
db 'vcomiss',2Fh
dw avx_comiss_instruction-instruction_handler
db 'vexp2pd',0C8h
dw avx512_exp2pd_instruction-instruction_handler
db 'vexp2ps',0C8h
dw avx512_exp2ps_instruction-instruction_handler
db 'vfrczpd',81h
dw xop_single_source_instruction-instruction_handler
db 'vfrczps',80h
dw xop_single_source_instruction-instruction_handler
db 'vfrczsd',83h
dw xop_single_source_sd_instruction-instruction_handler
db 'vfrczss',82h
dw xop_single_source_ss_instruction-instruction_handler
db 'vhaddpd',07Ch
dw avx_pd_instruction_noevex-instruction_handler
db 'vhaddps',07Ch
dw avx_ps_instruction_noevex-instruction_handler
db 'vhsubpd',07Dh
dw avx_pd_instruction_noevex-instruction_handler
db 'vhsubps',07Dh
dw avx_ps_instruction_noevex-instruction_handler
db 'virtual',0
dw virtual_directive-instruction_handler
db 'vmclear',6
dw vmclear_instruction-instruction_handler
db 'vmmcall',0D9h
dw simple_instruction_0f_01-instruction_handler
db 'vmovapd',28h
dw avx_movpd_instruction-instruction_handler
db 'vmovaps',28h
dw avx_movps_instruction-instruction_handler
db 'vmovdqa',6Fh
dw avx_movdqa_instruction-instruction_handler
db 'vmovdqu',6Fh
dw avx_movdqu_instruction-instruction_handler
db 'vmovhpd',16h
dw avx_movlpd_instruction-instruction_handler
db 'vmovhps',16h
dw avx_movlps_instruction-instruction_handler
db 'vmovlpd',12h
dw avx_movlpd_instruction-instruction_handler
db 'vmovlps',12h
dw avx_movlps_instruction-instruction_handler
db 'vmovupd',10h
dw avx_movpd_instruction-instruction_handler
db 'vmovups',10h
dw avx_movps_instruction-instruction_handler
db 'vmptrld',6
dw vmx_instruction-instruction_handler
db 'vmptrst',7
dw vmx_instruction-instruction_handler
db 'vmwrite',0
dw vmwrite_instruction-instruction_handler
db 'vpaddsb',0ECh
dw avx_bw_instruction-instruction_handler
db 'vpaddsw',0EDh
dw avx_bw_instruction-instruction_handler
db 'vpandnd',0DFh
dw avx_d_instruction_evex-instruction_handler
db 'vpandnq',0DFh
dw avx_q_instruction_evex-instruction_handler
db 'vpcmpub',-1
dw avx512_cmp_ub_instruction-instruction_handler
db 'vpcmpud',-1
dw avx512_cmp_ud_instruction-instruction_handler
db 'vpcmpuq',-1
dw avx512_cmp_uq_instruction-instruction_handler
db 'vpcmpuw',-1
dw avx512_cmp_uw_instruction-instruction_handler
db 'vpcomub',-1
dw xop_pcom_ub_instruction-instruction_handler
db 'vpcomud',-1
dw xop_pcom_ud_instruction-instruction_handler
db 'vpcomuq',-1
dw xop_pcom_uq_instruction-instruction_handler
db 'vpcomuw',-1
dw xop_pcom_uw_instruction-instruction_handler
db 'vpermpd',1
dw avx_permq_instruction-instruction_handler
db 'vpermps',16h
dw avx_permd_instruction-instruction_handler
db 'vpextrb',14h
dw avx_extract_b_instruction-instruction_handler
db 'vpextrd',16h
dw avx_extract_d_instruction-instruction_handler
db 'vpextrq',16h
dw avx_extract_q_instruction-instruction_handler
db 'vpextrw',15h
dw avx_extract_w_instruction-instruction_handler
db 'vphaddd',2
dw avx_pi_instruction_38_noevex-instruction_handler
db 'vphaddw',1
dw avx_pi_instruction_38_noevex-instruction_handler
db 'vphsubd',6
dw avx_pi_instruction_38_noevex-instruction_handler
db 'vphsubw',5
dw avx_pi_instruction_38_noevex-instruction_handler
db 'vpinsrb',20h
dw avx_pinsrb_instruction-instruction_handler
db 'vpinsrd',22h
dw avx_pinsrd_instruction-instruction_handler
db 'vpinsrq',22h
dw avx_pinsrq_instruction-instruction_handler
db 'vpinsrw',0C4h
dw avx_pinsrw_instruction-instruction_handler
db 'vpmaxsb',3Ch
dw avx_bw_instruction_38-instruction_handler
db 'vpmaxsd',3Dh
dw avx_d_instruction_38-instruction_handler
db 'vpmaxsq',3Dh
dw avx_q_instruction_38_evex-instruction_handler
db 'vpmaxsw',0EEh
dw avx_bw_instruction-instruction_handler
db 'vpmaxub',0DEh
dw avx_bw_instruction-instruction_handler
db 'vpmaxud',3Fh
dw avx_d_instruction_38-instruction_handler
db 'vpmaxuq',3Fh
dw avx_q_instruction_38_evex-instruction_handler
db 'vpmaxuw',3Eh
dw avx_bw_instruction_38-instruction_handler
db 'vpminsb',38h
dw avx_bw_instruction_38-instruction_handler
db 'vpminsd',39h
dw avx_d_instruction_38-instruction_handler
db 'vpminsq',39h
dw avx_q_instruction_38_evex-instruction_handler
db 'vpminsw',0EAh
dw avx_bw_instruction-instruction_handler
db 'vpminub',0DAh
dw avx_bw_instruction-instruction_handler
db 'vpminud',3Bh
dw avx_d_instruction_38-instruction_handler
db 'vpminuq',3Bh
dw avx_q_instruction_38_evex-instruction_handler
db 'vpminuw',3Ah
dw avx_bw_instruction_38-instruction_handler
db 'vpmovdb',31h
dw avx512_pmovdb_instruction-instruction_handler
db 'vpmovdw',33h
dw avx512_pmovwb_instruction-instruction_handler
db 'vpmovqb',32h
dw avx512_pmovqb_instruction-instruction_handler
db 'vpmovqd',35h
dw avx512_pmovwb_instruction-instruction_handler
db 'vpmovqw',34h
dw avx512_pmovdb_instruction-instruction_handler
db 'vpmovwb',30h
dw avx512_pmovwb_instruction-instruction_handler
db 'vpmuldq',28h
dw avx_q_instruction_38-instruction_handler
db 'vpmulhw',0E5h
dw avx_bw_instruction-instruction_handler
db 'vpmulld',40h
dw avx_d_instruction_38-instruction_handler
db 'vpmullq',40h
dw avx_q_instruction_38_evex-instruction_handler
db 'vpmullw',0D5h
dw avx_bw_instruction-instruction_handler
db 'vprolvd',15h
dw avx_d_instruction_38_evex-instruction_handler
db 'vprolvq',15h
dw avx_q_instruction_38_evex-instruction_handler
db 'vprorvd',14h
dw avx_d_instruction_38_evex-instruction_handler
db 'vprorvq',14h
dw avx_q_instruction_38_evex-instruction_handler
db 'vpsadbw',0F6h
dw avx_bw_instruction-instruction_handler
db 'vpshldd',71h
dw avx_d_instruction_3a_imm8_evex-instruction_handler
db 'vpshldq',71h
dw avx_q_instruction_3a_imm8_evex-instruction_handler
db 'vpshldw',70h
dw avx_bw_instruction_3a_imm8_w1_evex-instruction_handler
db 'vpshrdd',73h
dw avx_d_instruction_3a_imm8_evex-instruction_handler
db 'vpshrdq',73h
dw avx_q_instruction_3a_imm8_evex-instruction_handler
db 'vpshrdw',72h
dw avx_bw_instruction_3a_imm8_w1_evex-instruction_handler
db 'vpshufb',0
dw avx_bw_instruction_38-instruction_handler
db 'vpshufd',70h
dw avx_single_source_d_instruction_imm8-instruction_handler
db 'vpsignb',8
dw avx_pi_instruction_38_noevex-instruction_handler
db 'vpsignd',0Ah
dw avx_pi_instruction_38_noevex-instruction_handler
db 'vpsignw',9
dw avx_pi_instruction_38_noevex-instruction_handler
db 'vpslldq',111b
dw avx_shift_dq_instruction-instruction_handler
db 'vpsllvd',47h
dw avx_d_instruction_38-instruction_handler
db 'vpsllvq',47h
dw avx_q_instruction_38_w1-instruction_handler
db 'vpsllvw',12h
dw avx_bw_instruction_38_w1_evex-instruction_handler
db 'vpsravd',46h
dw avx_d_instruction_38-instruction_handler
db 'vpsravq',46h
dw avx_q_instruction_38_w1_evex-instruction_handler
db 'vpsravw',11h
dw avx_bw_instruction_38_w1_evex-instruction_handler
db 'vpsrldq',011b
dw avx_shift_dq_instruction-instruction_handler
db 'vpsrlvd',45h
dw avx_d_instruction_38-instruction_handler
db 'vpsrlvq',45h
dw avx_q_instruction_38_w1-instruction_handler
db 'vpsrlvw',10h
dw avx_bw_instruction_38_w1_evex-instruction_handler
db 'vpsubsb',0E8h
dw avx_bw_instruction-instruction_handler
db 'vpsubsw',0E9h
dw avx_bw_instruction-instruction_handler
db 'vshufpd',0C6h
dw avx_pd_instruction_imm8-instruction_handler
db 'vshufps',0C6h
dw avx_ps_instruction_imm8-instruction_handler
db 'vsqrtpd',51h
dw avx_single_source_pd_instruction_er-instruction_handler
db 'vsqrtps',51h
dw avx_single_source_ps_instruction_er-instruction_handler
db 'vsqrtsd',51h
dw avx_sd_instruction_er-instruction_handler
db 'vsqrtss',51h
dw avx_ss_instruction_er-instruction_handler
db 'vtestpd',0Fh
dw avx_single_source_instruction_38_noevex-instruction_handler
db 'vtestps',0Eh
dw avx_single_source_instruction_38_noevex-instruction_handler
db 'xrstors',3
dw xsaves_instruction-instruction_handler
db 'xsave64',100b
dw fxsave_instruction_64bit-instruction_handler
instructions_8:
db 'addsubpd',0D0h
dw sse_pd_instruction-instruction_handler
db 'addsubps',0D0h
dw cvtpd2dq_instruction-instruction_handler
db 'blendvpd',15h
dw sse4_instruction_66_38_xmm0-instruction_handler
db 'blendvps',14h
dw sse4_instruction_66_38_xmm0-instruction_handler
db 'cldemote',0
dw cldemote_instruction-instruction_handler
db 'clrssbsy',6
dw clrssbsy_instruction-instruction_handler
db 'cmpneqpd',4
dw cmp_pd_instruction-instruction_handler
db 'cmpneqps',4
dw cmp_ps_instruction-instruction_handler
db 'cmpneqsd',4
dw cmp_sd_instruction-instruction_handler
db 'cmpneqss',4
dw cmp_ss_instruction-instruction_handler
db 'cmpnlepd',6
dw cmp_pd_instruction-instruction_handler
db 'cmpnleps',6
dw cmp_ps_instruction-instruction_handler
db 'cmpnlesd',6
dw cmp_sd_instruction-instruction_handler
db 'cmpnless',6
dw cmp_ss_instruction-instruction_handler
db 'cmpnltpd',5
dw cmp_pd_instruction-instruction_handler
db 'cmpnltps',5
dw cmp_ps_instruction-instruction_handler
db 'cmpnltsd',5
dw cmp_sd_instruction-instruction_handler
db 'cmpnltss',5
dw cmp_ss_instruction-instruction_handler
db 'cmpordpd',7
dw cmp_pd_instruction-instruction_handler
db 'cmpordps',7
dw cmp_ps_instruction-instruction_handler
db 'cmpordsd',7
dw cmp_sd_instruction-instruction_handler
db 'cmpordss',7
dw cmp_ss_instruction-instruction_handler
db 'cvtdq2pd',0E6h
dw cvtdq2pd_instruction-instruction_handler
db 'cvtdq2ps',5Bh
dw sse_ps_instruction-instruction_handler
db 'cvtpd2dq',0E6h
dw cvtpd2dq_instruction-instruction_handler
db 'cvtpd2pi',2Dh
dw cvtpd2pi_instruction-instruction_handler
db 'cvtpd2ps',5Ah
dw sse_pd_instruction-instruction_handler
db 'cvtpi2pd',2Ah
dw cvtpi2pd_instruction-instruction_handler
db 'cvtpi2ps',2Ah
dw cvtpi2ps_instruction-instruction_handler
db 'cvtps2dq',5Bh
dw sse_pd_instruction-instruction_handler
db 'cvtps2pd',5Ah
dw cvtps2pd_instruction-instruction_handler
db 'cvtps2pi',2Dh
dw cvtps2pi_instruction-instruction_handler
db 'cvtsd2si',2Dh
dw cvtsd2si_instruction-instruction_handler
db 'cvtsd2ss',5Ah
dw sse_sd_instruction-instruction_handler
db 'cvtsi2sd',2Ah
dw cvtsi2sd_instruction-instruction_handler
db 'cvtsi2ss',2Ah
dw cvtsi2ss_instruction-instruction_handler
db 'cvtss2sd',5Ah
dw sse_ss_instruction-instruction_handler
db 'cvtss2si',2Dh
dw cvtss2si_instruction-instruction_handler
db 'fcmovnbe',0D0h
dw fcomi_instruction-instruction_handler
db 'fnstenvd',6
dw fldenv_instruction_32bit-instruction_handler
db 'fnstenvw',6
dw fldenv_instruction_16bit-instruction_handler
db 'fxsave64',0
dw fxsave_instruction_64bit-instruction_handler
db 'insertps',21h
dw insertps_instruction-instruction_handler
db 'kortestb',98h
dw mask_instruction_single_source_b-instruction_handler
db 'kortestd',98h
dw mask_instruction_single_source_d-instruction_handler
db 'kortestq',98h
dw mask_instruction_single_source_q-instruction_handler
db 'kortestw',98h
dw mask_instruction_single_source_w-instruction_handler
db 'kshiftlb',32h
dw mask_shift_instruction_d-instruction_handler
db 'kshiftld',33h
dw mask_shift_instruction_d-instruction_handler
db 'kshiftlq',33h
dw mask_shift_instruction_q-instruction_handler
db 'kshiftlw',32h
dw mask_shift_instruction_q-instruction_handler
db 'kshiftrb',30h
dw mask_shift_instruction_d-instruction_handler
db 'kshiftrd',31h
dw mask_shift_instruction_d-instruction_handler
db 'kshiftrq',31h
dw mask_shift_instruction_q-instruction_handler
db 'kshiftrw',30h
dw mask_shift_instruction_q-instruction_handler
db 'kunpckbw',4Bh
dw mask_instruction_b-instruction_handler
db 'kunpckdq',4Bh
dw mask_instruction_q-instruction_handler
db 'kunpckwd',4Bh
dw mask_instruction_w-instruction_handler
db 'maskmovq',0
dw maskmovq_instruction-instruction_handler
db 'monitorx',0FAh
dw monitor_instruction-instruction_handler
db 'movmskpd',0
dw movmskpd_instruction-instruction_handler
db 'movmskps',0
dw movmskps_instruction-instruction_handler
db 'movntdqa',2Ah
dw movntdqa_instruction-instruction_handler
db 'movshdup',16h
dw movshdup_instruction-instruction_handler
db 'movsldup',12h
dw movshdup_instruction-instruction_handler
db 'packssdw',6Bh
dw basic_mmx_instruction-instruction_handler
db 'packsswb',63h
dw basic_mmx_instruction-instruction_handler
db 'packusdw',2Bh
dw sse4_instruction_66_38-instruction_handler
db 'packuswb',67h
dw basic_mmx_instruction-instruction_handler
db 'pblendvb',10h
dw sse4_instruction_66_38_xmm0-instruction_handler
db 'pfrcpit1',0A6h
dw amd3dnow_instruction-instruction_handler
db 'pfrcpit2',0B6h
dw amd3dnow_instruction-instruction_handler
db 'pfrsqit1',0A7h
dw amd3dnow_instruction-instruction_handler
db 'pmovmskb',0D7h
dw pmovmskb_instruction-instruction_handler
db 'pmovsxbd',21h
dw pmovsxbd_instruction-instruction_handler
db 'pmovsxbq',22h
dw pmovsxbq_instruction-instruction_handler
db 'pmovsxbw',20h
dw pmovsxbw_instruction-instruction_handler
db 'pmovsxdq',25h
dw pmovsxdq_instruction-instruction_handler
db 'pmovsxwd',23h
dw pmovsxwd_instruction-instruction_handler
db 'pmovsxwq',24h
dw pmovsxwq_instruction-instruction_handler
db 'pmovzxbd',31h
dw pmovsxbd_instruction-instruction_handler
db 'pmovzxbq',32h
dw pmovsxbq_instruction-instruction_handler
db 'pmovzxbw',30h
dw pmovsxbw_instruction-instruction_handler
db 'pmovzxdq',35h
dw pmovsxdq_instruction-instruction_handler
db 'pmovzxwd',33h
dw pmovsxwd_instruction-instruction_handler
db 'pmovzxwq',34h
dw pmovsxwq_instruction-instruction_handler
db 'pmulhrsw',0Bh
dw ssse3_instruction-instruction_handler
db 'prefetch',0
dw amd_prefetch_instruction-instruction_handler
db 'rdfsbase',0
dw rdfsbase_instruction-instruction_handler
db 'rdgsbase',1
dw rdfsbase_instruction-instruction_handler
db 'rstorssp',5
dw rstorssp_instruction-instruction_handler
db 'setssbsy',0E8h
dw setssbsy_instruction-instruction_handler
db 'sha1msg1',0C9h
dw sse4_instruction_38-instruction_handler
db 'sha1msg2',0CAh
dw sse4_instruction_38-instruction_handler
db 'sysenter',34h
dw simple_extended_instruction-instruction_handler
db 'sysexitq',35h
dw simple_extended_instruction_64bit-instruction_handler
db 'umonitor',0
dw umonitor_instruction-instruction_handler
db 'unpckhpd',15h
dw sse_pd_instruction-instruction_handler
db 'unpckhps',15h
dw sse_ps_instruction-instruction_handler
db 'unpcklpd',14h
dw sse_pd_instruction-instruction_handler
db 'unpcklps',14h
dw sse_ps_instruction-instruction_handler
db 'vblendpd',0Dh
dw avx_pi_instruction_3a_imm8_noevex-instruction_handler
db 'vblendps',0Ch
dw avx_pi_instruction_3a_imm8_noevex-instruction_handler
db 'vcmpeqpd',0
dw avx_cmp_pd_instruction-instruction_handler
db 'vcmpeqps',0
dw avx_cmp_ps_instruction-instruction_handler
db 'vcmpeqsd',0
dw avx_cmp_sd_instruction-instruction_handler
db 'vcmpeqss',0
dw avx_cmp_ss_instruction-instruction_handler
db 'vcmpgepd',0Dh
dw avx_cmp_pd_instruction-instruction_handler
db 'vcmpgeps',0Dh
dw avx_cmp_ps_instruction-instruction_handler
db 'vcmpgesd',0Dh
dw avx_cmp_sd_instruction-instruction_handler
db 'vcmpgess',0Dh
dw avx_cmp_ss_instruction-instruction_handler
db 'vcmpgtpd',0Eh
dw avx_cmp_pd_instruction-instruction_handler
db 'vcmpgtps',0Eh
dw avx_cmp_ps_instruction-instruction_handler
db 'vcmpgtsd',0Eh
dw avx_cmp_sd_instruction-instruction_handler
db 'vcmpgtss',0Eh
dw avx_cmp_ss_instruction-instruction_handler
db 'vcmplepd',2
dw avx_cmp_pd_instruction-instruction_handler
db 'vcmpleps',2
dw avx_cmp_ps_instruction-instruction_handler
db 'vcmplesd',2
dw avx_cmp_sd_instruction-instruction_handler
db 'vcmpless',2
dw avx_cmp_ss_instruction-instruction_handler
db 'vcmpltpd',1
dw avx_cmp_pd_instruction-instruction_handler
db 'vcmpltps',1
dw avx_cmp_ps_instruction-instruction_handler
db 'vcmpltsd',1
dw avx_cmp_sd_instruction-instruction_handler
db 'vcmpltss',1
dw avx_cmp_ss_instruction-instruction_handler
db 'vfmaddpd',69h
dw fma4_instruction_p-instruction_handler
db 'vfmaddps',68h
dw fma4_instruction_p-instruction_handler
db 'vfmaddsd',6Bh
dw fma4_instruction_sd-instruction_handler
db 'vfmaddss',6Ah
dw fma4_instruction_ss-instruction_handler
db 'vfmsubpd',6Dh
dw fma4_instruction_p-instruction_handler
db 'vfmsubps',6Ch
dw fma4_instruction_p-instruction_handler
db 'vfmsubsd',6Fh
dw fma4_instruction_sd-instruction_handler
db 'vfmsubss',6Eh
dw fma4_instruction_ss-instruction_handler
db 'vldmxcsr',10b
dw vldmxcsr_instruction-instruction_handler
db 'vmlaunch',0C2h
dw simple_instruction_0f_01-instruction_handler
db 'vmovddup',12h
dw avx_movddup_instruction-instruction_handler
db 'vmovdqu8',6Fh
dw avx512_movdqu8_instruction-instruction_handler
db 'vmovhlps',12h
dw avx_movhlps_instruction-instruction_handler
db 'vmovlhps',16h
dw avx_movhlps_instruction-instruction_handler
db 'vmovntdq',0E7h
dw avx_movntdq_instruction-instruction_handler
db 'vmovntpd',2Bh
dw avx_movntpd_instruction-instruction_handler
db 'vmovntps',2Bh
dw avx_movntps_instruction-instruction_handler
db 'vmpsadbw',42h
dw avx_pi_instruction_3a_imm8_noevex-instruction_handler
db 'vmresume',0C3h
dw simple_instruction_0f_01-instruction_handler
db 'vpaddusb',0DCh
dw avx_bw_instruction-instruction_handler
db 'vpaddusw',0DDh
dw avx_bw_instruction-instruction_handler
db 'vpalignr',0Fh
dw avx_pi_instruction_3a_imm8-instruction_handler
db 'vpblendd',2
dw avx_pi_instruction_3a_imm8_noevex-instruction_handler
db 'vpblendw',0Eh
dw avx_pi_instruction_3a_imm8_noevex-instruction_handler
db 'vpcmpeqb',74h
dw avx_cmpeqb_instruction-instruction_handler
db 'vpcmpeqd',76h
dw avx_cmpeqd_instruction-instruction_handler
db 'vpcmpeqq',29h
dw avx_cmpeqq_instruction-instruction_handler
db 'vpcmpeqw',75h
dw avx_cmpeqb_instruction-instruction_handler
db 'vpcmpgtb',64h
dw avx_cmpeqb_instruction-instruction_handler
db 'vpcmpgtd',66h
dw avx_cmpeqd_instruction-instruction_handler
db 'vpcmpgtq',37h
dw avx_cmpeqq_instruction-instruction_handler
db 'vpcmpgtw',65h
dw avx_cmpeqb_instruction-instruction_handler
db 'vpcmpleb',2
dw avx512_cmp_b_instruction-instruction_handler
db 'vpcmpled',2
dw avx512_cmp_d_instruction-instruction_handler
db 'vpcmpleq',2
dw avx512_cmp_q_instruction-instruction_handler
db 'vpcmplew',2
dw avx512_cmp_w_instruction-instruction_handler
db 'vpcmpltb',1
dw avx512_cmp_b_instruction-instruction_handler
db 'vpcmpltd',1
dw avx512_cmp_d_instruction-instruction_handler
db 'vpcmpltq',1
dw avx512_cmp_q_instruction-instruction_handler
db 'vpcmpltw',1
dw avx512_cmp_w_instruction-instruction_handler
db 'vpcomeqb',4
dw xop_pcom_b_instruction-instruction_handler
db 'vpcomeqd',4
dw xop_pcom_d_instruction-instruction_handler
db 'vpcomeqq',4
dw xop_pcom_q_instruction-instruction_handler
db 'vpcomeqw',4
dw xop_pcom_w_instruction-instruction_handler
db 'vpcomgeb',3
dw xop_pcom_b_instruction-instruction_handler
db 'vpcomged',3
dw xop_pcom_d_instruction-instruction_handler
db 'vpcomgeq',3
dw xop_pcom_q_instruction-instruction_handler
db 'vpcomgew',3
dw xop_pcom_w_instruction-instruction_handler
db 'vpcomgtb',2
dw xop_pcom_b_instruction-instruction_handler
db 'vpcomgtd',2
dw xop_pcom_d_instruction-instruction_handler
db 'vpcomgtq',2
dw xop_pcom_q_instruction-instruction_handler
db 'vpcomgtw',2
dw xop_pcom_w_instruction-instruction_handler
db 'vpcomleb',1
dw xop_pcom_b_instruction-instruction_handler
db 'vpcomled',1
dw xop_pcom_d_instruction-instruction_handler
db 'vpcomleq',1
dw xop_pcom_q_instruction-instruction_handler
db 'vpcomlew',1
dw xop_pcom_w_instruction-instruction_handler
db 'vpcomltb',0
dw xop_pcom_b_instruction-instruction_handler
db 'vpcomltd',0
dw xop_pcom_d_instruction-instruction_handler
db 'vpcomltq',0
dw xop_pcom_q_instruction-instruction_handler
db 'vpcomltw',0
dw xop_pcom_w_instruction-instruction_handler
db 'vpdpbusd',50h
dw avx_d_instruction_38_evex-instruction_handler
db 'vpdpwssd',52h
dw avx_d_instruction_38_evex-instruction_handler
db 'vpermi2b',75h
dw avx_bw_instruction_38_evex-instruction_handler
db 'vpermi2d',76h
dw avx_d_instruction_38_evex-instruction_handler
db 'vpermi2q',76h
dw avx_q_instruction_38_evex-instruction_handler
db 'vpermi2w',75h
dw avx_bw_instruction_38_w1_evex-instruction_handler
db 'vpermt2b',7Dh
dw avx_bw_instruction_38_evex-instruction_handler
db 'vpermt2d',7Eh
dw avx_d_instruction_38_evex-instruction_handler
db 'vpermt2q',7Eh
dw avx_q_instruction_38_evex-instruction_handler
db 'vpermt2w',7Dh
dw avx_bw_instruction_38_w1_evex-instruction_handler
db 'vphaddbd',0C2h
dw xop_single_source_128bit_instruction-instruction_handler
db 'vphaddbq',0C3h
dw xop_single_source_128bit_instruction-instruction_handler
db 'vphaddbw',0C1h
dw xop_single_source_128bit_instruction-instruction_handler
db 'vphadddq',0CBh
dw xop_single_source_128bit_instruction-instruction_handler
db 'vphaddsw',3
dw avx_pi_instruction_38_noevex-instruction_handler
db 'vphaddwd',0C6h
dw xop_single_source_128bit_instruction-instruction_handler
db 'vphaddwq',0C7h
dw xop_single_source_128bit_instruction-instruction_handler
db 'vphsubbw',0E1h
dw xop_single_source_128bit_instruction-instruction_handler
db 'vphsubdq',0E3h
dw xop_single_source_128bit_instruction-instruction_handler
db 'vphsubsw',7
dw avx_pi_instruction_38_noevex-instruction_handler
db 'vphsubwd',0E2h
dw xop_single_source_128bit_instruction-instruction_handler
db 'vplzcntd',44h
dw avx_single_source_d_instruction_38_evex-instruction_handler
db 'vplzcntq',44h
dw avx_single_source_q_instruction_38_evex-instruction_handler
db 'vpmacsdd',9Eh
dw xop_triple_source_128bit_instruction-instruction_handler
db 'vpmacswd',96h
dw xop_triple_source_128bit_instruction-instruction_handler
db 'vpmacsww',95h
dw xop_triple_source_128bit_instruction-instruction_handler
db 'vpmaddwd',0F5h
dw avx_bw_instruction-instruction_handler
db 'vpmovb2m',29h
dw avx512_pmov_2m_instruction-instruction_handler
db 'vpmovd2m',39h
dw avx512_pmov_2m_instruction-instruction_handler
db 'vpmovm2b',28h
dw avx512_pmov_m2_instruction-instruction_handler
db 'vpmovm2d',38h
dw avx512_pmov_m2_instruction-instruction_handler
db 'vpmovm2q',38h
dw avx512_pmov_m2_instruction_w1-instruction_handler
db 'vpmovm2w',28h
dw avx512_pmov_m2_instruction_w1-instruction_handler
db 'vpmovq2m',39h
dw avx512_pmov_2m_instruction_w1-instruction_handler
db 'vpmovsdb',21h
dw avx512_pmovdb_instruction-instruction_handler
db 'vpmovsdw',23h
dw avx512_pmovwb_instruction-instruction_handler
db 'vpmovsqb',22h
dw avx512_pmovqb_instruction-instruction_handler
db 'vpmovsqd',25h
dw avx512_pmovwb_instruction-instruction_handler
db 'vpmovsqw',24h
dw avx512_pmovdb_instruction-instruction_handler
db 'vpmovswb',20h
dw avx512_pmovwb_instruction-instruction_handler
db 'vpmovw2m',29h
dw avx512_pmov_2m_instruction_w1-instruction_handler
db 'vpmulhuw',0E4h
dw avx_bw_instruction-instruction_handler
db 'vpmuludq',0F4h
dw avx_q_instruction-instruction_handler
db 'vpopcntb',54h
dw avx_single_source_d_instruction_38_evex-instruction_handler
db 'vpopcntd',55h
dw avx512_single_source_ps_instruction-instruction_handler
db 'vpopcntq',55h
dw avx512_single_source_pd_instruction-instruction_handler
db 'vpopcntw',54h
dw avx_single_source_d_instruction_38_evex_w1-instruction_handler
db 'vpshldvd',71h
dw avx_d_instruction_38_evex-instruction_handler
db 'vpshldvq',71h
dw avx_q_instruction_38_evex-instruction_handler
db 'vpshldvw',70h
dw avx_bw_instruction_38_w1_evex-instruction_handler
db 'vpshrdvd',73h
dw avx_d_instruction_38_evex-instruction_handler
db 'vpshrdvq',73h
dw avx_q_instruction_38_evex-instruction_handler
db 'vpshrdvw',72
dw avx_bw_instruction_38_w1_evex-instruction_handler
db 'vpshufhw',0F3h
dw avx_pshuf_w_instruction-instruction_handler
db 'vpshuflw',0F2h
dw avx_pshuf_w_instruction-instruction_handler
db 'vpsubusb',0D8h
dw avx_bw_instruction-instruction_handler
db 'vpsubusw',0D9h
dw avx_bw_instruction-instruction_handler
db 'vptestmb',26h
dw avx512_ptestmb_instruction-instruction_handler
db 'vptestmd',27h
dw avx512_ptestmd_instruction-instruction_handler
db 'vptestmq',27h
dw avx512_ptestmq_instruction-instruction_handler
db 'vptestmw',26h
dw avx512_ptestmw_instruction-instruction_handler
db 'vrangepd',50h
dw avx512_pd_instruction_sae_imm8-instruction_handler
db 'vrangeps',50h
dw avx512_ps_instruction_sae_imm8-instruction_handler
db 'vrangesd',51h
dw avx512_sd_instruction_sae_imm8-instruction_handler
db 'vrangess',51h
dw avx512_ss_instruction_sae_imm8-instruction_handler
db 'vrcp14pd',4Ch
dw avx512_single_source_pd_instruction-instruction_handler
db 'vrcp14ps',4Ch
dw avx512_single_source_ps_instruction-instruction_handler
db 'vrcp14sd',4Dh
dw avx512_sd_instruction-instruction_handler
db 'vrcp14ss',4Dh
dw avx512_ss_instruction-instruction_handler
db 'vrcp28pd',0CAh
dw avx512_exp2pd_instruction-instruction_handler
db 'vrcp28ps',0CAh
dw avx512_exp2ps_instruction-instruction_handler
db 'vrcp28sd',0CBh
dw avx512_sd_instruction_sae-instruction_handler
db 'vrcp28ss',0CBh
dw avx512_ss_instruction_sae-instruction_handler
db 'vroundpd',9
dw avx_single_source_instruction_3a_imm8_noevex-instruction_handler
db 'vroundps',8
dw avx_single_source_instruction_3a_imm8_noevex-instruction_handler
db 'vroundsd',0Bh
dw avx_sd_instruction_3a_imm8_noevex-instruction_handler
db 'vroundss',0Ah
dw avx_ss_instruction_3a_imm8_noevex-instruction_handler
db 'vrsqrtps',52h
dw avx_single_source_ps_instruction_noevex-instruction_handler
db 'vrsqrtss',52h
dw avx_ss_instruction_noevex-instruction_handler
db 'vstmxcsr',11b
dw vldmxcsr_instruction-instruction_handler
db 'vucomisd',2Eh
dw avx_comisd_instruction-instruction_handler
db 'vucomiss',2Eh
dw avx_comiss_instruction-instruction_handler
db 'vzeroall',77h
dw vzeroall_instruction-instruction_handler
db 'wbnoinvd',9
dw simple_extended_instruction_f3-instruction_handler
db 'wrfsbase',2
dw rdfsbase_instruction-instruction_handler
db 'wrgsbase',3
dw rdfsbase_instruction-instruction_handler
db 'xacquire',0F2h
dw prefix_instruction-instruction_handler
db 'xrelease',0F3h
dw prefix_instruction-instruction_handler
db 'xrstor64',101b
dw fxsave_instruction_64bit-instruction_handler
db 'xsavec64',4
dw xsaves_instruction_64bit-instruction_handler
db 'xsaveopt',110b
dw fxsave_instruction-instruction_handler
db 'xsaves64',5
dw xsaves_instruction_64bit-instruction_handler
instructions_9:
db 'cmpxchg8b',8
dw cmpxchgx_instruction-instruction_handler
db 'cvttpd2dq',0E6h
dw sse_pd_instruction-instruction_handler
db 'cvttpd2pi',2Ch
dw cvtpd2pi_instruction-instruction_handler
db 'cvttps2dq',5Bh
dw movshdup_instruction-instruction_handler
db 'cvttps2pi',2Ch
dw cvtps2pi_instruction-instruction_handler
db 'cvttsd2si',2Ch
dw cvtsd2si_instruction-instruction_handler
db 'cvttss2si',2Ch
dw cvtss2si_instruction-instruction_handler
db 'extractps',17h
dw extractps_instruction-instruction_handler
db 'fxrstor64',1
dw fxsave_instruction_64bit-instruction_handler
db 'gf2p8mulb',0CFh
dw sse4_instruction_66_38-instruction_handler
db 'movdir64b',0F8h
dw movdir64b_instruction-instruction_handler
db 'pclmulqdq',-1
dw pclmulqdq_instruction-instruction_handler
db 'pcmpestri',61h
dw sse4_instruction_66_3a_imm8-instruction_handler
db 'pcmpestrm',60h
dw sse4_instruction_66_3a_imm8-instruction_handler
db 'pcmpistri',63h
dw sse4_instruction_66_3a_imm8-instruction_handler
db 'pcmpistrm',62h
dw sse4_instruction_66_3a_imm8-instruction_handler
db 'pmaddubsw',4
dw ssse3_instruction-instruction_handler
db 'prefetchw',1
dw amd_prefetch_instruction-instruction_handler
db 'punpckhbw',68h
dw basic_mmx_instruction-instruction_handler
db 'punpckhdq',6Ah
dw basic_mmx_instruction-instruction_handler
db 'punpckhwd',69h
dw basic_mmx_instruction-instruction_handler
db 'punpcklbw',60h
dw basic_mmx_instruction-instruction_handler
db 'punpckldq',62h
dw basic_mmx_instruction-instruction_handler
db 'punpcklwd',61h
dw basic_mmx_instruction-instruction_handler
db 'sha1nexte',0C8h
dw sse4_instruction_38-instruction_handler
db 'sha1rnds4',0CCh
dw sse4_instruction_3a_imm8-instruction_handler
db 'useavx256',0
dw set_evex_mode-instruction_handler
db 'useavx512',1
dw set_evex_mode-instruction_handler
db 'vaddsubpd',0D0h
dw avx_pd_instruction_noevex-instruction_handler
db 'vaddsubps',0D0h
dw avx_ps_instruction_noevex-instruction_handler
db 'vblendmpd',65h
dw avx_pd_instruction_38_evex-instruction_handler
db 'vblendmps',65h
dw avx_ps_instruction_66_38_evex-instruction_handler
db 'vblendvpd',4Bh
dw avx_triple_source_instruction_3a_noevex-instruction_handler
db 'vblendvps',4Ah
dw avx_triple_source_instruction_3a_noevex-instruction_handler
db 'vcmpneqpd',4
dw avx_cmp_pd_instruction-instruction_handler
db 'vcmpneqps',4
dw avx_cmp_ps_instruction-instruction_handler
db 'vcmpneqsd',4
dw avx_cmp_sd_instruction-instruction_handler
db 'vcmpneqss',4
dw avx_cmp_ss_instruction-instruction_handler
db 'vcmpngepd',9
dw avx_cmp_pd_instruction-instruction_handler
db 'vcmpngeps',9
dw avx_cmp_ps_instruction-instruction_handler
db 'vcmpngesd',9
dw avx_cmp_sd_instruction-instruction_handler
db 'vcmpngess',9
dw avx_cmp_ss_instruction-instruction_handler
db 'vcmpngtpd',0Ah
dw avx_cmp_pd_instruction-instruction_handler
db 'vcmpngtps',0Ah
dw avx_cmp_ps_instruction-instruction_handler
db 'vcmpngtsd',0Ah
dw avx_cmp_sd_instruction-instruction_handler
db 'vcmpngtss',0Ah
dw avx_cmp_ss_instruction-instruction_handler
db 'vcmpnlepd',6
dw avx_cmp_pd_instruction-instruction_handler
db 'vcmpnleps',6
dw avx_cmp_ps_instruction-instruction_handler
db 'vcmpnlesd',6
dw avx_cmp_sd_instruction-instruction_handler
db 'vcmpnless',6
dw avx_cmp_ss_instruction-instruction_handler
db 'vcmpnltpd',5
dw avx_cmp_pd_instruction-instruction_handler
db 'vcmpnltps',5
dw avx_cmp_ps_instruction-instruction_handler
db 'vcmpnltsd',5
dw avx_cmp_sd_instruction-instruction_handler
db 'vcmpnltss',5
dw avx_cmp_ss_instruction-instruction_handler
db 'vcmpordpd',7
dw avx_cmp_pd_instruction-instruction_handler
db 'vcmpordps',7
dw avx_cmp_ps_instruction-instruction_handler
db 'vcmpordsd',7
dw avx_cmp_sd_instruction-instruction_handler
db 'vcmpordss',7
dw avx_cmp_ss_instruction-instruction_handler
db 'vcvtdq2pd',0E6h
dw avx_cvtdq2pd_instruction-instruction_handler
db 'vcvtdq2ps',5Bh
dw avx_single_source_ps_instruction_er-instruction_handler
db 'vcvtpd2dq',0E6h
dw avx_cvtpd2dq_instruction-instruction_handler
db 'vcvtpd2ps',5Ah
dw avx_cvtpd2ps_instruction-instruction_handler
db 'vcvtpd2qq',7Bh
dw avx_single_source_pd_instruction_er_evex-instruction_handler
db 'vcvtph2ps',13h
dw avx_cvtph2ps_instruction-instruction_handler
db 'vcvtps2dq',5Bh
dw avx_cvtps2dq_instruction-instruction_handler
db 'vcvtps2pd',5Ah
dw avx_cvtps2pd_instruction-instruction_handler
db 'vcvtps2ph',1Dh
dw avx_cvtps2ph_instruction-instruction_handler
db 'vcvtps2qq',7Bh
dw avx_cvtps2qq_instruction-instruction_handler
db 'vcvtqq2pd',0E6h
dw avx_cvtqq2pd_instruction-instruction_handler
db 'vcvtqq2ps',5Bh
dw avx_cvtpd2udq_instruction-instruction_handler
db 'vcvtsd2si',2Dh
dw avx_cvtsd2si_instruction-instruction_handler
db 'vcvtsd2ss',5Ah
dw avx_sd_instruction_er-instruction_handler
db 'vcvtsi2sd',2Ah
dw avx_cvtsi2sd_instruction-instruction_handler
db 'vcvtsi2ss',2Ah
dw avx_cvtsi2ss_instruction-instruction_handler
db 'vcvtss2sd',5Ah
dw avx_ss_instruction_sae-instruction_handler
db 'vcvtss2si',2Dh
dw avx_cvtss2si_instruction-instruction_handler
db 'vdbpsadbw',42h
dw avx_bw_instruction_3a_imm8_evex-instruction_handler
db 'vexpandpd',88h
dw avx_single_source_q_instruction_38_evex-instruction_handler
db 'vexpandps',88h
dw avx_single_source_d_instruction_38_evex-instruction_handler
db 'vfnmaddpd',79h
dw fma4_instruction_p-instruction_handler
db 'vfnmaddps',78h
dw fma4_instruction_p-instruction_handler
db 'vfnmaddsd',7Bh
dw fma4_instruction_sd-instruction_handler
db 'vfnmaddss',7Ah
dw fma4_instruction_ss-instruction_handler
db 'vfnmsubpd',7Dh
dw fma4_instruction_p-instruction_handler
db 'vfnmsubps',7Ch
dw fma4_instruction_p-instruction_handler
db 'vfnmsubsd',7Fh
dw fma4_instruction_sd-instruction_handler
db 'vfnmsubss',7Eh
dw fma4_instruction_ss-instruction_handler
db 'vgetexppd',42h
dw avx512_single_source_pd_instruction_sae-instruction_handler
db 'vgetexpps',42h
dw avx512_single_source_ps_instruction_sae-instruction_handler
db 'vgetexpsd',43h
dw avx512_sd_instruction_sae-instruction_handler
db 'vgetexpss',43h
dw avx512_ss_instruction_sae-instruction_handler
db 'vinsertps',21h
dw avx_insertps_instruction-instruction_handler
db 'vmovdqa32',6Fh
dw avx512_movdqa32_instruction-instruction_handler
db 'vmovdqa64',6Fh
dw avx512_movdqa64_instruction-instruction_handler
db 'vmovdqu16',6Fh
dw avx512_movdqu16_instruction-instruction_handler
db 'vmovdqu32',6Fh
dw avx512_movdqu32_instruction-instruction_handler
db 'vmovdqu64',6Fh
dw avx512_movdqu64_instruction-instruction_handler
db 'vmovmskpd',0
dw avx_movmskpd_instruction-instruction_handler
db 'vmovmskps',0
dw avx_movmskps_instruction-instruction_handler
db 'vmovntdqa',2Ah
dw avx_movntdqa_instruction-instruction_handler
db 'vmovshdup',16h
dw avx_movshdup_instruction-instruction_handler
db 'vmovsldup',12h
dw avx_movshdup_instruction-instruction_handler
db 'vp4dpwssd',52h
dw avx512_4vnniw_instruction-instruction_handler
db 'vpackssdw',6Bh
dw avx_d_instruction-instruction_handler
db 'vpacksswb',63h
dw avx_bw_instruction-instruction_handler
db 'vpackusdw',2Bh
dw avx_d_instruction_38-instruction_handler
db 'vpackuswb',67h
dw avx_bw_instruction-instruction_handler
db 'vpblendmb',66h
dw avx_bw_instruction_38_evex-instruction_handler
db 'vpblendmd',64h
dw avx_d_instruction_38_evex-instruction_handler
db 'vpblendmq',64h
dw avx_q_instruction_38_evex-instruction_handler
db 'vpblendmw',66h
dw avx_bw_instruction_38_w1_evex-instruction_handler
db 'vpblendvb',4Ch
dw avx_triple_source_instruction_3a_noevex-instruction_handler
db 'vpcmpleub',2
dw avx512_cmp_ub_instruction-instruction_handler
db 'vpcmpleud',2
dw avx512_cmp_ud_instruction-instruction_handler
db 'vpcmpleuq',2
dw avx512_cmp_uq_instruction-instruction_handler
db 'vpcmpleuw',2
dw avx512_cmp_uw_instruction-instruction_handler
db 'vpcmpltub',1
dw avx512_cmp_ub_instruction-instruction_handler
db 'vpcmpltud',1
dw avx512_cmp_ud_instruction-instruction_handler
db 'vpcmpltuq',1
dw avx512_cmp_uq_instruction-instruction_handler
db 'vpcmpltuw',1
dw avx512_cmp_uw_instruction-instruction_handler
db 'vpcmpneqb',4
dw avx512_cmp_b_instruction-instruction_handler
db 'vpcmpneqd',4
dw avx512_cmp_d_instruction-instruction_handler
db 'vpcmpneqq',4
dw avx512_cmp_q_instruction-instruction_handler
db 'vpcmpneqw',4
dw avx512_cmp_b_instruction-instruction_handler
db 'vpcmpnleb',6
dw avx512_cmp_b_instruction-instruction_handler
db 'vpcmpnled',6
dw avx512_cmp_d_instruction-instruction_handler
db 'vpcmpnleq',6
dw avx512_cmp_q_instruction-instruction_handler
db 'vpcmpnlew',6
dw avx512_cmp_b_instruction-instruction_handler
db 'vpcmpnltb',5
dw avx512_cmp_b_instruction-instruction_handler
db 'vpcmpnltd',5
dw avx512_cmp_d_instruction-instruction_handler
db 'vpcmpnltq',5
dw avx512_cmp_q_instruction-instruction_handler
db 'vpcmpnltw',5
dw avx512_cmp_b_instruction-instruction_handler
db 'vpcomequb',4
dw xop_pcom_ub_instruction-instruction_handler
db 'vpcomequd',4
dw xop_pcom_ud_instruction-instruction_handler
db 'vpcomequq',4
dw xop_pcom_uq_instruction-instruction_handler
db 'vpcomequw',4
dw xop_pcom_uw_instruction-instruction_handler
db 'vpcomgeub',3
dw xop_pcom_ub_instruction-instruction_handler
db 'vpcomgeud',3
dw xop_pcom_ud_instruction-instruction_handler
db 'vpcomgeuq',3
dw xop_pcom_uq_instruction-instruction_handler
db 'vpcomgeuw',3
dw xop_pcom_uw_instruction-instruction_handler
db 'vpcomgtub',2
dw xop_pcom_ub_instruction-instruction_handler
db 'vpcomgtud',2
dw xop_pcom_ud_instruction-instruction_handler
db 'vpcomgtuq',2
dw xop_pcom_uq_instruction-instruction_handler
db 'vpcomgtuw',2
dw xop_pcom_uw_instruction-instruction_handler
db 'vpcomleub',1
dw xop_pcom_ub_instruction-instruction_handler
db 'vpcomleud',1
dw xop_pcom_ud_instruction-instruction_handler
db 'vpcomleuq',1
dw xop_pcom_uq_instruction-instruction_handler
db 'vpcomleuw',1
dw xop_pcom_uw_instruction-instruction_handler
db 'vpcomltub',0
dw xop_pcom_ub_instruction-instruction_handler
db 'vpcomltud',0
dw xop_pcom_ud_instruction-instruction_handler
db 'vpcomltuq',0
dw xop_pcom_uq_instruction-instruction_handler
db 'vpcomltuw',0
dw xop_pcom_uw_instruction-instruction_handler
db 'vpcomneqb',5
dw xop_pcom_b_instruction-instruction_handler
db 'vpcomneqd',5
dw xop_pcom_d_instruction-instruction_handler
db 'vpcomneqq',5
dw xop_pcom_q_instruction-instruction_handler
db 'vpcomneqw',5
dw xop_pcom_w_instruction-instruction_handler
db 'vpdpbusds',51h
dw avx_d_instruction_38_evex-instruction_handler
db 'vpdpwssds',53h
dw avx_d_instruction_38_evex-instruction_handler
db 'vpermi2pd',77h
dw avx_q_instruction_38_evex-instruction_handler
db 'vpermi2ps',77h
dw avx_d_instruction_38_evex-instruction_handler
db 'vpermilpd',5
dw avx_permilpd_instruction-instruction_handler
db 'vpermilps',4
dw avx_permilps_instruction-instruction_handler
db 'vpermt2pd',7Fh
dw avx_q_instruction_38_evex-instruction_handler
db 'vpermt2ps',7Fh
dw avx_d_instruction_38_evex-instruction_handler
db 'vpexpandb',62h
dw avx_single_source_d_instruction_38_evex-instruction_handler
db 'vpexpandd',89h
dw avx_single_source_d_instruction_38_evex-instruction_handler
db 'vpexpandq',89h
dw avx_single_source_q_instruction_38_evex-instruction_handler
db 'vpexpandw',62h
dw avx_single_source_q_instruction_38_evex-instruction_handler
db 'vphaddubd',0D2h
dw xop_single_source_128bit_instruction-instruction_handler
db 'vphaddubq',0D3h
dw xop_single_source_128bit_instruction-instruction_handler
db 'vphaddubw',0D1h
dw xop_single_source_128bit_instruction-instruction_handler
db 'vphaddudq',0DBh
dw xop_single_source_128bit_instruction-instruction_handler
db 'vphadduwd',0D6h
dw xop_single_source_128bit_instruction-instruction_handler
db 'vphadduwq',0D7h
dw xop_single_source_128bit_instruction-instruction_handler
db 'vpmacsdqh',9Fh
dw xop_triple_source_128bit_instruction-instruction_handler
db 'vpmacsdql',97h
dw xop_triple_source_128bit_instruction-instruction_handler
db 'vpmacssdd',8Eh
dw xop_triple_source_128bit_instruction-instruction_handler
db 'vpmacsswd',86h
dw xop_triple_source_128bit_instruction-instruction_handler
db 'vpmacssww',85h
dw xop_triple_source_128bit_instruction-instruction_handler
db 'vpmadcswd',0B6h
dw xop_triple_source_128bit_instruction-instruction_handler
db 'vpmovmskb',0D7h
dw avx_pmovmskb_instruction-instruction_handler
db 'vpmovsxbd',21h
dw avx_pmovsxbd_instruction-instruction_handler
db 'vpmovsxbq',22h
dw avx_pmovsxbq_instruction-instruction_handler
db 'vpmovsxbw',20h
dw avx_pmovsxbw_instruction-instruction_handler
db 'vpmovsxdq',25h
dw avx_pmovsxbw_instruction-instruction_handler
db 'vpmovsxwd',23h
dw avx_pmovsxbw_instruction-instruction_handler
db 'vpmovsxwq',24h
dw avx_pmovsxbd_instruction-instruction_handler
db 'vpmovusdb',11h
dw avx512_pmovdb_instruction-instruction_handler
db 'vpmovusdw',13h
dw avx512_pmovwb_instruction-instruction_handler
db 'vpmovusqb',12h
dw avx512_pmovqb_instruction-instruction_handler
db 'vpmovusqd',15h
dw avx512_pmovwb_instruction-instruction_handler
db 'vpmovusqw',14h
dw avx512_pmovdb_instruction-instruction_handler
db 'vpmovuswb',10h
dw avx512_pmovwb_instruction-instruction_handler
db 'vpmovzxbd',31h
dw avx_pmovsxbd_instruction-instruction_handler
db 'vpmovzxbq',32h
dw avx_pmovsxbq_instruction-instruction_handler
db 'vpmovzxbw',30h
dw avx_pmovsxbw_instruction-instruction_handler
db 'vpmovzxdq',35h
dw avx_pmovsxbw_instruction-instruction_handler
db 'vpmovzxwd',33h
dw avx_pmovsxbw_instruction-instruction_handler
db 'vpmovzxwq',34h
dw avx_pmovsxbd_instruction-instruction_handler
db 'vpmulhrsw',0Bh
dw avx_bw_instruction_38-instruction_handler
db 'vptestnmb',26h
dw avx512_ptestnmb_instruction-instruction_handler
db 'vptestnmd',27h
dw avx512_ptestnmd_instruction-instruction_handler
db 'vptestnmq',27h
dw avx512_ptestnmq_instruction-instruction_handler
db 'vptestnmw',26h
dw avx512_ptestnmw_instruction-instruction_handler
db 'vreducepd',56h
dw avx512_single_source_pd_instruction_sae_imm8-instruction_handler
db 'vreduceps',56h
dw avx512_single_source_ps_instruction_sae_imm8-instruction_handler
db 'vreducesd',57h
dw avx512_sd_instruction_sae_imm8-instruction_handler
db 'vreducess',57h
dw avx512_ss_instruction_sae_imm8-instruction_handler
db 'vscalefpd',2Ch
dw avx512_pd_instruction_er-instruction_handler
db 'vscalefps',2Ch
dw avx512_ps_instruction_er-instruction_handler
db 'vscalefsd',2Dh
dw avx512_sd_instruction_er-instruction_handler
db 'vscalefss',2Dh
dw avx512_ss_instruction_er-instruction_handler
db 'vunpckhpd',15h
dw avx_pd_instruction-instruction_handler
db 'vunpckhps',15h
dw avx_ps_instruction-instruction_handler
db 'vunpcklpd',14h
dw avx_pd_instruction-instruction_handler
db 'vunpcklps',14h
dw avx_ps_instruction-instruction_handler
db 'xrstors64',3
dw xsaves_instruction_64bit-instruction_handler
instructions_10:
db 'aesdeclast',0DFh
dw sse4_instruction_66_38-instruction_handler
db 'aesenclast',0DDh
dw sse4_instruction_66_38-instruction_handler
db 'clflushopt',7
dw clflushopt_instruction-instruction_handler
db 'cmpunordpd',3
dw cmp_pd_instruction-instruction_handler
db 'cmpunordps',3
dw cmp_ps_instruction-instruction_handler
db 'cmpunordsd',3
dw cmp_sd_instruction-instruction_handler
db 'cmpunordss',3
dw cmp_ss_instruction-instruction_handler
db 'cmpxchg16b',16
dw cmpxchgx_instruction-instruction_handler
db 'loadall286',5
dw simple_extended_instruction-instruction_handler
db 'loadall386',7
dw simple_extended_instruction-instruction_handler
db 'maskmovdqu',0
dw maskmovdqu_instruction-instruction_handler
db 'phminposuw',41h
dw sse4_instruction_66_38-instruction_handler
db 'prefetcht0',1
dw prefetch_instruction-instruction_handler
db 'prefetcht1',2
dw prefetch_instruction-instruction_handler
db 'prefetcht2',3
dw prefetch_instruction-instruction_handler
db 'punpckhqdq',6Dh
dw sse_pd_instruction-instruction_handler
db 'punpcklqdq',6Ch
dw sse_pd_instruction-instruction_handler
db 'sha256msg1',0CCh
dw sse4_instruction_38-instruction_handler
db 'sha256msg2',0CDh
dw sse4_instruction_38-instruction_handler
db 'vcmptruepd',0Fh
dw avx_cmp_pd_instruction-instruction_handler
db 'vcmptrueps',0Fh
dw avx_cmp_ps_instruction-instruction_handler
db 'vcmptruesd',0Fh
dw avx_cmp_sd_instruction-instruction_handler
db 'vcmptruess',0Fh
dw avx_cmp_ss_instruction-instruction_handler
db 'vcvtpd2udq',79h
dw avx_cvtpd2udq_instruction-instruction_handler
db 'vcvtpd2uqq',79h
dw avx_single_source_pd_instruction_er_evex-instruction_handler
db 'vcvtps2udq',79h
dw avx_single_source_ps_instruction_er_evex-instruction_handler
db 'vcvtps2uqq',79h
dw avx_cvtps2qq_instruction-instruction_handler
db 'vcvtsd2usi',79h
dw avx_cvtsd2usi_instruction-instruction_handler
db 'vcvtss2usi',79h
dw avx_cvtss2usi_instruction-instruction_handler
db 'vcvttpd2dq',0E6h
dw avx_cvttpd2dq_instruction-instruction_handler
db 'vcvttpd2qq',7Ah
dw avx_single_source_pd_instruction_sae_evex-instruction_handler
db 'vcvttps2dq',5Bh
dw avx_cvttps2dq_instruction-instruction_handler
db 'vcvttps2qq',7Ah
dw avx_cvttps2qq_instruction-instruction_handler
db 'vcvttsd2si',2Ch
dw avx_cvttsd2si_instruction-instruction_handler
db 'vcvttss2si',2Ch
dw avx_cvttss2si_instruction-instruction_handler
db 'vcvtudq2pd',7Ah
dw avx_cvtudq2pd_instruction-instruction_handler
db 'vcvtudq2ps',7Ah
dw avx_cvtudq2ps_instruction-instruction_handler
db 'vcvtuqq2pd',7Ah
dw avx_cvtqq2pd_instruction-instruction_handler
db 'vcvtuqq2ps',7Ah
dw avx_cvtuqq2ps_instruction-instruction_handler
db 'vcvtusi2sd',7Bh
dw avx_cvtusi2sd_instruction-instruction_handler
db 'vcvtusi2ss',7Bh
dw avx_cvtusi2ss_instruction-instruction_handler
db 'vextractps',17h
dw avx_extract_d_instruction-instruction_handler
db 'vfpclasspd',66h
dw avx512_fpclasspd_instruction-instruction_handler
db 'vfpclassps',66h
dw avx512_fpclassps_instruction-instruction_handler
db 'vfpclasssd',67h
dw avx512_fpclasssd_instruction-instruction_handler
db 'vfpclassss',67h
dw avx512_fpclassss_instruction-instruction_handler
db 'vgatherdpd',92h
dw gather_pd_instruction-instruction_handler
db 'vgatherdps',92h
dw gather_ps_instruction-instruction_handler
db 'vgatherqpd',93h
dw gather_pd_instruction-instruction_handler
db 'vgatherqps',93h
dw gather_ps_instruction-instruction_handler
db 'vgetmantpd',26h
dw avx512_single_source_pd_instruction_sae_imm8-instruction_handler
db 'vgetmantps',26h
dw avx512_single_source_ps_instruction_sae_imm8-instruction_handler
db 'vgetmantsd',27h
dw avx512_sd_instruction_sae_imm8-instruction_handler
db 'vgetmantss',27h
dw avx512_ss_instruction_sae_imm8-instruction_handler
db 'vgf2p8mulb',0CFh
dw avx_bw_instruction_38-instruction_handler
db 'vmaskmovpd',2Dh
dw avx_maskmov_instruction-instruction_handler
db 'vmaskmovps',2Ch
dw avx_maskmov_instruction-instruction_handler
db 'vp4dpwssds',53h
dw avx512_4vnniw_instruction-instruction_handler
db 'vpclmulqdq',-1
dw avx_pclmulqdq_instruction-instruction_handler
db 'vpcmpestri',61h
dw avx_single_source_128bit_instruction_3a_imm8_noevex-instruction_handler
db 'vpcmpestrm',60h
dw avx_single_source_128bit_instruction_3a_imm8_noevex-instruction_handler
db 'vpcmpistri',63h
dw avx_single_source_128bit_instruction_3a_imm8_noevex-instruction_handler
db 'vpcmpistrm',62h
dw avx_single_source_128bit_instruction_3a_imm8_noevex-instruction_handler
db 'vpcmpnequb',4
dw avx512_cmp_ub_instruction-instruction_handler
db 'vpcmpnequd',4
dw avx512_cmp_ud_instruction-instruction_handler
db 'vpcmpnequq',4
dw avx512_cmp_uq_instruction-instruction_handler
db 'vpcmpnequw',4
dw avx512_cmp_uw_instruction-instruction_handler
db 'vpcmpnleub',6
dw avx512_cmp_ub_instruction-instruction_handler
db 'vpcmpnleud',6
dw avx512_cmp_ud_instruction-instruction_handler
db 'vpcmpnleuq',6
dw avx512_cmp_uq_instruction-instruction_handler
db 'vpcmpnleuw',6
dw avx512_cmp_uw_instruction-instruction_handler
db 'vpcmpnltub',5
dw avx512_cmp_ub_instruction-instruction_handler
db 'vpcmpnltud',5
dw avx512_cmp_ud_instruction-instruction_handler
db 'vpcmpnltuq',5
dw avx512_cmp_uq_instruction-instruction_handler
db 'vpcmpnltuw',5
dw avx512_cmp_uw_instruction-instruction_handler
db 'vpcomnequb',5
dw xop_pcom_ub_instruction-instruction_handler
db 'vpcomnequd',5
dw xop_pcom_ud_instruction-instruction_handler
db 'vpcomnequq',5
dw xop_pcom_uq_instruction-instruction_handler
db 'vpcomnequw',5
dw xop_pcom_uw_instruction-instruction_handler
db 'vpcomtrueb',7
dw xop_pcom_b_instruction-instruction_handler
db 'vpcomtrued',7
dw xop_pcom_d_instruction-instruction_handler
db 'vpcomtrueq',7
dw xop_pcom_q_instruction-instruction_handler
db 'vpcomtruew',7
dw xop_pcom_w_instruction-instruction_handler
db 'vperm2f128',6
dw avx_perm2f128_instruction-instruction_handler
db 'vperm2i128',46h
dw avx_perm2f128_instruction-instruction_handler
db 'vpermil2pd',49h
dw vpermil2_instruction-instruction_handler
db 'vpermil2ps',48h
dw vpermil2_instruction-instruction_handler
db 'vpgatherdd',90h
dw gather_ps_instruction-instruction_handler
db 'vpgatherdq',90h
dw gather_pd_instruction-instruction_handler
db 'vpgatherqd',91h
dw gather_ps_instruction-instruction_handler
db 'vpgatherqq',91h
dw gather_pd_instruction-instruction_handler
db 'vpmacssdqh',8Fh
dw xop_triple_source_128bit_instruction-instruction_handler
db 'vpmacssdql',87h
dw xop_triple_source_128bit_instruction-instruction_handler
db 'vpmadcsswd',0A6h
dw xop_triple_source_128bit_instruction-instruction_handler
db 'vpmaddubsw',4
dw avx_bw_instruction_38-instruction_handler
db 'vpmaskmovd',8Ch
dw avx_maskmov_instruction-instruction_handler
db 'vpmaskmovq',8Ch
dw avx_maskmov_w1_instruction-instruction_handler
db 'vpternlogd',25h
dw avx_d_instruction_3a_imm8_evex-instruction_handler
db 'vpternlogq',25h
dw avx_q_instruction_3a_imm8_evex-instruction_handler
db 'vpunpckhbw',68h
dw avx_bw_instruction-instruction_handler
db 'vpunpckhdq',6Ah
dw avx_d_instruction-instruction_handler
db 'vpunpckhwd',69h
dw avx_bw_instruction-instruction_handler
db 'vpunpcklbw',60h
dw avx_bw_instruction-instruction_handler
db 'vpunpckldq',62h
dw avx_d_instruction-instruction_handler
db 'vpunpcklwd',61h
dw avx_bw_instruction-instruction_handler
db 'vrsqrt14pd',4Eh
dw avx512_single_source_pd_instruction-instruction_handler
db 'vrsqrt14ps',4Eh
dw avx512_single_source_ps_instruction-instruction_handler
db 'vrsqrt14sd',4Fh
dw avx512_sd_instruction-instruction_handler
db 'vrsqrt14ss',4Fh
dw avx512_ss_instruction-instruction_handler
db 'vrsqrt28pd',0CCh
dw avx512_exp2pd_instruction-instruction_handler
db 'vrsqrt28ps',0CCh
dw avx512_exp2ps_instruction-instruction_handler
db 'vrsqrt28sd',0CDh
dw avx512_sd_instruction_sae-instruction_handler
db 'vrsqrt28ss',0CDh
dw avx512_ss_instruction_sae-instruction_handler
db 'vshuff32x4',23h
dw avx512_shuf_d_instruction-instruction_handler
db 'vshuff64x2',23h
dw avx512_shuf_q_instruction-instruction_handler
db 'vshufi32x4',43h
dw avx512_shuf_d_instruction-instruction_handler
db 'vshufi64x2',43h
dw avx512_shuf_q_instruction-instruction_handler
db 'vzeroupper',77h
dw vzeroupper_instruction-instruction_handler
db 'xsaveopt64',110b
dw fxsave_instruction_64bit-instruction_handler
instructions_11:
db 'pclmulhqhdq',10001b
dw pclmulqdq_instruction-instruction_handler
db 'pclmullqhdq',10000b
dw pclmulqdq_instruction-instruction_handler
db 'prefetchnta',0
dw prefetch_instruction-instruction_handler
db 'prefetchwt1',2
dw amd_prefetch_instruction-instruction_handler
db 'saveprevssp',0EAh
dw setssbsy_instruction-instruction_handler
db 'sha256rnds2',0CBh
dw sse4_instruction_38_xmm0-instruction_handler
db 'vaesdeclast',0DFh
dw avx_instruction_38_nomask-instruction_handler
db 'vaesenclast',0DDh
dw avx_instruction_38_nomask-instruction_handler
db 'vcmpeq_ospd',10h
dw avx_cmp_pd_instruction-instruction_handler
db 'vcmpeq_osps',10h
dw avx_cmp_ps_instruction-instruction_handler
db 'vcmpeq_ossd',10h
dw avx_cmp_sd_instruction-instruction_handler
db 'vcmpeq_osss',10h
dw avx_cmp_ss_instruction-instruction_handler
db 'vcmpeq_uqpd',8
dw avx_cmp_pd_instruction-instruction_handler
db 'vcmpeq_uqps',8
dw avx_cmp_ps_instruction-instruction_handler
db 'vcmpeq_uqsd',8
dw avx_cmp_sd_instruction-instruction_handler
db 'vcmpeq_uqss',8
dw avx_cmp_ss_instruction-instruction_handler
db 'vcmpeq_uspd',18h
dw avx_cmp_pd_instruction-instruction_handler
db 'vcmpeq_usps',18h
dw avx_cmp_ps_instruction-instruction_handler
db 'vcmpeq_ussd',18h
dw avx_cmp_sd_instruction-instruction_handler
db 'vcmpeq_usss',18h
dw avx_cmp_ss_instruction-instruction_handler
db 'vcmpfalsepd',0Bh
dw avx_cmp_pd_instruction-instruction_handler
db 'vcmpfalseps',0Bh
dw avx_cmp_ps_instruction-instruction_handler
db 'vcmpfalsesd',0Bh
dw avx_cmp_sd_instruction-instruction_handler
db 'vcmpfalsess',0Bh
dw avx_cmp_ss_instruction-instruction_handler
db 'vcmpge_oqpd',1Dh
dw avx_cmp_pd_instruction-instruction_handler
db 'vcmpge_oqps',1Dh
dw avx_cmp_ps_instruction-instruction_handler
db 'vcmpge_oqsd',1Dh
dw avx_cmp_sd_instruction-instruction_handler
db 'vcmpge_oqss',1Dh
dw avx_cmp_ss_instruction-instruction_handler
db 'vcmpgt_oqpd',1Eh
dw avx_cmp_pd_instruction-instruction_handler
db 'vcmpgt_oqps',1Eh
dw avx_cmp_ps_instruction-instruction_handler
db 'vcmpgt_oqsd',1Eh
dw avx_cmp_sd_instruction-instruction_handler
db 'vcmpgt_oqss',1Eh
dw avx_cmp_ss_instruction-instruction_handler
db 'vcmple_oqpd',12h
dw avx_cmp_pd_instruction-instruction_handler
db 'vcmple_oqps',12h
dw avx_cmp_ps_instruction-instruction_handler
db 'vcmple_oqsd',12h
dw avx_cmp_sd_instruction-instruction_handler
db 'vcmple_oqss',12h
dw avx_cmp_ss_instruction-instruction_handler
db 'vcmplt_oqpd',11h
dw avx_cmp_pd_instruction-instruction_handler
db 'vcmplt_oqps',11h
dw avx_cmp_ps_instruction-instruction_handler
db 'vcmplt_oqsd',11h
dw avx_cmp_sd_instruction-instruction_handler
db 'vcmplt_oqss',11h
dw avx_cmp_ss_instruction-instruction_handler
db 'vcmpord_spd',17h
dw avx_cmp_pd_instruction-instruction_handler
db 'vcmpord_sps',17h
dw avx_cmp_ps_instruction-instruction_handler
db 'vcmpord_ssd',17h
dw avx_cmp_sd_instruction-instruction_handler
db 'vcmpord_sss',17h
dw avx_cmp_ss_instruction-instruction_handler
db 'vcmpunordpd',3
dw avx_cmp_pd_instruction-instruction_handler
db 'vcmpunordps',3
dw avx_cmp_ps_instruction-instruction_handler
db 'vcmpunordsd',3
dw avx_cmp_sd_instruction-instruction_handler
db 'vcmpunordss',3
dw avx_cmp_ss_instruction-instruction_handler
db 'vcompresspd',8Ah
dw avx_compress_q_instruction-instruction_handler
db 'vcompressps',8Ah
dw avx_compress_d_instruction-instruction_handler
db 'vcvttpd2udq',78h
dw avx_cvttpd2udq_instruction-instruction_handler
db 'vcvttpd2uqq',78h
dw avx_single_source_pd_instruction_sae_evex-instruction_handler
db 'vcvttps2udq',78h
dw avx_cvttps2udq_instruction-instruction_handler
db 'vcvttps2uqq',78h
dw avx_cvttps2qq_instruction-instruction_handler
db 'vcvttsd2usi',78h
dw avx_cvttsd2usi_instruction-instruction_handler
db 'vcvttss2usi',78h
dw avx_cvttss2usi_instruction-instruction_handler
db 'vfixupimmpd',54h
dw avx512_pd_instruction_sae_imm8-instruction_handler
db 'vfixupimmps',54h
dw avx512_ps_instruction_sae_imm8-instruction_handler
db 'vfixupimmsd',55h
dw avx512_sd_instruction_sae_imm8-instruction_handler
db 'vfixupimmss',55h
dw avx512_ss_instruction_sae_imm8-instruction_handler
db 'vfmadd132pd',98h
dw fma_instruction_pd-instruction_handler
db 'vfmadd132ps',98h
dw fma_instruction_ps-instruction_handler
db 'vfmadd132sd',99h
dw fma_instruction_sd-instruction_handler
db 'vfmadd132ss',99h
dw fma_instruction_ss-instruction_handler
db 'vfmadd213pd',0A8h
dw fma_instruction_pd-instruction_handler
db 'vfmadd213ps',0A8h
dw fma_instruction_ps-instruction_handler
db 'vfmadd213sd',0A9h
dw fma_instruction_sd-instruction_handler
db 'vfmadd213ss',0A9h
dw fma_instruction_ss-instruction_handler
db 'vfmadd231pd',0B8h
dw fma_instruction_pd-instruction_handler
db 'vfmadd231ps',0B8h
dw fma_instruction_ps-instruction_handler
db 'vfmadd231sd',0B9h
dw fma_instruction_sd-instruction_handler
db 'vfmadd231ss',0B9h
dw fma_instruction_ss-instruction_handler
db 'vfmaddsubpd',5Dh
dw fma4_instruction_p-instruction_handler
db 'vfmaddsubps',5Ch
dw fma4_instruction_p-instruction_handler
db 'vfmsub132pd',9Ah
dw fma_instruction_pd-instruction_handler
db 'vfmsub132ps',9Ah
dw fma_instruction_ps-instruction_handler
db 'vfmsub132sd',9Bh
dw fma_instruction_sd-instruction_handler
db 'vfmsub132ss',9Bh
dw fma_instruction_ss-instruction_handler
db 'vfmsub213pd',0AAh
dw fma_instruction_pd-instruction_handler
db 'vfmsub213ps',0AAh
dw fma_instruction_ps-instruction_handler
db 'vfmsub213sd',0ABh
dw fma_instruction_sd-instruction_handler
db 'vfmsub213ss',0ABh
dw fma_instruction_ss-instruction_handler
db 'vfmsub231pd',0BAh
dw fma_instruction_pd-instruction_handler
db 'vfmsub231ps',0BAh
dw fma_instruction_ps-instruction_handler
db 'vfmsub231sd',0BBh
dw fma_instruction_sd-instruction_handler
db 'vfmsub231ss',0BBh
dw fma_instruction_ss-instruction_handler
db 'vfmsubaddpd',5Fh
dw fma4_instruction_p-instruction_handler
db 'vfmsubaddps',5Eh
dw fma4_instruction_p-instruction_handler
db 'vinsertf128',18h
dw avx_insertf128_instruction-instruction_handler
db 'vinserti128',38h
dw avx_insertf128_instruction-instruction_handler
db 'vmaskmovdqu',0
dw avx_maskmovdqu_instruction-instruction_handler
db 'vpcomfalseb',6
dw xop_pcom_b_instruction-instruction_handler
db 'vpcomfalsed',6
dw xop_pcom_d_instruction-instruction_handler
db 'vpcomfalseq',6
dw xop_pcom_q_instruction-instruction_handler
db 'vpcomfalsew',6
dw xop_pcom_w_instruction-instruction_handler
db 'vpcompressb',63h
dw avx_compress_d_instruction-instruction_handler
db 'vpcompressd',8Bh
dw avx_compress_d_instruction-instruction_handler
db 'vpcompressq',8Bh
dw avx_compress_q_instruction-instruction_handler
db 'vpcompressw',63h
dw avx_compress_q_instruction-instruction_handler
db 'vpcomtrueub',7
dw xop_pcom_ub_instruction-instruction_handler
db 'vpcomtrueud',7
dw xop_pcom_ud_instruction-instruction_handler
db 'vpcomtrueuq',7
dw xop_pcom_uq_instruction-instruction_handler
db 'vpcomtrueuw',7
dw xop_pcom_uw_instruction-instruction_handler
db 'vpconflictd',0C4h
dw avx_single_source_d_instruction_38_evex-instruction_handler
db 'vpconflictq',0C4h
dw avx_single_source_q_instruction_38_evex-instruction_handler
db 'vphminposuw',41h
dw avx_single_source_instruction_38_noevex-instruction_handler
db 'vpmadd52huq',0B5h
dw avx_q_instruction_38_evex-instruction_handler
db 'vpmadd52luq',0B4h
dw avx_q_instruction_38_evex-instruction_handler
db 'vpscatterdd',0A0h
dw scatter_ps_instruction-instruction_handler
db 'vpscatterdq',0A0h
dw scatter_pd_instruction-instruction_handler
db 'vpscatterqd',0A1h
dw scatter_ps_instruction-instruction_handler
db 'vpscatterqq',0A1h
dw scatter_pd_instruction-instruction_handler
db 'vpunpckhqdq',6Dh
dw avx_q_instruction-instruction_handler
db 'vpunpcklqdq',6Ch
dw avx_q_instruction-instruction_handler
db 'vrndscalepd',9
dw avx512_single_source_pd_instruction_sae_imm8-instruction_handler
db 'vrndscaleps',8
dw avx512_single_source_ps_instruction_sae_imm8-instruction_handler
db 'vrndscalesd',0Bh
dw avx512_sd_instruction_sae_imm8-instruction_handler
db 'vrndscaless',0Ah
dw avx512_ss_instruction_sae_imm8-instruction_handler
db 'vscatterdpd',0A2h
dw scatter_pd_instruction-instruction_handler
db 'vscatterdps',0A2h
dw scatter_ps_instruction-instruction_handler
db 'vscatterqpd',0A3h
dw scatter_pd_instruction-instruction_handler
db 'vscatterqps',0A3h
dw scatter_ps_instruction-instruction_handler
instructions_12:
db 'pclmulhqhqdq',10001b
dw pclmulqdq_instruction-instruction_handler
db 'pclmulhqlqdq',1
dw pclmulqdq_instruction-instruction_handler
db 'pclmullqhqdq',10000b
dw pclmulqdq_instruction-instruction_handler
db 'pclmullqlqdq',0
dw pclmulqdq_instruction-instruction_handler
db 'vbroadcastsd',19h
dw avx_broadcastsd_instruction-instruction_handler
db 'vbroadcastss',18h
dw avx_broadcastss_instruction-instruction_handler
db 'vcmpneq_oqpd',0Ch
dw avx_cmp_pd_instruction-instruction_handler
db 'vcmpneq_oqps',0Ch
dw avx_cmp_ps_instruction-instruction_handler
db 'vcmpneq_oqsd',0Ch
dw avx_cmp_sd_instruction-instruction_handler
db 'vcmpneq_oqss',0Ch
dw avx_cmp_ss_instruction-instruction_handler
db 'vcmpneq_ospd',1Ch
dw avx_cmp_pd_instruction-instruction_handler
db 'vcmpneq_osps',1Ch
dw avx_cmp_ps_instruction-instruction_handler
db 'vcmpneq_ossd',1Ch
dw avx_cmp_sd_instruction-instruction_handler
db 'vcmpneq_osss',1Ch
dw avx_cmp_ss_instruction-instruction_handler
db 'vcmpneq_uspd',14h
dw avx_cmp_pd_instruction-instruction_handler
db 'vcmpneq_usps',14h
dw avx_cmp_ps_instruction-instruction_handler
db 'vcmpneq_ussd',14h
dw avx_cmp_sd_instruction-instruction_handler
db 'vcmpneq_usss',14h
dw avx_cmp_ss_instruction-instruction_handler
db 'vcmpnge_uqpd',19h
dw avx_cmp_pd_instruction-instruction_handler
db 'vcmpnge_uqps',19h
dw avx_cmp_ps_instruction-instruction_handler
db 'vcmpnge_uqsd',19h
dw avx_cmp_sd_instruction-instruction_handler
db 'vcmpnge_uqss',19h
dw avx_cmp_ss_instruction-instruction_handler
db 'vcmpngt_uqpd',1Ah
dw avx_cmp_pd_instruction-instruction_handler
db 'vcmpngt_uqps',1Ah
dw avx_cmp_ps_instruction-instruction_handler
db 'vcmpngt_uqsd',1Ah
dw avx_cmp_sd_instruction-instruction_handler
db 'vcmpngt_uqss',1Ah
dw avx_cmp_ss_instruction-instruction_handler
db 'vcmpnle_uqpd',16h
dw avx_cmp_pd_instruction-instruction_handler
db 'vcmpnle_uqps',16h
dw avx_cmp_ps_instruction-instruction_handler
db 'vcmpnle_uqsd',16h
dw avx_cmp_sd_instruction-instruction_handler
db 'vcmpnle_uqss',16h
dw avx_cmp_ss_instruction-instruction_handler
db 'vcmpnlt_uqpd',15h
dw avx_cmp_pd_instruction-instruction_handler
db 'vcmpnlt_uqps',15h
dw avx_cmp_ps_instruction-instruction_handler
db 'vcmpnlt_uqsd',15h
dw avx_cmp_sd_instruction-instruction_handler
db 'vcmpnlt_uqss',15h
dw avx_cmp_ss_instruction-instruction_handler
db 'vextractf128',19h
dw avx_extractf128_instruction-instruction_handler
db 'vextracti128',39h
dw avx_extractf128_instruction-instruction_handler
db 'vfnmadd132pd',9Ch
dw fma_instruction_pd-instruction_handler
db 'vfnmadd132ps',9Ch
dw fma_instruction_ps-instruction_handler
db 'vfnmadd132sd',9Dh
dw fma_instruction_sd-instruction_handler
db 'vfnmadd132ss',9Dh
dw fma_instruction_ss-instruction_handler
db 'vfnmadd213pd',0ACh
dw fma_instruction_pd-instruction_handler
db 'vfnmadd213ps',0ACh
dw fma_instruction_ps-instruction_handler
db 'vfnmadd213sd',0ADh
dw fma_instruction_sd-instruction_handler
db 'vfnmadd213ss',0ADh
dw fma_instruction_ss-instruction_handler
db 'vfnmadd231pd',0BCh
dw fma_instruction_pd-instruction_handler
db 'vfnmadd231ps',0BCh
dw fma_instruction_ps-instruction_handler
db 'vfnmadd231sd',0BDh
dw fma_instruction_sd-instruction_handler
db 'vfnmadd231ss',0BDh
dw fma_instruction_ss-instruction_handler
db 'vfnmsub132pd',9Eh
dw fma_instruction_pd-instruction_handler
db 'vfnmsub132ps',9Eh
dw fma_instruction_ps-instruction_handler
db 'vfnmsub132sd',9Fh
dw fma_instruction_sd-instruction_handler
db 'vfnmsub132ss',9Fh
dw fma_instruction_ss-instruction_handler
db 'vfnmsub213pd',0AEh
dw fma_instruction_pd-instruction_handler
db 'vfnmsub213ps',0AEh
dw fma_instruction_ps-instruction_handler
db 'vfnmsub213sd',0AFh
dw fma_instruction_sd-instruction_handler
db 'vfnmsub213ss',0AFh
dw fma_instruction_ss-instruction_handler
db 'vfnmsub231pd',0BEh
dw fma_instruction_pd-instruction_handler
db 'vfnmsub231ps',0BEh
dw fma_instruction_ps-instruction_handler
db 'vfnmsub231sd',0BFh
dw fma_instruction_sd-instruction_handler
db 'vfnmsub231ss',0BFh
dw fma_instruction_ss-instruction_handler
db 'vinsertf32x4',18h
dw avx512_insert_32x4_instruction-instruction_handler
db 'vinsertf32x8',1Ah
dw avx512_insert_32x8_instruction-instruction_handler
db 'vinsertf64x2',18h
dw avx512_insert_64x2_instruction-instruction_handler
db 'vinsertf64x4',1Ah
dw avx512_insert_64x4_instruction-instruction_handler
db 'vinserti32x4',38h
dw avx512_insert_32x4_instruction-instruction_handler
db 'vinserti32x8',3Ah
dw avx512_insert_32x8_instruction-instruction_handler
db 'vinserti64x2',38h
dw avx512_insert_64x2_instruction-instruction_handler
db 'vinserti64x4',3Ah
dw avx512_insert_64x4_instruction-instruction_handler
db 'vpbroadcastb',78h
dw avx_pbroadcastb_instruction-instruction_handler
db 'vpbroadcastd',58h
dw avx_pbroadcastd_instruction-instruction_handler
db 'vpbroadcastq',59h
dw avx_pbroadcastq_instruction-instruction_handler
db 'vpbroadcastw',79h
dw avx_pbroadcastw_instruction-instruction_handler
db 'vpclmulhqhdq',10001b
dw avx_pclmulqdq_instruction-instruction_handler
db 'vpclmullqhdq',10000b
dw avx_pclmulqdq_instruction-instruction_handler
db 'vpcomfalseub',6
dw xop_pcom_ub_instruction-instruction_handler
db 'vpcomfalseud',6
dw xop_pcom_ud_instruction-instruction_handler
db 'vpcomfalseuq',6
dw xop_pcom_uq_instruction-instruction_handler
db 'vpcomfalseuw',6
dw xop_pcom_uw_instruction-instruction_handler
db 'vpermilmo2pd',10b
dw vpermil_2pd_instruction-instruction_handler
db 'vpermilmo2ps',10b
dw vpermil_2ps_instruction-instruction_handler
db 'vpermilmz2pd',11b
dw vpermil_2pd_instruction-instruction_handler
db 'vpermilmz2ps',11b
dw vpermil_2ps_instruction-instruction_handler
db 'vpermiltd2pd',0
dw vpermil_2pd_instruction-instruction_handler
db 'vpermiltd2ps',0
dw vpermil_2ps_instruction-instruction_handler
db 'vpshufbitqmb',8Fh
dw avx512_ptestmb_instruction-instruction_handler
instructions_13:
db 'gf2p8affineqb',0CEh
dw sse4_instruction_66_3a_imm8-instruction_handler
db 'vcmptrue_uspd',1Fh
dw avx_cmp_pd_instruction-instruction_handler
db 'vcmptrue_usps',1Fh
dw avx_cmp_ps_instruction-instruction_handler
db 'vcmptrue_ussd',1Fh
dw avx_cmp_sd_instruction-instruction_handler
db 'vcmptrue_usss',1Fh
dw avx_cmp_ss_instruction-instruction_handler
db 'vcmpunord_spd',13h
dw avx_cmp_pd_instruction-instruction_handler
db 'vcmpunord_sps',13h
dw avx_cmp_ps_instruction-instruction_handler
db 'vcmpunord_ssd',13h
dw avx_cmp_sd_instruction-instruction_handler
db 'vcmpunord_sss',13h
dw avx_cmp_ss_instruction-instruction_handler
db 'vextractf32x4',19h
dw avx512_extract_32x4_instruction-instruction_handler
db 'vextractf32x8',1Bh
dw avx512_extract_32x8_instruction-instruction_handler
db 'vextractf64x2',19h
dw avx512_extract_64x2_instruction-instruction_handler
db 'vextractf64x4',1Bh
dw avx512_extract_64x4_instruction-instruction_handler
db 'vextracti32x4',39h
dw avx512_extract_32x4_instruction-instruction_handler
db 'vextracti32x8',3Bh
dw avx512_extract_32x8_instruction-instruction_handler
db 'vextracti64x2',39h
dw avx512_extract_64x2_instruction-instruction_handler
db 'vextracti64x4',3Bh
dw avx512_extract_64x4_instruction-instruction_handler
db 'vgatherpf0dpd',1
dw gatherpf_dpd_instruction-instruction_handler
db 'vgatherpf0dps',1
dw gatherpf_dps_instruction-instruction_handler
db 'vgatherpf0qpd',1
dw gatherpf_qpd_instruction-instruction_handler
db 'vgatherpf0qps',1
dw gatherpf_qps_instruction-instruction_handler
db 'vgatherpf1dpd',2
dw gatherpf_dpd_instruction-instruction_handler
db 'vgatherpf1dps',2
dw gatherpf_dps_instruction-instruction_handler
db 'vgatherpf1qpd',2
dw gatherpf_qpd_instruction-instruction_handler
db 'vgatherpf1qps',2
dw gatherpf_qps_instruction-instruction_handler
db 'vpclmulhqlqdq',1
dw avx_pclmulqdq_instruction-instruction_handler
db 'vpclmullqlqdq',0
dw avx_pclmulqdq_instruction-instruction_handler
instructions_14:
db 'vbroadcastf128',1Ah
dw avx_broadcast_128_instruction_noevex-instruction_handler
db 'vbroadcasti128',5Ah
dw avx_broadcast_128_instruction_noevex-instruction_handler
db 'vcmpfalse_ospd',1Bh
dw avx_cmp_pd_instruction-instruction_handler
db 'vcmpfalse_osps',1Bh
dw avx_cmp_ps_instruction-instruction_handler
db 'vcmpfalse_ossd',1Bh
dw avx_cmp_sd_instruction-instruction_handler
db 'vcmpfalse_osss',1Bh
dw avx_cmp_ss_instruction-instruction_handler
db 'vfmaddsub132pd',96h
dw fma_instruction_pd-instruction_handler
db 'vfmaddsub132ps',96h
dw fma_instruction_ps-instruction_handler
db 'vfmaddsub213pd',0A6h
dw fma_instruction_pd-instruction_handler
db 'vfmaddsub213ps',0A6h
dw fma_instruction_ps-instruction_handler
db 'vfmaddsub231pd',0B6h
dw fma_instruction_pd-instruction_handler
db 'vfmaddsub231ps',0B6h
dw fma_instruction_ps-instruction_handler
db 'vfmsubadd132pd',97h
dw fma_instruction_pd-instruction_handler
db 'vfmsubadd132ps',97h
dw fma_instruction_ps-instruction_handler
db 'vfmsubadd213pd',0A7h
dw fma_instruction_pd-instruction_handler
db 'vfmsubadd213ps',0A7h
dw fma_instruction_ps-instruction_handler
db 'vfmsubadd231pd',0B7h
dw fma_instruction_pd-instruction_handler
db 'vfmsubadd231ps',0B7h
dw fma_instruction_ps-instruction_handler
db 'vgf2p8affineqb',0CEh
dw avx_q_instruction_3a_imm8_w1-instruction_handler
db 'vpmultishiftqb',83h
dw avx_q_instruction_38_evex-instruction_handler
db 'vscatterpf0dpd',5
dw gatherpf_dpd_instruction-instruction_handler
db 'vscatterpf0dps',5
dw gatherpf_dps_instruction-instruction_handler
db 'vscatterpf0qpd',5
dw gatherpf_qpd_instruction-instruction_handler
db 'vscatterpf0qps',5
dw gatherpf_qps_instruction-instruction_handler
db 'vscatterpf1dpd',6
dw gatherpf_dpd_instruction-instruction_handler
db 'vscatterpf1dps',6
dw gatherpf_dps_instruction-instruction_handler
db 'vscatterpf1qpd',6
dw gatherpf_qpd_instruction-instruction_handler
db 'vscatterpf1qps',6
dw gatherpf_qps_instruction-instruction_handler
instructions_15:
db 'aeskeygenassist',0DFh
dw sse4_instruction_66_3a_imm8-instruction_handler
db 'vbroadcastf32x2',19h
dw avx512_broadcast_32x2_instruction-instruction_handler
db 'vbroadcastf32x4',1Ah
dw avx512_broadcast_32x4_instruction-instruction_handler
db 'vbroadcastf32x8',1Bh
dw avx512_broadcast_32x8_instruction-instruction_handler
db 'vbroadcastf64x2',1Ah
dw avx512_broadcast_64x2_instruction-instruction_handler
db 'vbroadcastf64x4',1Bh
dw avx512_broadcast_64x4_instruction-instruction_handler
db 'vbroadcasti32x2',59h
dw avx512_broadcast_32x2_instruction-instruction_handler
db 'vbroadcasti32x4',5Ah
dw avx512_broadcast_32x4_instruction-instruction_handler
db 'vbroadcasti32x8',5Bh
dw avx512_broadcast_32x8_instruction-instruction_handler
db 'vbroadcasti64x2',5Ah
dw avx512_broadcast_64x2_instruction-instruction_handler
db 'vbroadcasti64x4',5Bh
dw avx512_broadcast_64x4_instruction-instruction_handler
db 'vpbroadcastmb2q',2Ah
dw avx512_pmov_m2_instruction_w1-instruction_handler
db 'vpbroadcastmw2d',3Ah
dw avx512_pmov_m2_instruction-instruction_handler
instructions_16:
db 'gf2p8affineinvqb',0CFh
dw sse4_instruction_66_3a_imm8-instruction_handler
db 'vaeskeygenassist',0DFh
dw avx_single_source_128bit_instruction_3a_imm8_noevex-instruction_handler
instructions_17:
db 'vgf2p8affineinvqb',0CFh
dw avx_q_instruction_3a_imm8_w1-instruction_handler
instructions_end:
 
data_directives:
dw data_directives_2-data_directives,(data_directives_3-data_directives_2)/(2+3)
dw data_directives_3-data_directives,(data_directives_4-data_directives_3)/(3+3)
dw data_directives_4-data_directives,(data_directives_end-data_directives_4)/(4+3)
 
data_directives_2:
db 'db',1
dw data_bytes-instruction_handler
db 'dd',4
dw data_dwords-instruction_handler
db 'df',6
dw data_pwords-instruction_handler
db 'dp',6
dw data_pwords-instruction_handler
db 'dq',8
dw data_qwords-instruction_handler
db 'dt',10
dw data_twords-instruction_handler
db 'du',2
dw data_unicode-instruction_handler
db 'dw',2
dw data_words-instruction_handler
db 'rb',1
dw reserve_bytes-instruction_handler
db 'rd',4
dw reserve_dwords-instruction_handler
db 'rf',6
dw reserve_pwords-instruction_handler
db 'rp',6
dw reserve_pwords-instruction_handler
db 'rq',8
dw reserve_qwords-instruction_handler
db 'rt',10
dw reserve_twords-instruction_handler
db 'rw',2
dw reserve_words-instruction_handler
data_directives_3:
data_directives_4:
db 'file',1
dw data_file-instruction_handler
data_directives_end:
/programs/develop/koldbg/fasm/variable.inc
0,0 → 1,155
 
; flat assembler core variables
; Copyright (c) 1999-2019, Tomasz Grysztar.
; All rights reserved.
 
; Variables which have to be set up by interface:
 
memory_start dd ?
memory_end dd ?
 
additional_memory dd ?
additional_memory_end dd ?
 
stack_limit dd ?
 
initial_definitions dd ?
input_file dd ?
output_file dd ?
symbols_file dd ?
 
passes_limit dw ?
 
; Internal core variables:
 
current_pass dw ?
 
include_paths dd ?
free_additional_memory dd ?
source_start dd ?
code_start dd ?
code_size dd ?
real_code_size dd ?
written_size dd ?
headers_size dd ?
 
current_line dd ?
macro_line dd ?
macro_block dd ?
macro_block_line dd ?
macro_block_line_number dd ?
macro_symbols dd ?
struc_name dd ?
struc_label dd ?
instant_macro_start dd ?
parameters_end dd ?
default_argument_value dd ?
locals_counter rb 8
current_locals_prefix dd ?
anonymous_reverse dd ?
anonymous_forward dd ?
labels_list dd ?
label_hash dd ?
label_leaf dd ?
hash_tree dd ?
addressing_space dd ?
undefined_data_start dd ?
undefined_data_end dd ?
counter dd ?
counter_limit dd ?
error_info dd ?
error_line dd ?
error dd ?
tagged_blocks dd ?
structures_buffer dd ?
number_start dd ?
current_offset dd ?
value dq ?
fp_value rd 8
adjustment dq ?
symbol_identifier dd ?
address_symbol dd ?
address_high dd ?
uncompressed_displacement dd ?
format_flags dd ?
resolver_flags dd ?
symbols_stream dd ?
number_of_relocations dd ?
number_of_sections dd ?
stub_size dd ?
stub_file dd ?
current_section dd ?
machine dw ?
subsystem dw ?
subsystem_version dd ?
image_base dd ?
image_base_high dd ?
merge_segment dd ?
resource_data dd ?
resource_size dd ?
actual_fixups_size dd ?
reserved_fixups dd ?
reserved_fixups_size dd ?
last_fixup_base dd ?
last_fixup_header dd ?
parenthesis_stack dd ?
blocks_stack dd ?
parsed_lines dd ?
logical_value_parentheses dd ?
file_extension dd ?
 
operand_size db ?
operand_flags db ?
operand_prefix db ?
rex_prefix db ?
opcode_prefix db ?
vex_required db ?
vex_register db ?
immediate_size db ?
mask_register db ?
broadcast_size db ?
rounding_mode db ?
 
base_code db ?
extended_code db ?
supplemental_code db ?
postbyte_register db ?
segment_register db ?
xop_opcode_map db ?
 
mmx_size db ?
jump_type db ?
push_size db ?
value_size db ?
address_size db ?
label_size db ?
size_declared db ?
address_size_declared db ?
displacement_compression db ?
 
value_undefined db ?
value_constant db ?
value_type db ?
value_sign db ?
fp_sign db ?
fp_format db ?
address_sign db ?
address_register db ?
compare_type db ?
logical_value_wrapping db ?
next_pass_needed db ?
output_format db ?
code_type db ?
adjustment_sign db ?
evex_mode db ?
 
macro_status db ?
skip_default_argument_value db ?
prefix_flags db ?
formatter_symbols_allowed db ?
decorator_symbols_allowed db ?
free_address_range db ?
 
characters rb 100h
converted rb 100h
message rb 180h
/programs/develop/koldbg/fasm/version.inc
0,0 → 1,39
 
; flat assembler version 1.73
; Copyright (c) 1999-2019, Tomasz Grysztar.
; All rights reserved.
;
; This programs is free for commercial and non-commercial use as long as
; the following conditions are adhered to.
;
; Redistribution and use in source and binary forms, with or without
; modification, are permitted provided that the following conditions are
; met:
;
; 1. Redistributions of source code must retain the above copyright notice,
; this list of conditions and the following disclaimer.
; 2. Redistributions in binary form must reproduce the above copyright
; notice, this list of conditions and the following disclaimer in the
; documentation and/or other materials provided with the distribution.
;
; THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
; "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
; TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
; PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR
; CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
; EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
; PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
; LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
; NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
; SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
;
; The licence and distribution terms for any publically available
; version or derivative of this code cannot be changed. i.e. this code
; cannot simply be copied and put under another distribution licence
; (including the GNU Public Licence).
 
VERSION_STRING equ "1.73.21"
 
VERSION_MAJOR = 1
VERSION_MINOR = 73
/programs/develop/koldbg/fasm/x86_64.inc
0,0 → 1,7384
 
; flat assembler core
; Copyright (c) 1999-2019, Tomasz Grysztar.
; All rights reserved.
 
simple_instruction_except64:
cmp [code_type],64
je illegal_instruction
simple_instruction:
stos byte [edi]
jmp instruction_assembled
simple_instruction_only64:
cmp [code_type],64
jne illegal_instruction
jmp simple_instruction
simple_instruction_16bit_except64:
cmp [code_type],64
je illegal_instruction
simple_instruction_16bit:
cmp [code_type],16
jne size_prefix
stos byte [edi]
jmp instruction_assembled
size_prefix:
mov ah,al
mov al,66h
stos word [edi]
jmp instruction_assembled
simple_instruction_32bit_except64:
cmp [code_type],64
je illegal_instruction
simple_instruction_32bit:
cmp [code_type],16
je size_prefix
stos byte [edi]
jmp instruction_assembled
iret_instruction:
cmp [code_type],64
jne simple_instruction
simple_instruction_64bit:
cmp [code_type],64
jne illegal_instruction
mov ah,al
mov al,48h
stos word [edi]
jmp instruction_assembled
simple_extended_instruction_64bit:
cmp [code_type],64
jne illegal_instruction
mov byte [edi],48h
inc edi
simple_extended_instruction:
mov ah,al
mov al,0Fh
stos word [edi]
jmp instruction_assembled
simple_extended_instruction_f3:
mov byte [edi],0F3h
inc edi
jmp simple_extended_instruction
prefix_instruction:
stos byte [edi]
or [prefix_flags],1
jmp continue_line
segment_prefix:
mov ah,al
shr ah,4
cmp ah,3
jne illegal_instruction
and al,1111b
mov [segment_register],al
call store_segment_prefix
or [prefix_flags],1
jmp continue_line
bnd_prefix_instruction:
stos byte [edi]
or [prefix_flags],1 + 10h
jmp continue_line
int_instruction:
lods byte [esi]
call get_size_operator
cmp ah,1
ja invalid_operand_size
cmp al,'('
jne invalid_operand
call get_byte_value
test eax,eax
jns int_imm_ok
call recoverable_overflow
int_imm_ok:
mov ah,al
mov al,0CDh
stos word [edi]
jmp instruction_assembled
aa_instruction:
cmp [code_type],64
je illegal_instruction
push eax
mov bl,10
cmp byte [esi],'('
jne aa_store
inc esi
xor al,al
xchg al,[operand_size]
cmp al,1
ja invalid_operand_size
call get_byte_value
mov bl,al
aa_store:
cmp [operand_size],0
jne invalid_operand
pop eax
mov ah,bl
stos word [edi]
jmp instruction_assembled
 
basic_instruction:
mov [base_code],al
lods byte [esi]
call get_size_operator
cmp al,10h
je basic_reg
cmp al,'['
jne invalid_operand
basic_mem:
call get_address
push edx ebx ecx
lods byte [esi]
cmp al,','
jne invalid_operand
lods byte [esi]
call get_size_operator
cmp al,'('
je basic_mem_imm
cmp al,10h
jne invalid_operand
basic_mem_reg:
lods byte [esi]
call convert_register
mov [postbyte_register],al
pop ecx ebx edx
mov al,ah
cmp al,1
je instruction_ready
call operand_autodetect
inc [base_code]
instruction_ready:
call store_instruction
jmp instruction_assembled
basic_mem_imm:
mov al,[operand_size]
cmp al,1
jb basic_mem_imm_nosize
je basic_mem_imm_8bit
cmp al,2
je basic_mem_imm_16bit
cmp al,4
je basic_mem_imm_32bit
cmp al,8
jne invalid_operand_size
basic_mem_imm_64bit:
cmp [size_declared],0
jne long_immediate_not_encodable
call operand_64bit
call get_simm32
cmp [value_type],4
jae long_immediate_not_encodable
jmp basic_mem_imm_32bit_ok
basic_mem_imm_nosize:
call recoverable_unknown_size
basic_mem_imm_8bit:
call get_byte_value
mov byte [value],al
mov al,[base_code]
shr al,3
mov [postbyte_register],al
pop ecx ebx edx
mov [base_code],80h
call store_instruction_with_imm8
jmp instruction_assembled
basic_mem_imm_16bit:
call operand_16bit
call get_word_value
mov word [value],ax
mov al,[base_code]
shr al,3
mov [postbyte_register],al
pop ecx ebx edx
cmp [value_type],0
jne basic_mem_imm_16bit_store
cmp [size_declared],0
jne basic_mem_imm_16bit_store
cmp word [value],80h
jb basic_mem_simm_8bit
cmp word [value],-80h
jae basic_mem_simm_8bit
basic_mem_imm_16bit_store:
mov [base_code],81h
call store_instruction_with_imm16
jmp instruction_assembled
basic_mem_simm_8bit:
mov [base_code],83h
call store_instruction_with_imm8
jmp instruction_assembled
basic_mem_imm_32bit:
call operand_32bit
call get_dword_value
basic_mem_imm_32bit_ok:
mov dword [value],eax
mov al,[base_code]
shr al,3
mov [postbyte_register],al
pop ecx ebx edx
cmp [value_type],0
jne basic_mem_imm_32bit_store
cmp [size_declared],0
jne basic_mem_imm_32bit_store
cmp dword [value],80h
jb basic_mem_simm_8bit
cmp dword [value],-80h
jae basic_mem_simm_8bit
basic_mem_imm_32bit_store:
mov [base_code],81h
call store_instruction_with_imm32
jmp instruction_assembled
get_simm32:
call get_qword_value
mov ecx,edx
cdq
cmp ecx,edx
jne value_out_of_range
cmp [value_type],4
jne get_simm32_ok
mov [value_type],2
get_simm32_ok:
ret
basic_reg:
lods byte [esi]
call convert_register
mov [postbyte_register],al
lods byte [esi]
cmp al,','
jne invalid_operand
lods byte [esi]
call get_size_operator
cmp al,10h
je basic_reg_reg
cmp al,'('
je basic_reg_imm
cmp al,'['
jne invalid_operand
basic_reg_mem:
call get_address
mov al,[operand_size]
cmp al,1
je basic_reg_mem_8bit
call operand_autodetect
add [base_code],3
jmp instruction_ready
basic_reg_mem_8bit:
add [base_code],2
jmp instruction_ready
basic_reg_reg:
lods byte [esi]
call convert_register
mov bl,[postbyte_register]
mov [postbyte_register],al
mov al,ah
cmp al,1
je nomem_instruction_ready
call operand_autodetect
inc [base_code]
nomem_instruction_ready:
call store_nomem_instruction
jmp instruction_assembled
basic_reg_imm:
mov al,[operand_size]
cmp al,1
je basic_reg_imm_8bit
cmp al,2
je basic_reg_imm_16bit
cmp al,4
je basic_reg_imm_32bit
cmp al,8
jne invalid_operand_size
basic_reg_imm_64bit:
cmp [size_declared],0
jne long_immediate_not_encodable
call operand_64bit
call get_simm32
cmp [value_type],4
jae long_immediate_not_encodable
jmp basic_reg_imm_32bit_ok
basic_reg_imm_8bit:
call get_byte_value
mov dl,al
mov bl,[base_code]
shr bl,3
xchg bl,[postbyte_register]
or bl,bl
jz basic_al_imm
mov [base_code],80h
call store_nomem_instruction
mov al,dl
stos byte [edi]
jmp instruction_assembled
basic_al_imm:
mov al,[base_code]
add al,4
stos byte [edi]
mov al,dl
stos byte [edi]
jmp instruction_assembled
basic_reg_imm_16bit:
call operand_16bit
call get_word_value
mov dx,ax
mov bl,[base_code]
shr bl,3
xchg bl,[postbyte_register]
cmp [value_type],0
jne basic_reg_imm_16bit_store
cmp [size_declared],0
jne basic_reg_imm_16bit_store
cmp dx,80h
jb basic_reg_simm_8bit
cmp dx,-80h
jae basic_reg_simm_8bit
basic_reg_imm_16bit_store:
or bl,bl
jz basic_ax_imm
mov [base_code],81h
call store_nomem_instruction
basic_store_imm_16bit:
mov ax,dx
call mark_relocation
stos word [edi]
jmp instruction_assembled
basic_reg_simm_8bit:
mov [base_code],83h
call store_nomem_instruction
mov al,dl
stos byte [edi]
jmp instruction_assembled
basic_ax_imm:
add [base_code],5
call store_classic_instruction_code
jmp basic_store_imm_16bit
basic_reg_imm_32bit:
call operand_32bit
call get_dword_value
basic_reg_imm_32bit_ok:
mov edx,eax
mov bl,[base_code]
shr bl,3
xchg bl,[postbyte_register]
cmp [value_type],0
jne basic_reg_imm_32bit_store
cmp [size_declared],0
jne basic_reg_imm_32bit_store
cmp edx,80h
jb basic_reg_simm_8bit
cmp edx,-80h
jae basic_reg_simm_8bit
basic_reg_imm_32bit_store:
or bl,bl
jz basic_eax_imm
mov [base_code],81h
call store_nomem_instruction
basic_store_imm_32bit:
mov eax,edx
call mark_relocation
stos dword [edi]
jmp instruction_assembled
basic_eax_imm:
add [base_code],5
call store_classic_instruction_code
jmp basic_store_imm_32bit
recoverable_unknown_size:
cmp [error_line],0
jne ignore_unknown_size
push [current_line]
pop [error_line]
mov [error],operand_size_not_specified
ignore_unknown_size:
ret
single_operand_instruction:
mov [base_code],0F6h
mov [postbyte_register],al
lods byte [esi]
call get_size_operator
cmp al,10h
je single_reg
cmp al,'['
jne invalid_operand
single_mem:
call get_address
mov al,[operand_size]
cmp al,1
je single_mem_8bit
jb single_mem_nosize
call operand_autodetect
inc [base_code]
jmp instruction_ready
single_mem_nosize:
call recoverable_unknown_size
single_mem_8bit:
jmp instruction_ready
single_reg:
lods byte [esi]
call convert_register
mov bl,al
mov al,ah
cmp al,1
je single_reg_8bit
call operand_autodetect
inc [base_code]
single_reg_8bit:
jmp nomem_instruction_ready
mov_instruction:
mov [base_code],88h
lods byte [esi]
call get_size_operator
cmp al,10h
je mov_reg
cmp al,14h
je mov_creg
cmp al,'['
jne invalid_operand
mov_mem:
call get_address
push edx ebx ecx
lods byte [esi]
cmp al,','
jne invalid_operand
lods byte [esi]
call get_size_operator
cmp al,'('
je mov_mem_imm
cmp al,10h
jne invalid_operand
mov_mem_reg:
lods byte [esi]
cmp al,30h
jb mov_mem_general_reg
cmp al,40h
jb mov_mem_sreg
mov_mem_general_reg:
call convert_register
mov [postbyte_register],al
pop ecx ebx edx
cmp ah,1
je mov_mem_reg_8bit
inc [base_code]
mov al,ah
call operand_autodetect
mov al,[postbyte_register]
or al,bl
or al,bh
jz mov_mem_ax
jmp instruction_ready
mov_mem_reg_8bit:
or al,bl
or al,bh
jnz instruction_ready
mov_mem_al:
test ch,22h
jnz mov_mem_address16_al
test ch,44h
jnz mov_mem_address32_al
test ch,88h
jnz mov_mem_address64_al
or ch,ch
jnz invalid_address_size
call check_mov_address64
cmp al,0
jg mov_mem_address64_al
jl instruction_ready
cmp [code_type],16
jne mov_mem_address32_al
cmp edx,10000h
jb mov_mem_address16_al
mov_mem_address32_al:
call store_segment_prefix_if_necessary
call address_32bit_prefix
mov [base_code],0A2h
store_mov_address32:
call store_classic_instruction_code
call store_address_32bit_value
jmp instruction_assembled
mov_mem_address16_al:
call store_segment_prefix_if_necessary
call address_16bit_prefix
mov [base_code],0A2h
store_mov_address16:
cmp [code_type],64
je invalid_address
call store_classic_instruction_code
mov eax,edx
stos word [edi]
cmp edx,10000h
jge value_out_of_range
jmp instruction_assembled
check_mov_address64:
cmp [code_type],64
jne no_address64
mov eax,[address_high]
or eax,eax
jz no_address64
bt edx,31
adc eax,0
jz address64_simm32
address64_required:
mov al,1
ret
address64_simm32:
mov al,-1
ret
no_address64:
xor al,al
ret
mov_mem_address64_al:
call store_segment_prefix_if_necessary
mov [base_code],0A2h
store_mov_address64:
call store_classic_instruction_code
call store_address_64bit_value
jmp instruction_assembled
mov_mem_ax:
test ch,22h
jnz mov_mem_address16_ax
test ch,44h
jnz mov_mem_address32_ax
test ch,88h
jnz mov_mem_address64_ax
or ch,ch
jnz invalid_address_size
call check_mov_address64
cmp al,0
jg mov_mem_address64_ax
jl instruction_ready
cmp [code_type],16
jne mov_mem_address32_ax
cmp edx,10000h
jb mov_mem_address16_ax
mov_mem_address32_ax:
call store_segment_prefix_if_necessary
call address_32bit_prefix
mov [base_code],0A3h
jmp store_mov_address32
mov_mem_address16_ax:
call store_segment_prefix_if_necessary
call address_16bit_prefix
mov [base_code],0A3h
jmp store_mov_address16
mov_mem_address64_ax:
call store_segment_prefix_if_necessary
mov [base_code],0A3h
jmp store_mov_address64
mov_mem_sreg:
sub al,31h
mov [postbyte_register],al
pop ecx ebx edx
mov ah,[operand_size]
or ah,ah
jz mov_mem_sreg_store
cmp ah,2
jne invalid_operand_size
mov_mem_sreg_store:
mov [base_code],8Ch
jmp instruction_ready
mov_mem_imm:
mov al,[operand_size]
cmp al,1
jb mov_mem_imm_nosize
je mov_mem_imm_8bit
cmp al,2
je mov_mem_imm_16bit
cmp al,4
je mov_mem_imm_32bit
cmp al,8
jne invalid_operand_size
mov_mem_imm_64bit:
cmp [size_declared],0
jne long_immediate_not_encodable
call operand_64bit
call get_simm32
cmp [value_type],4
jae long_immediate_not_encodable
jmp mov_mem_imm_32bit_store
mov_mem_imm_nosize:
call recoverable_unknown_size
mov_mem_imm_8bit:
call get_byte_value
mov byte [value],al
mov [postbyte_register],0
mov [base_code],0C6h
pop ecx ebx edx
call store_instruction_with_imm8
jmp instruction_assembled
mov_mem_imm_16bit:
call operand_16bit
call get_word_value
mov word [value],ax
mov [postbyte_register],0
mov [base_code],0C7h
pop ecx ebx edx
call store_instruction_with_imm16
jmp instruction_assembled
mov_mem_imm_32bit:
call operand_32bit
call get_dword_value
mov_mem_imm_32bit_store:
mov dword [value],eax
mov [postbyte_register],0
mov [base_code],0C7h
pop ecx ebx edx
call store_instruction_with_imm32
jmp instruction_assembled
mov_reg:
lods byte [esi]
mov ah,al
sub ah,10h
and ah,al
test ah,0F0h
jnz mov_sreg
call convert_register
mov [postbyte_register],al
lods byte [esi]
cmp al,','
jne invalid_operand
lods byte [esi]
call get_size_operator
cmp al,'['
je mov_reg_mem
cmp al,'('
je mov_reg_imm
cmp al,14h
je mov_reg_creg
cmp al,10h
jne invalid_operand
mov_reg_reg:
lods byte [esi]
mov ah,al
sub ah,10h
and ah,al
test ah,0F0h
jnz mov_reg_sreg
call convert_register
mov bl,[postbyte_register]
mov [postbyte_register],al
mov al,ah
cmp al,1
je mov_reg_reg_8bit
call operand_autodetect
inc [base_code]
mov_reg_reg_8bit:
jmp nomem_instruction_ready
mov_reg_sreg:
mov bl,[postbyte_register]
mov ah,al
and al,1111b
mov [postbyte_register],al
shr ah,4
cmp ah,3
jne invalid_operand
dec [postbyte_register]
cmp [operand_size],8
je mov_reg_sreg64
cmp [operand_size],4
je mov_reg_sreg32
cmp [operand_size],2
jne invalid_operand_size
call operand_16bit
jmp mov_reg_sreg_store
mov_reg_sreg64:
call operand_64bit
jmp mov_reg_sreg_store
mov_reg_sreg32:
call operand_32bit
mov_reg_sreg_store:
mov [base_code],8Ch
jmp nomem_instruction_ready
mov_reg_creg:
lods byte [esi]
mov bl,al
shr al,4
cmp al,4
ja invalid_operand
add al,20h
mov [extended_code],al
and bl,1111b
xchg bl,[postbyte_register]
mov [base_code],0Fh
cmp [code_type],64
je mov_reg_creg_64bit
cmp [operand_size],4
jne invalid_operand_size
cmp [postbyte_register],8
jb mov_reg_creg_store
cmp [extended_code],20h
jne mov_reg_creg_store
mov al,0F0h
stos byte [edi]
mov [postbyte_register],0
mov_reg_creg_store:
jmp nomem_instruction_ready
mov_reg_creg_64bit:
cmp [operand_size],8
jne invalid_operand_size
jmp nomem_instruction_ready
mov_reg_mem:
add [base_code],2
call get_address
mov al,[operand_size]
cmp al,1
je mov_reg_mem_8bit
inc [base_code]
call operand_autodetect
mov al,[postbyte_register]
or al,bl
or al,bh
jz mov_ax_mem
jmp instruction_ready
mov_reg_mem_8bit:
mov al,[postbyte_register]
or al,bl
or al,bh
jz mov_al_mem
jmp instruction_ready
mov_al_mem:
test ch,22h
jnz mov_al_mem_address16
test ch,44h
jnz mov_al_mem_address32
test ch,88h
jnz mov_al_mem_address64
or ch,ch
jnz invalid_address_size
call check_mov_address64
cmp al,0
jg mov_al_mem_address64
jl instruction_ready
cmp [code_type],16
jne mov_al_mem_address32
cmp edx,10000h
jb mov_al_mem_address16
mov_al_mem_address32:
call store_segment_prefix_if_necessary
call address_32bit_prefix
mov [base_code],0A0h
jmp store_mov_address32
mov_al_mem_address16:
call store_segment_prefix_if_necessary
call address_16bit_prefix
mov [base_code],0A0h
jmp store_mov_address16
mov_al_mem_address64:
call store_segment_prefix_if_necessary
mov [base_code],0A0h
jmp store_mov_address64
mov_ax_mem:
test ch,22h
jnz mov_ax_mem_address16
test ch,44h
jnz mov_ax_mem_address32
test ch,88h
jnz mov_ax_mem_address64
or ch,ch
jnz invalid_address_size
call check_mov_address64
cmp al,0
jg mov_ax_mem_address64
jl instruction_ready
cmp [code_type],16
jne mov_ax_mem_address32
cmp edx,10000h
jb mov_ax_mem_address16
mov_ax_mem_address32:
call store_segment_prefix_if_necessary
call address_32bit_prefix
mov [base_code],0A1h
jmp store_mov_address32
mov_ax_mem_address16:
call store_segment_prefix_if_necessary
call address_16bit_prefix
mov [base_code],0A1h
jmp store_mov_address16
mov_ax_mem_address64:
call store_segment_prefix_if_necessary
mov [base_code],0A1h
jmp store_mov_address64
mov_reg_imm:
mov al,[operand_size]
cmp al,1
je mov_reg_imm_8bit
cmp al,2
je mov_reg_imm_16bit
cmp al,4
je mov_reg_imm_32bit
cmp al,8
jne invalid_operand_size
mov_reg_imm_64bit:
call operand_64bit
call get_qword_value
mov ecx,edx
cmp [size_declared],0
jne mov_reg_imm_64bit_store
cmp [value_type],4
jae mov_reg_imm_64bit_store
cdq
cmp ecx,edx
je mov_reg_64bit_imm_32bit
mov_reg_imm_64bit_store:
push eax ecx
mov al,0B8h
call store_mov_reg_imm_code
pop edx eax
call mark_relocation
stos dword [edi]
mov eax,edx
stos dword [edi]
jmp instruction_assembled
mov_reg_imm_8bit:
call get_byte_value
mov dl,al
mov al,0B0h
call store_mov_reg_imm_code
mov al,dl
stos byte [edi]
jmp instruction_assembled
mov_reg_imm_16bit:
call get_word_value
mov dx,ax
call operand_16bit
mov al,0B8h
call store_mov_reg_imm_code
mov ax,dx
call mark_relocation
stos word [edi]
jmp instruction_assembled
mov_reg_imm_32bit:
call operand_32bit
call get_dword_value
mov edx,eax
mov al,0B8h
call store_mov_reg_imm_code
mov_store_imm_32bit:
mov eax,edx
call mark_relocation
stos dword [edi]
jmp instruction_assembled
store_mov_reg_imm_code:
mov ah,[postbyte_register]
test ah,1000b
jz mov_reg_imm_prefix_ok
or [rex_prefix],41h
mov_reg_imm_prefix_ok:
and ah,111b
add al,ah
mov [base_code],al
call store_classic_instruction_code
ret
mov_reg_64bit_imm_32bit:
mov edx,eax
mov bl,[postbyte_register]
mov [postbyte_register],0
mov [base_code],0C7h
call store_nomem_instruction
jmp mov_store_imm_32bit
mov_sreg:
mov ah,al
and al,1111b
mov [postbyte_register],al
shr ah,4
cmp ah,3
jne invalid_operand
cmp al,2
je illegal_instruction
dec [postbyte_register]
lods byte [esi]
cmp al,','
jne invalid_operand
lods byte [esi]
call get_size_operator
cmp al,'['
je mov_sreg_mem
cmp al,10h
jne invalid_operand
mov_sreg_reg:
lods byte [esi]
call convert_register
or ah,ah
jz mov_sreg_reg_size_ok
cmp ah,2
jne invalid_operand_size
mov bl,al
mov_sreg_reg_size_ok:
mov [base_code],8Eh
jmp nomem_instruction_ready
mov_sreg_mem:
call get_address
mov al,[operand_size]
or al,al
jz mov_sreg_mem_size_ok
cmp al,2
jne invalid_operand_size
mov_sreg_mem_size_ok:
mov [base_code],8Eh
jmp instruction_ready
mov_creg:
lods byte [esi]
mov ah,al
shr ah,4
cmp ah,4
ja invalid_operand
add ah,22h
mov [extended_code],ah
and al,1111b
mov [postbyte_register],al
mov [base_code],0Fh
lods byte [esi]
cmp al,','
jne invalid_operand
call take_register
mov bl,al
cmp [code_type],64
je mov_creg_64bit
cmp ah,4
jne invalid_operand_size
cmp [postbyte_register],8
jb mov_creg_store
cmp [extended_code],22h
jne mov_creg_store
mov al,0F0h
stos byte [edi]
mov [postbyte_register],0
mov_creg_store:
jmp nomem_instruction_ready
mov_creg_64bit:
cmp ah,8
je mov_creg_store
jmp invalid_operand_size
test_instruction:
mov [base_code],84h
lods byte [esi]
call get_size_operator
cmp al,10h
je test_reg
cmp al,'['
jne invalid_operand
test_mem:
call get_address
push edx ebx ecx
lods byte [esi]
cmp al,','
jne invalid_operand
lods byte [esi]
call get_size_operator
cmp al,'('
je test_mem_imm
cmp al,10h
jne invalid_operand
test_mem_reg:
lods byte [esi]
call convert_register
mov [postbyte_register],al
pop ecx ebx edx
mov al,ah
cmp al,1
je test_mem_reg_8bit
call operand_autodetect
inc [base_code]
test_mem_reg_8bit:
jmp instruction_ready
test_mem_imm:
mov al,[operand_size]
cmp al,1
jb test_mem_imm_nosize
je test_mem_imm_8bit
cmp al,2
je test_mem_imm_16bit
cmp al,4
je test_mem_imm_32bit
cmp al,8
jne invalid_operand_size
test_mem_imm_64bit:
cmp [size_declared],0
jne long_immediate_not_encodable
call operand_64bit
call get_simm32
cmp [value_type],4
jae long_immediate_not_encodable
jmp test_mem_imm_32bit_store
test_mem_imm_nosize:
call recoverable_unknown_size
test_mem_imm_8bit:
call get_byte_value
mov byte [value],al
mov [postbyte_register],0
mov [base_code],0F6h
pop ecx ebx edx
call store_instruction_with_imm8
jmp instruction_assembled
test_mem_imm_16bit:
call operand_16bit
call get_word_value
mov word [value],ax
mov [postbyte_register],0
mov [base_code],0F7h
pop ecx ebx edx
call store_instruction_with_imm16
jmp instruction_assembled
test_mem_imm_32bit:
call operand_32bit
call get_dword_value
test_mem_imm_32bit_store:
mov dword [value],eax
mov [postbyte_register],0
mov [base_code],0F7h
pop ecx ebx edx
call store_instruction_with_imm32
jmp instruction_assembled
test_reg:
lods byte [esi]
call convert_register
mov [postbyte_register],al
lods byte [esi]
cmp al,','
jne invalid_operand
lods byte [esi]
call get_size_operator
cmp al,'['
je test_reg_mem
cmp al,'('
je test_reg_imm
cmp al,10h
jne invalid_operand
test_reg_reg:
lods byte [esi]
call convert_register
mov bl,[postbyte_register]
mov [postbyte_register],al
mov al,ah
cmp al,1
je test_reg_reg_8bit
call operand_autodetect
inc [base_code]
test_reg_reg_8bit:
jmp nomem_instruction_ready
test_reg_imm:
mov al,[operand_size]
cmp al,1
je test_reg_imm_8bit
cmp al,2
je test_reg_imm_16bit
cmp al,4
je test_reg_imm_32bit
cmp al,8
jne invalid_operand_size
test_reg_imm_64bit:
cmp [size_declared],0
jne long_immediate_not_encodable
call operand_64bit
call get_simm32
cmp [value_type],4
jae long_immediate_not_encodable
jmp test_reg_imm_32bit_store
test_reg_imm_8bit:
call get_byte_value
mov dl,al
mov bl,[postbyte_register]
mov [postbyte_register],0
mov [base_code],0F6h
or bl,bl
jz test_al_imm
call store_nomem_instruction
mov al,dl
stos byte [edi]
jmp instruction_assembled
test_al_imm:
mov [base_code],0A8h
call store_classic_instruction_code
mov al,dl
stos byte [edi]
jmp instruction_assembled
test_reg_imm_16bit:
call operand_16bit
call get_word_value
mov dx,ax
mov bl,[postbyte_register]
mov [postbyte_register],0
mov [base_code],0F7h
or bl,bl
jz test_ax_imm
call store_nomem_instruction
mov ax,dx
call mark_relocation
stos word [edi]
jmp instruction_assembled
test_ax_imm:
mov [base_code],0A9h
call store_classic_instruction_code
mov ax,dx
stos word [edi]
jmp instruction_assembled
test_reg_imm_32bit:
call operand_32bit
call get_dword_value
test_reg_imm_32bit_store:
mov edx,eax
mov bl,[postbyte_register]
mov [postbyte_register],0
mov [base_code],0F7h
or bl,bl
jz test_eax_imm
call store_nomem_instruction
mov eax,edx
call mark_relocation
stos dword [edi]
jmp instruction_assembled
test_eax_imm:
mov [base_code],0A9h
call store_classic_instruction_code
mov eax,edx
stos dword [edi]
jmp instruction_assembled
test_reg_mem:
call get_address
mov al,[operand_size]
cmp al,1
je test_reg_mem_8bit
call operand_autodetect
inc [base_code]
test_reg_mem_8bit:
jmp instruction_ready
xchg_instruction:
mov [base_code],86h
lods byte [esi]
call get_size_operator
cmp al,10h
je xchg_reg
cmp al,'['
jne invalid_operand
xchg_mem:
call get_address
push edx ebx ecx
lods byte [esi]
cmp al,','
jne invalid_operand
lods byte [esi]
call get_size_operator
cmp al,10h
je test_mem_reg
jmp invalid_operand
xchg_reg:
lods byte [esi]
call convert_register
mov [postbyte_register],al
lods byte [esi]
cmp al,','
jne invalid_operand
lods byte [esi]
call get_size_operator
cmp al,'['
je test_reg_mem
cmp al,10h
jne invalid_operand
xchg_reg_reg:
lods byte [esi]
call convert_register
mov bl,al
mov al,ah
cmp al,1
je xchg_reg_reg_8bit
call operand_autodetect
cmp [postbyte_register],0
je xchg_ax_reg
or bl,bl
jnz xchg_reg_reg_store
mov bl,[postbyte_register]
xchg_ax_reg:
cmp [code_type],64
jne xchg_ax_reg_ok
cmp ah,4
jne xchg_ax_reg_ok
or bl,bl
jz xchg_reg_reg_store
xchg_ax_reg_ok:
test bl,1000b
jz xchg_ax_reg_store
or [rex_prefix],41h
and bl,111b
xchg_ax_reg_store:
add bl,90h
mov [base_code],bl
call store_classic_instruction_code
jmp instruction_assembled
xchg_reg_reg_store:
inc [base_code]
xchg_reg_reg_8bit:
jmp nomem_instruction_ready
push_instruction:
mov [push_size],al
push_next:
lods byte [esi]
call get_size_operator
cmp al,10h
je push_reg
cmp al,'('
je push_imm
cmp al,'['
jne invalid_operand
push_mem:
call get_address
mov al,[operand_size]
mov ah,[push_size]
cmp al,2
je push_mem_16bit
cmp al,4
je push_mem_32bit
cmp al,8
je push_mem_64bit
or al,al
jnz invalid_operand_size
cmp ah,2
je push_mem_16bit
cmp ah,4
je push_mem_32bit
cmp ah,8
je push_mem_64bit
call recoverable_unknown_size
jmp push_mem_store
push_mem_16bit:
test ah,not 2
jnz invalid_operand_size
call operand_16bit
jmp push_mem_store
push_mem_32bit:
test ah,not 4
jnz invalid_operand_size
cmp [code_type],64
je illegal_instruction
call operand_32bit
jmp push_mem_store
push_mem_64bit:
test ah,not 8
jnz invalid_operand_size
cmp [code_type],64
jne illegal_instruction
push_mem_store:
mov [base_code],0FFh
mov [postbyte_register],110b
call store_instruction
jmp push_done
push_reg:
lods byte [esi]
mov ah,al
sub ah,10h
and ah,al
test ah,0F0h
jnz push_sreg
call convert_register
test al,1000b
jz push_reg_ok
or [rex_prefix],41h
and al,111b
push_reg_ok:
add al,50h
mov [base_code],al
mov al,ah
mov ah,[push_size]
cmp al,2
je push_reg_16bit
cmp al,4
je push_reg_32bit
cmp al,8
jne invalid_operand_size
push_reg_64bit:
test ah,not 8
jnz invalid_operand_size
cmp [code_type],64
jne illegal_instruction
jmp push_reg_store
push_reg_32bit:
test ah,not 4
jnz invalid_operand_size
cmp [code_type],64
je illegal_instruction
call operand_32bit
jmp push_reg_store
push_reg_16bit:
test ah,not 2
jnz invalid_operand_size
call operand_16bit
push_reg_store:
call store_classic_instruction_code
jmp push_done
push_sreg:
mov bl,al
mov dl,[operand_size]
mov dh,[push_size]
cmp dl,2
je push_sreg16
cmp dl,4
je push_sreg32
cmp dl,8
je push_sreg64
or dl,dl
jnz invalid_operand_size
cmp dh,2
je push_sreg16
cmp dh,4
je push_sreg32
cmp dh,8
je push_sreg64
jmp push_sreg_store
push_sreg16:
test dh,not 2
jnz invalid_operand_size
call operand_16bit
jmp push_sreg_store
push_sreg32:
test dh,not 4
jnz invalid_operand_size
cmp [code_type],64
je illegal_instruction
call operand_32bit
jmp push_sreg_store
push_sreg64:
test dh,not 8
jnz invalid_operand_size
cmp [code_type],64
jne illegal_instruction
push_sreg_store:
mov al,bl
cmp al,40h
jae invalid_operand
sub al,31h
jc invalid_operand
cmp al,4
jae push_sreg_386
shl al,3
add al,6
mov [base_code],al
cmp [code_type],64
je illegal_instruction
jmp push_reg_store
push_sreg_386:
sub al,4
shl al,3
add al,0A0h
mov [extended_code],al
mov [base_code],0Fh
jmp push_reg_store
push_imm:
mov al,[operand_size]
mov ah,[push_size]
or al,al
je push_imm_size_ok
or ah,ah
je push_imm_size_ok
cmp al,ah
jne invalid_operand_size
push_imm_size_ok:
cmp al,2
je push_imm_16bit
cmp al,4
je push_imm_32bit
cmp al,8
je push_imm_64bit
cmp ah,2
je push_imm_optimized_16bit
cmp ah,4
je push_imm_optimized_32bit
cmp ah,8
je push_imm_optimized_64bit
or al,al
jnz invalid_operand_size
cmp [code_type],16
je push_imm_optimized_16bit
cmp [code_type],32
je push_imm_optimized_32bit
push_imm_optimized_64bit:
cmp [code_type],64
jne illegal_instruction
call get_simm32
mov edx,eax
cmp [value_type],0
jne push_imm_32bit_store
cmp eax,-80h
jl push_imm_32bit_store
cmp eax,80h
jge push_imm_32bit_store
jmp push_imm_8bit
push_imm_optimized_32bit:
cmp [code_type],64
je illegal_instruction
call get_dword_value
mov edx,eax
call operand_32bit
cmp [value_type],0
jne push_imm_32bit_store
cmp eax,-80h
jl push_imm_32bit_store
cmp eax,80h
jge push_imm_32bit_store
jmp push_imm_8bit
push_imm_optimized_16bit:
call get_word_value
mov dx,ax
call operand_16bit
cmp [value_type],0
jne push_imm_16bit_store
cmp ax,-80h
jl push_imm_16bit_store
cmp ax,80h
jge push_imm_16bit_store
push_imm_8bit:
mov ah,al
mov [base_code],6Ah
call store_classic_instruction_code
mov al,ah
stos byte [edi]
jmp push_done
push_imm_16bit:
call get_word_value
mov dx,ax
call operand_16bit
push_imm_16bit_store:
mov [base_code],68h
call store_classic_instruction_code
mov ax,dx
call mark_relocation
stos word [edi]
jmp push_done
push_imm_64bit:
cmp [code_type],64
jne illegal_instruction
call get_simm32
mov edx,eax
jmp push_imm_32bit_store
push_imm_32bit:
cmp [code_type],64
je illegal_instruction
call get_dword_value
mov edx,eax
call operand_32bit
push_imm_32bit_store:
mov [base_code],68h
call store_classic_instruction_code
mov eax,edx
call mark_relocation
stos dword [edi]
push_done:
lods byte [esi]
dec esi
cmp al,0Fh
je instruction_assembled
or al,al
jz instruction_assembled
; mov [operand_size],0
; mov [operand_flags],0
; mov [operand_prefix],0
; mov [rex_prefix],0
and dword [operand_size],0
jmp push_next
pop_instruction:
mov [push_size],al
pop_next:
lods byte [esi]
call get_size_operator
cmp al,10h
je pop_reg
cmp al,'['
jne invalid_operand
pop_mem:
call get_address
mov al,[operand_size]
mov ah,[push_size]
cmp al,2
je pop_mem_16bit
cmp al,4
je pop_mem_32bit
cmp al,8
je pop_mem_64bit
or al,al
jnz invalid_operand_size
cmp ah,2
je pop_mem_16bit
cmp ah,4
je pop_mem_32bit
cmp ah,8
je pop_mem_64bit
call recoverable_unknown_size
jmp pop_mem_store
pop_mem_16bit:
test ah,not 2
jnz invalid_operand_size
call operand_16bit
jmp pop_mem_store
pop_mem_32bit:
test ah,not 4
jnz invalid_operand_size
cmp [code_type],64
je illegal_instruction
call operand_32bit
jmp pop_mem_store
pop_mem_64bit:
test ah,not 8
jnz invalid_operand_size
cmp [code_type],64
jne illegal_instruction
pop_mem_store:
mov [base_code],08Fh
mov [postbyte_register],0
call store_instruction
jmp pop_done
pop_reg:
lods byte [esi]
mov ah,al
sub ah,10h
and ah,al
test ah,0F0h
jnz pop_sreg
call convert_register
test al,1000b
jz pop_reg_ok
or [rex_prefix],41h
and al,111b
pop_reg_ok:
add al,58h
mov [base_code],al
mov al,ah
mov ah,[push_size]
cmp al,2
je pop_reg_16bit
cmp al,4
je pop_reg_32bit
cmp al,8
je pop_reg_64bit
jmp invalid_operand_size
pop_reg_64bit:
test ah,not 8
jnz invalid_operand_size
cmp [code_type],64
jne illegal_instruction
jmp pop_reg_store
pop_reg_32bit:
test ah,not 4
jnz invalid_operand_size
cmp [code_type],64
je illegal_instruction
call operand_32bit
jmp pop_reg_store
pop_reg_16bit:
test ah,not 2
jnz invalid_operand_size
call operand_16bit
pop_reg_store:
call store_classic_instruction_code
pop_done:
lods byte [esi]
dec esi
cmp al,0Fh
je instruction_assembled
or al,al
jz instruction_assembled
; mov [operand_size],0
; mov [operand_flags],0
; mov [operand_prefix],0
; mov [rex_prefix],0
and dword [operand_size],0
jmp pop_next
pop_sreg:
mov dl,[operand_size]
mov dh,[push_size]
cmp al,32h
je pop_cs
mov bl,al
cmp dl,2
je pop_sreg16
cmp dl,4
je pop_sreg32
cmp dl,8
je pop_sreg64
or dl,dl
jnz invalid_operand_size
cmp dh,2
je pop_sreg16
cmp dh,4
je pop_sreg32
cmp dh,8
je pop_sreg64
jmp pop_sreg_store
pop_sreg16:
test dh,not 2
jnz invalid_operand_size
call operand_16bit
jmp pop_sreg_store
pop_sreg32:
test dh,not 4
jnz invalid_operand_size
cmp [code_type],64
je illegal_instruction
call operand_32bit
jmp pop_sreg_store
pop_sreg64:
test dh,not 8
jnz invalid_operand_size
cmp [code_type],64
jne illegal_instruction
pop_sreg_store:
mov al,bl
cmp al,40h
jae invalid_operand
sub al,31h
jc invalid_operand
cmp al,4
jae pop_sreg_386
shl al,3
add al,7
mov [base_code],al
cmp [code_type],64
je illegal_instruction
jmp pop_reg_store
pop_cs:
cmp [code_type],16
jne illegal_instruction
cmp dl,2
je pop_cs_store
or dl,dl
jnz invalid_operand_size
cmp dh,2
je pop_cs_store
or dh,dh
jnz illegal_instruction
pop_cs_store:
test dh,not 2
jnz invalid_operand_size
mov al,0Fh
stos byte [edi]
jmp pop_done
pop_sreg_386:
sub al,4
shl al,3
add al,0A1h
mov [extended_code],al
mov [base_code],0Fh
jmp pop_reg_store
inc_instruction:
mov [base_code],al
lods byte [esi]
call get_size_operator
cmp al,10h
je inc_reg
cmp al,'['
je inc_mem
jne invalid_operand
inc_mem:
call get_address
mov al,[operand_size]
cmp al,1
je inc_mem_8bit
jb inc_mem_nosize
call operand_autodetect
mov al,0FFh
xchg al,[base_code]
mov [postbyte_register],al
jmp instruction_ready
inc_mem_nosize:
call recoverable_unknown_size
inc_mem_8bit:
mov al,0FEh
xchg al,[base_code]
mov [postbyte_register],al
jmp instruction_ready
inc_reg:
lods byte [esi]
call convert_register
mov bl,al
mov al,0FEh
xchg al,[base_code]
mov [postbyte_register],al
mov al,ah
cmp al,1
je inc_reg_8bit
call operand_autodetect
cmp [code_type],64
je inc_reg_long_form
mov al,[postbyte_register]
shl al,3
add al,bl
add al,40h
mov [base_code],al
call store_classic_instruction_code
jmp instruction_assembled
inc_reg_long_form:
inc [base_code]
inc_reg_8bit:
jmp nomem_instruction_ready
set_instruction:
mov [base_code],0Fh
mov [extended_code],al
lods byte [esi]
call get_size_operator
cmp al,10h
je set_reg
cmp al,'['
jne invalid_operand
set_mem:
call get_address
cmp [operand_size],1
ja invalid_operand_size
mov [postbyte_register],0
jmp instruction_ready
set_reg:
lods byte [esi]
call convert_register
cmp ah,1
jne invalid_operand_size
mov bl,al
mov [postbyte_register],0
jmp nomem_instruction_ready
arpl_instruction:
cmp [code_type],64
je illegal_instruction
mov [base_code],63h
lods byte [esi]
call get_size_operator
cmp al,10h
je arpl_reg
cmp al,'['
jne invalid_operand
call get_address
lods byte [esi]
cmp al,','
jne invalid_operand
call take_register
mov [postbyte_register],al
cmp ah,2
jne invalid_operand_size
jmp instruction_ready
arpl_reg:
lods byte [esi]
call convert_register
cmp ah,2
jne invalid_operand_size
mov bl,al
lods byte [esi]
cmp al,','
jne invalid_operand
call take_register
mov [postbyte_register],al
jmp nomem_instruction_ready
bound_instruction:
cmp [code_type],64
je illegal_instruction
call take_register
mov [postbyte_register],al
lods byte [esi]
cmp al,','
jne invalid_operand
lods byte [esi]
call get_size_operator
cmp al,'['
jne invalid_operand
call get_address
mov al,[operand_size]
cmp al,2
je bound_store
cmp al,4
jne invalid_operand_size
bound_store:
call operand_autodetect
mov [base_code],62h
jmp instruction_ready
enter_instruction:
lods byte [esi]
call get_size_operator
cmp ah,2
je enter_imm16_size_ok
or ah,ah
jnz invalid_operand_size
enter_imm16_size_ok:
cmp al,'('
jne invalid_operand
call get_word_value
cmp [next_pass_needed],0
jne enter_imm16_ok
cmp [value_type],0
jne invalid_use_of_symbol
test eax,eax
js value_out_of_range
enter_imm16_ok:
push eax
mov [operand_size],0
lods byte [esi]
cmp al,','
jne invalid_operand
lods byte [esi]
call get_size_operator
cmp ah,1
je enter_imm8_size_ok
or ah,ah
jnz invalid_operand_size
enter_imm8_size_ok:
cmp al,'('
jne invalid_operand
call get_byte_value
cmp [next_pass_needed],0
jne enter_imm8_ok
test eax,eax
js value_out_of_range
enter_imm8_ok:
mov dl,al
pop ebx
mov al,0C8h
stos byte [edi]
mov ax,bx
stos word [edi]
mov al,dl
stos byte [edi]
jmp instruction_assembled
ret_instruction_only64:
cmp [code_type],64
jne illegal_instruction
jmp ret_instruction
ret_instruction_32bit_except64:
cmp [code_type],64
je illegal_instruction
ret_instruction_32bit:
call operand_32bit
jmp ret_instruction
ret_instruction_16bit:
call operand_16bit
jmp ret_instruction
ret_instruction_64bit:
call operand_64bit
ret_instruction:
and [prefix_flags],not 10h
ret_common:
mov [base_code],al
lods byte [esi]
dec esi
or al,al
jz simple_ret
cmp al,0Fh
je simple_ret
lods byte [esi]
call get_size_operator
or ah,ah
jz ret_imm
cmp ah,2
je ret_imm
jmp invalid_operand_size
ret_imm:
cmp al,'('
jne invalid_operand
call get_word_value
cmp [next_pass_needed],0
jne ret_imm_ok
cmp [value_type],0
jne invalid_use_of_symbol
test eax,eax
js value_out_of_range
ret_imm_ok:
cmp [size_declared],0
jne ret_imm_store
or ax,ax
jz simple_ret
ret_imm_store:
mov dx,ax
call store_classic_instruction_code
mov ax,dx
stos word [edi]
jmp instruction_assembled
simple_ret:
inc [base_code]
call store_classic_instruction_code
jmp instruction_assembled
retf_instruction:
cmp [code_type],64
jne ret_common
retf_instruction_64bit:
call operand_64bit
jmp ret_common
retf_instruction_32bit:
call operand_32bit
jmp ret_common
retf_instruction_16bit:
call operand_16bit
jmp ret_common
lea_instruction:
mov [base_code],8Dh
call take_register
mov [postbyte_register],al
lods byte [esi]
cmp al,','
jne invalid_operand
xor al,al
xchg al,[operand_size]
push eax
lods byte [esi]
call get_size_operator
cmp al,'['
jne invalid_operand
or [operand_flags],1
call get_address
pop eax
mov [operand_size],al
call operand_autodetect
jmp instruction_ready
ls_instruction:
or al,al
jz les_instruction
cmp al,3
jz lds_instruction
add al,0B0h
mov [extended_code],al
mov [base_code],0Fh
jmp ls_code_ok
les_instruction:
mov [base_code],0C4h
jmp ls_short_code
lds_instruction:
mov [base_code],0C5h
ls_short_code:
cmp [code_type],64
je illegal_instruction
ls_code_ok:
call take_register
mov [postbyte_register],al
lods byte [esi]
cmp al,','
jne invalid_operand
add [operand_size],2
lods byte [esi]
call get_size_operator
cmp al,'['
jne invalid_operand
call get_address
mov al,[operand_size]
cmp al,4
je ls_16bit
cmp al,6
je ls_32bit
cmp al,10
je ls_64bit
jmp invalid_operand_size
ls_16bit:
call operand_16bit
jmp instruction_ready
ls_32bit:
call operand_32bit
jmp instruction_ready
ls_64bit:
call operand_64bit
jmp instruction_ready
sh_instruction:
mov [postbyte_register],al
lods byte [esi]
call get_size_operator
cmp al,10h
je sh_reg
cmp al,'['
jne invalid_operand
sh_mem:
call get_address
push edx ebx ecx
mov al,[operand_size]
push eax
mov [operand_size],0
lods byte [esi]
cmp al,','
jne invalid_operand
lods byte [esi]
call get_size_operator
cmp al,'('
je sh_mem_imm
cmp al,10h
jne invalid_operand
sh_mem_reg:
lods byte [esi]
cmp al,11h
jne invalid_operand
pop eax ecx ebx edx
cmp al,1
je sh_mem_cl_8bit
jb sh_mem_cl_nosize
call operand_autodetect
mov [base_code],0D3h
jmp instruction_ready
sh_mem_cl_nosize:
call recoverable_unknown_size
sh_mem_cl_8bit:
mov [base_code],0D2h
jmp instruction_ready
sh_mem_imm:
mov al,[operand_size]
or al,al
jz sh_mem_imm_size_ok
cmp al,1
jne invalid_operand_size
sh_mem_imm_size_ok:
call get_byte_value
mov byte [value],al
pop eax ecx ebx edx
cmp al,1
je sh_mem_imm_8bit
jb sh_mem_imm_nosize
call operand_autodetect
cmp byte [value],1
je sh_mem_1
mov [base_code],0C1h
call store_instruction_with_imm8
jmp instruction_assembled
sh_mem_1:
mov [base_code],0D1h
jmp instruction_ready
sh_mem_imm_nosize:
call recoverable_unknown_size
sh_mem_imm_8bit:
cmp byte [value],1
je sh_mem_1_8bit
mov [base_code],0C0h
call store_instruction_with_imm8
jmp instruction_assembled
sh_mem_1_8bit:
mov [base_code],0D0h
jmp instruction_ready
sh_reg:
lods byte [esi]
call convert_register
mov bx,ax
mov [operand_size],0
lods byte [esi]
cmp al,','
jne invalid_operand
lods byte [esi]
call get_size_operator
cmp al,'('
je sh_reg_imm
cmp al,10h
jne invalid_operand
sh_reg_reg:
lods byte [esi]
cmp al,11h
jne invalid_operand
mov al,bh
cmp al,1
je sh_reg_cl_8bit
call operand_autodetect
mov [base_code],0D3h
jmp nomem_instruction_ready
sh_reg_cl_8bit:
mov [base_code],0D2h
jmp nomem_instruction_ready
sh_reg_imm:
mov al,[operand_size]
or al,al
jz sh_reg_imm_size_ok
cmp al,1
jne invalid_operand_size
sh_reg_imm_size_ok:
push ebx
call get_byte_value
mov dl,al
pop ebx
mov al,bh
cmp al,1
je sh_reg_imm_8bit
call operand_autodetect
cmp dl,1
je sh_reg_1
mov [base_code],0C1h
call store_nomem_instruction
mov al,dl
stos byte [edi]
jmp instruction_assembled
sh_reg_1:
mov [base_code],0D1h
jmp nomem_instruction_ready
sh_reg_imm_8bit:
cmp dl,1
je sh_reg_1_8bit
mov [base_code],0C0h
call store_nomem_instruction
mov al,dl
stos byte [edi]
jmp instruction_assembled
sh_reg_1_8bit:
mov [base_code],0D0h
jmp nomem_instruction_ready
shd_instruction:
mov [base_code],0Fh
mov [extended_code],al
lods byte [esi]
call get_size_operator
cmp al,10h
je shd_reg
cmp al,'['
jne invalid_operand
shd_mem:
call get_address
push edx ebx ecx
lods byte [esi]
cmp al,','
jne invalid_operand
call take_register
mov [postbyte_register],al
lods byte [esi]
cmp al,','
jne invalid_operand
mov al,ah
mov [operand_size],0
push eax
lods byte [esi]
call get_size_operator
cmp al,'('
je shd_mem_reg_imm
cmp al,10h
jne invalid_operand
lods byte [esi]
cmp al,11h
jne invalid_operand
pop eax ecx ebx edx
call operand_autodetect
inc [extended_code]
jmp instruction_ready
shd_mem_reg_imm:
mov al,[operand_size]
or al,al
jz shd_mem_reg_imm_size_ok
cmp al,1
jne invalid_operand_size
shd_mem_reg_imm_size_ok:
call get_byte_value
mov byte [value],al
pop eax ecx ebx edx
call operand_autodetect
call store_instruction_with_imm8
jmp instruction_assembled
shd_reg:
lods byte [esi]
call convert_register
mov [postbyte_register],al
lods byte [esi]
cmp al,','
jne invalid_operand
call take_register
mov bl,[postbyte_register]
mov [postbyte_register],al
mov al,ah
push eax ebx
lods byte [esi]
cmp al,','
jne invalid_operand
mov [operand_size],0
lods byte [esi]
call get_size_operator
cmp al,'('
je shd_reg_reg_imm
cmp al,10h
jne invalid_operand
lods byte [esi]
cmp al,11h
jne invalid_operand
pop ebx eax
call operand_autodetect
inc [extended_code]
jmp nomem_instruction_ready
shd_reg_reg_imm:
mov al,[operand_size]
or al,al
jz shd_reg_reg_imm_size_ok
cmp al,1
jne invalid_operand_size
shd_reg_reg_imm_size_ok:
call get_byte_value
mov dl,al
pop ebx eax
call operand_autodetect
call store_nomem_instruction
mov al,dl
stos byte [edi]
jmp instruction_assembled
movx_instruction:
mov [base_code],0Fh
mov [extended_code],al
call take_register
mov [postbyte_register],al
mov al,ah
push eax
lods byte [esi]
cmp al,','
jne invalid_operand
mov [operand_size],0
lods byte [esi]
call get_size_operator
cmp al,10h
je movx_reg
cmp al,'['
jne invalid_operand
call get_address
pop eax
mov ah,[operand_size]
or ah,ah
jz movx_unknown_size
cmp ah,al
jae invalid_operand_size
cmp ah,1
je movx_mem_store
cmp ah,2
jne invalid_operand_size
inc [extended_code]
movx_mem_store:
call operand_autodetect
jmp instruction_ready
movx_unknown_size:
cmp al,2
je movx_mem_store
call recoverable_unknown_size
jmp movx_mem_store
movx_reg:
lods byte [esi]
call convert_register
pop ebx
xchg bl,al
cmp ah,al
jae invalid_operand_size
cmp ah,1
je movx_reg_8bit
cmp ah,2
je movx_reg_16bit
jmp invalid_operand_size
movx_reg_8bit:
call operand_autodetect
jmp nomem_instruction_ready
movx_reg_16bit:
call operand_autodetect
inc [extended_code]
jmp nomem_instruction_ready
movsxd_instruction:
mov [base_code],al
call take_register
mov [postbyte_register],al
cmp ah,8
jne invalid_operand_size
lods byte [esi]
cmp al,','
jne invalid_operand
mov [operand_size],0
lods byte [esi]
call get_size_operator
cmp al,10h
je movsxd_reg
cmp al,'['
jne invalid_operand
call get_address
cmp [operand_size],4
je movsxd_mem_store
cmp [operand_size],0
jne invalid_operand_size
movsxd_mem_store:
call operand_64bit
jmp instruction_ready
movsxd_reg:
lods byte [esi]
call convert_register
cmp ah,4
jne invalid_operand_size
mov bl,al
call operand_64bit
jmp nomem_instruction_ready
bt_instruction:
mov [postbyte_register],al
shl al,3
add al,83h
mov [extended_code],al
mov [base_code],0Fh
lods byte [esi]
call get_size_operator
cmp al,10h
je bt_reg
cmp al,'['
jne invalid_operand
call get_address
push eax ebx ecx
lods byte [esi]
cmp al,','
jne invalid_operand
cmp byte [esi],'('
je bt_mem_imm
cmp byte [esi],11h
jne bt_mem_reg
cmp byte [esi+2],'('
je bt_mem_imm
bt_mem_reg:
call take_register
mov [postbyte_register],al
pop ecx ebx edx
mov al,ah
call operand_autodetect
jmp instruction_ready
bt_mem_imm:
xor al,al
xchg al,[operand_size]
push eax
lods byte [esi]
call get_size_operator
cmp al,'('
jne invalid_operand
mov al,[operand_size]
or al,al
jz bt_mem_imm_size_ok
cmp al,1
jne invalid_operand_size
bt_mem_imm_size_ok:
call get_byte_value
mov byte [value],al
pop eax
or al,al
jz bt_mem_imm_nosize
call operand_autodetect
bt_mem_imm_store:
pop ecx ebx edx
mov [extended_code],0BAh
call store_instruction_with_imm8
jmp instruction_assembled
bt_mem_imm_nosize:
call recoverable_unknown_size
jmp bt_mem_imm_store
bt_reg:
lods byte [esi]
call convert_register
mov bl,al
lods byte [esi]
cmp al,','
jne invalid_operand
cmp byte [esi],'('
je bt_reg_imm
cmp byte [esi],11h
jne bt_reg_reg
cmp byte [esi+2],'('
je bt_reg_imm
bt_reg_reg:
call take_register
mov [postbyte_register],al
mov al,ah
call operand_autodetect
jmp nomem_instruction_ready
bt_reg_imm:
xor al,al
xchg al,[operand_size]
push eax ebx
lods byte [esi]
call get_size_operator
cmp al,'('
jne invalid_operand
mov al,[operand_size]
or al,al
jz bt_reg_imm_size_ok
cmp al,1
jne invalid_operand_size
bt_reg_imm_size_ok:
call get_byte_value
mov byte [value],al
pop ebx eax
call operand_autodetect
bt_reg_imm_store:
mov [extended_code],0BAh
call store_nomem_instruction
mov al,byte [value]
stos byte [edi]
jmp instruction_assembled
bs_instruction:
mov [extended_code],al
mov [base_code],0Fh
call get_reg_mem
jc bs_reg_reg
mov al,[operand_size]
call operand_autodetect
jmp instruction_ready
bs_reg_reg:
mov al,ah
call operand_autodetect
jmp nomem_instruction_ready
get_reg_mem:
call take_register
mov [postbyte_register],al
lods byte [esi]
cmp al,','
jne invalid_operand
lods byte [esi]
call get_size_operator
cmp al,10h
je get_reg_reg
cmp al,'['
jne invalid_argument
call get_address
clc
ret
get_reg_reg:
lods byte [esi]
call convert_register
mov bl,al
stc
ret
ud_instruction:
mov [extended_code],al
mov [base_code],0Fh
call get_reg_mem
jc ud_reg_reg
cmp [operand_size],4
jne invalid_operand_size
jmp instruction_ready
ud_reg_reg:
cmp ah,4
jne invalid_operand_size
jmp nomem_instruction_ready
 
imul_instruction:
mov [base_code],0F6h
mov [postbyte_register],5
lods byte [esi]
call get_size_operator
cmp al,10h
je imul_reg
cmp al,'['
jne invalid_operand
imul_mem:
call get_address
mov al,[operand_size]
cmp al,1
je imul_mem_8bit
jb imul_mem_nosize
call operand_autodetect
inc [base_code]
jmp instruction_ready
imul_mem_nosize:
call recoverable_unknown_size
imul_mem_8bit:
jmp instruction_ready
imul_reg:
lods byte [esi]
call convert_register
cmp byte [esi],','
je imul_reg_
mov bl,al
mov al,ah
cmp al,1
je imul_reg_8bit
call operand_autodetect
inc [base_code]
imul_reg_8bit:
jmp nomem_instruction_ready
imul_reg_:
mov [postbyte_register],al
inc esi
cmp byte [esi],'('
je imul_reg_imm
cmp byte [esi],11h
jne imul_reg_noimm
cmp byte [esi+2],'('
je imul_reg_imm
imul_reg_noimm:
lods byte [esi]
call get_size_operator
cmp al,10h
je imul_reg_reg
cmp al,'['
jne invalid_operand
imul_reg_mem:
call get_address
push edx ebx ecx
cmp byte [esi],','
je imul_reg_mem_imm
mov al,[operand_size]
call operand_autodetect
pop ecx ebx edx
mov [base_code],0Fh
mov [extended_code],0AFh
jmp instruction_ready
imul_reg_mem_imm:
inc esi
lods byte [esi]
call get_size_operator
cmp al,'('
jne invalid_operand
mov al,[operand_size]
cmp al,2
je imul_reg_mem_imm_16bit
cmp al,4
je imul_reg_mem_imm_32bit
cmp al,8
jne invalid_operand_size
imul_reg_mem_imm_64bit:
cmp [size_declared],0
jne long_immediate_not_encodable
call operand_64bit
call get_simm32
cmp [value_type],4
jae long_immediate_not_encodable
jmp imul_reg_mem_imm_32bit_ok
imul_reg_mem_imm_16bit:
call operand_16bit
call get_word_value
mov word [value],ax
cmp [value_type],0
jne imul_reg_mem_imm_16bit_store
cmp [size_declared],0
jne imul_reg_mem_imm_16bit_store
cmp ax,-80h
jl imul_reg_mem_imm_16bit_store
cmp ax,80h
jl imul_reg_mem_imm_8bit_store
imul_reg_mem_imm_16bit_store:
pop ecx ebx edx
mov [base_code],69h
call store_instruction_with_imm16
jmp instruction_assembled
imul_reg_mem_imm_32bit:
call operand_32bit
call get_dword_value
imul_reg_mem_imm_32bit_ok:
mov dword [value],eax
cmp [value_type],0
jne imul_reg_mem_imm_32bit_store
cmp [size_declared],0
jne imul_reg_mem_imm_32bit_store
cmp eax,-80h
jl imul_reg_mem_imm_32bit_store
cmp eax,80h
jl imul_reg_mem_imm_8bit_store
imul_reg_mem_imm_32bit_store:
pop ecx ebx edx
mov [base_code],69h
call store_instruction_with_imm32
jmp instruction_assembled
imul_reg_mem_imm_8bit_store:
pop ecx ebx edx
mov [base_code],6Bh
call store_instruction_with_imm8
jmp instruction_assembled
imul_reg_imm:
mov bl,[postbyte_register]
dec esi
jmp imul_reg_reg_imm
imul_reg_reg:
lods byte [esi]
call convert_register
mov bl,al
cmp byte [esi],','
je imul_reg_reg_imm
mov al,ah
call operand_autodetect
mov [base_code],0Fh
mov [extended_code],0AFh
jmp nomem_instruction_ready
imul_reg_reg_imm:
inc esi
lods byte [esi]
call get_size_operator
cmp al,'('
jne invalid_operand
mov al,[operand_size]
cmp al,2
je imul_reg_reg_imm_16bit
cmp al,4
je imul_reg_reg_imm_32bit
cmp al,8
jne invalid_operand_size
imul_reg_reg_imm_64bit:
cmp [size_declared],0
jne long_immediate_not_encodable
call operand_64bit
push ebx
call get_simm32
cmp [value_type],4
jae long_immediate_not_encodable
jmp imul_reg_reg_imm_32bit_ok
imul_reg_reg_imm_16bit:
call operand_16bit
push ebx
call get_word_value
pop ebx
mov dx,ax
cmp [value_type],0
jne imul_reg_reg_imm_16bit_store
cmp [size_declared],0
jne imul_reg_reg_imm_16bit_store
cmp ax,-80h
jl imul_reg_reg_imm_16bit_store
cmp ax,80h
jl imul_reg_reg_imm_8bit_store
imul_reg_reg_imm_16bit_store:
mov [base_code],69h
call store_nomem_instruction
mov ax,dx
call mark_relocation
stos word [edi]
jmp instruction_assembled
imul_reg_reg_imm_32bit:
call operand_32bit
push ebx
call get_dword_value
imul_reg_reg_imm_32bit_ok:
pop ebx
mov edx,eax
cmp [value_type],0
jne imul_reg_reg_imm_32bit_store
cmp [size_declared],0
jne imul_reg_reg_imm_32bit_store
cmp eax,-80h
jl imul_reg_reg_imm_32bit_store
cmp eax,80h
jl imul_reg_reg_imm_8bit_store
imul_reg_reg_imm_32bit_store:
mov [base_code],69h
call store_nomem_instruction
mov eax,edx
call mark_relocation
stos dword [edi]
jmp instruction_assembled
imul_reg_reg_imm_8bit_store:
mov [base_code],6Bh
call store_nomem_instruction
mov al,dl
stos byte [edi]
jmp instruction_assembled
in_instruction:
call take_register
or al,al
jnz invalid_operand
lods byte [esi]
cmp al,','
jne invalid_operand
mov al,ah
push eax
mov [operand_size],0
lods byte [esi]
call get_size_operator
cmp al,'('
je in_imm
cmp al,10h
je in_reg
jmp invalid_operand
in_reg:
lods byte [esi]
cmp al,22h
jne invalid_operand
pop eax
cmp al,1
je in_al_dx
cmp al,2
je in_ax_dx
cmp al,4
jne invalid_operand_size
in_ax_dx:
call operand_autodetect
mov [base_code],0EDh
call store_classic_instruction_code
jmp instruction_assembled
in_al_dx:
mov al,0ECh
stos byte [edi]
jmp instruction_assembled
in_imm:
mov al,[operand_size]
or al,al
jz in_imm_size_ok
cmp al,1
jne invalid_operand_size
in_imm_size_ok:
call get_byte_value
mov dl,al
pop eax
cmp al,1
je in_al_imm
cmp al,2
je in_ax_imm
cmp al,4
jne invalid_operand_size
in_ax_imm:
call operand_autodetect
mov [base_code],0E5h
call store_classic_instruction_code
mov al,dl
stos byte [edi]
jmp instruction_assembled
in_al_imm:
mov al,0E4h
stos byte [edi]
mov al,dl
stos byte [edi]
jmp instruction_assembled
out_instruction:
lods byte [esi]
call get_size_operator
cmp al,'('
je out_imm
cmp al,10h
jne invalid_operand
lods byte [esi]
cmp al,22h
jne invalid_operand
lods byte [esi]
cmp al,','
jne invalid_operand
mov [operand_size],0
call take_register
or al,al
jnz invalid_operand
mov al,ah
cmp al,1
je out_dx_al
cmp al,2
je out_dx_ax
cmp al,4
jne invalid_operand_size
out_dx_ax:
call operand_autodetect
mov [base_code],0EFh
call store_classic_instruction_code
jmp instruction_assembled
out_dx_al:
mov al,0EEh
stos byte [edi]
jmp instruction_assembled
out_imm:
mov al,[operand_size]
or al,al
jz out_imm_size_ok
cmp al,1
jne invalid_operand_size
out_imm_size_ok:
call get_byte_value
mov dl,al
lods byte [esi]
cmp al,','
jne invalid_operand
mov [operand_size],0
call take_register
or al,al
jnz invalid_operand
mov al,ah
cmp al,1
je out_imm_al
cmp al,2
je out_imm_ax
cmp al,4
jne invalid_operand_size
out_imm_ax:
call operand_autodetect
mov [base_code],0E7h
call store_classic_instruction_code
mov al,dl
stos byte [edi]
jmp instruction_assembled
out_imm_al:
mov al,0E6h
stos byte [edi]
mov al,dl
stos byte [edi]
jmp instruction_assembled
 
call_instruction:
mov [postbyte_register],10b
mov [base_code],0E8h
mov [extended_code],9Ah
jmp process_jmp
jmp_instruction:
mov [postbyte_register],100b
mov [base_code],0E9h
mov [extended_code],0EAh
process_jmp:
lods byte [esi]
call get_jump_operator
test [prefix_flags],10h
jz jmp_type_ok
test [jump_type],not 2
jnz illegal_instruction
mov [jump_type],2
and [prefix_flags],not 10h
jmp_type_ok:
call get_size_operator
cmp al,'('
je jmp_imm
mov [base_code],0FFh
cmp al,10h
je jmp_reg
cmp al,'['
jne invalid_operand
jmp_mem:
cmp [jump_type],1
je illegal_instruction
call get_address
mov edx,eax
mov al,[operand_size]
or al,al
jz jmp_mem_size_not_specified
cmp al,2
je jmp_mem_16bit
cmp al,4
je jmp_mem_32bit
cmp al,6
je jmp_mem_48bit
cmp al,8
je jmp_mem_64bit
cmp al,10
je jmp_mem_80bit
jmp invalid_operand_size
jmp_mem_size_not_specified:
cmp [jump_type],3
je jmp_mem_far
cmp [jump_type],2
je jmp_mem_near
call recoverable_unknown_size
jmp_mem_near:
cmp [code_type],16
je jmp_mem_16bit
cmp [code_type],32
je jmp_mem_near_32bit
jmp_mem_64bit:
cmp [jump_type],3
je invalid_operand_size
cmp [code_type],64
jne illegal_instruction
jmp instruction_ready
jmp_mem_far:
cmp [code_type],16
je jmp_mem_far_32bit
jmp_mem_48bit:
call operand_32bit
jmp_mem_far_store:
cmp [jump_type],2
je invalid_operand_size
inc [postbyte_register]
jmp instruction_ready
jmp_mem_80bit:
call operand_64bit
jmp jmp_mem_far_store
jmp_mem_far_32bit:
call operand_16bit
jmp jmp_mem_far_store
jmp_mem_32bit:
cmp [jump_type],3
je jmp_mem_far_32bit
cmp [jump_type],2
je jmp_mem_near_32bit
cmp [code_type],16
je jmp_mem_far_32bit
jmp_mem_near_32bit:
cmp [code_type],64
je illegal_instruction
call operand_32bit
jmp instruction_ready
jmp_mem_16bit:
cmp [jump_type],3
je invalid_operand_size
call operand_16bit
jmp instruction_ready
jmp_reg:
test [jump_type],1
jnz invalid_operand
lods byte [esi]
call convert_register
mov bl,al
mov al,ah
cmp al,2
je jmp_reg_16bit
cmp al,4
je jmp_reg_32bit
cmp al,8
jne invalid_operand_size
jmp_reg_64bit:
cmp [code_type],64
jne illegal_instruction
jmp nomem_instruction_ready
jmp_reg_32bit:
cmp [code_type],64
je illegal_instruction
call operand_32bit
jmp nomem_instruction_ready
jmp_reg_16bit:
call operand_16bit
jmp nomem_instruction_ready
jmp_imm:
cmp byte [esi],'.'
je invalid_value
mov ebx,esi
dec esi
call skip_symbol
xchg esi,ebx
cmp byte [ebx],':'
je jmp_far
cmp [jump_type],3
je invalid_operand
jmp_near:
mov al,[operand_size]
cmp al,2
je jmp_imm_16bit
cmp al,4
je jmp_imm_32bit
cmp al,8
je jmp_imm_64bit
or al,al
jnz invalid_operand_size
cmp [code_type],16
je jmp_imm_16bit
cmp [code_type],64
je jmp_imm_64bit
jmp_imm_32bit:
cmp [code_type],64
je invalid_operand_size
call get_address_dword_value
cmp [code_type],16
jne jmp_imm_32bit_prefix_ok
mov byte [edi],66h
inc edi
jmp_imm_32bit_prefix_ok:
call calculate_jump_offset
cdq
call check_for_short_jump
jc jmp_short
jmp_imm_32bit_store:
mov edx,eax
sub edx,3
jno jmp_imm_32bit_ok
cmp [code_type],64
je jump_out_of_range
jmp_imm_32bit_ok:
mov al,[base_code]
stos byte [edi]
mov eax,edx
call mark_relocation
stos dword [edi]
jmp instruction_assembled
jmp_imm_64bit:
cmp [code_type],64
jne invalid_operand_size
call get_address_qword_value
call calculate_jump_offset
mov ecx,edx
cdq
cmp edx,ecx
jne jump_out_of_range
call check_for_short_jump
jnc jmp_imm_32bit_store
jmp_short:
mov ah,al
mov al,0EBh
stos word [edi]
jmp instruction_assembled
jmp_imm_16bit:
call get_address_word_value
cmp [code_type],16
je jmp_imm_16bit_prefix_ok
mov byte [edi],66h
inc edi
jmp_imm_16bit_prefix_ok:
call calculate_jump_offset
cwde
cdq
call check_for_short_jump
jc jmp_short
cmp [value_type],0
jne invalid_use_of_symbol
mov edx,eax
dec edx
mov al,[base_code]
stos byte [edi]
mov eax,edx
stos word [edi]
jmp instruction_assembled
calculate_jump_offset:
add edi,2
mov ebp,[addressing_space]
call calculate_relative_offset
sub edi,2
ret
check_for_short_jump:
cmp [jump_type],1
je forced_short
ja no_short_jump
cmp [base_code],0E8h
je no_short_jump
cmp [value_type],0
jne no_short_jump
cmp eax,80h
jb short_jump
cmp eax,-80h
jae short_jump
no_short_jump:
clc
ret
forced_short:
cmp [base_code],0E8h
je illegal_instruction
cmp [next_pass_needed],0
jne jmp_short_value_type_ok
cmp [value_type],0
jne invalid_use_of_symbol
jmp_short_value_type_ok:
cmp eax,-80h
jae short_jump
cmp eax,80h
jae jump_out_of_range
short_jump:
stc
ret
jump_out_of_range:
cmp [error_line],0
jne instruction_assembled
mov eax,[current_line]
mov [error_line],eax
mov [error],relative_jump_out_of_range
jmp instruction_assembled
jmp_far:
cmp [jump_type],2
je invalid_operand
cmp [code_type],64
je illegal_instruction
mov al,[extended_code]
mov [base_code],al
call get_word_value
push eax
inc esi
lods byte [esi]
cmp al,'('
jne invalid_operand
mov al,[value_type]
push eax [symbol_identifier]
cmp byte [esi],'.'
je invalid_value
mov al,[operand_size]
cmp al,4
je jmp_far_16bit
cmp al,6
je jmp_far_32bit
or al,al
jnz invalid_operand_size
cmp [code_type],16
jne jmp_far_32bit
jmp_far_16bit:
call get_word_value
mov ebx,eax
call operand_16bit
call store_classic_instruction_code
mov ax,bx
call mark_relocation
stos word [edi]
jmp_far_segment:
pop [symbol_identifier] eax
mov [value_type],al
pop eax
call mark_relocation
stos word [edi]
jmp instruction_assembled
jmp_far_32bit:
call get_dword_value
mov ebx,eax
call operand_32bit
call store_classic_instruction_code
mov eax,ebx
call mark_relocation
stos dword [edi]
jmp jmp_far_segment
conditional_jump:
mov [base_code],al
and [prefix_flags],not 10h
lods byte [esi]
call get_jump_operator
cmp [jump_type],3
je invalid_operand
call get_size_operator
cmp al,'('
jne invalid_operand
cmp byte [esi],'.'
je invalid_value
mov al,[operand_size]
cmp al,2
je conditional_jump_16bit
cmp al,4
je conditional_jump_32bit
cmp al,8
je conditional_jump_64bit
or al,al
jnz invalid_operand_size
cmp [code_type],16
je conditional_jump_16bit
cmp [code_type],64
je conditional_jump_64bit
conditional_jump_32bit:
cmp [code_type],64
je invalid_operand_size
call get_address_dword_value
cmp [code_type],16
jne conditional_jump_32bit_prefix_ok
mov byte [edi],66h
inc edi
conditional_jump_32bit_prefix_ok:
call calculate_jump_offset
cdq
call check_for_short_jump
jc conditional_jump_short
conditional_jump_32bit_store:
mov edx,eax
sub edx,4
jno conditional_jump_32bit_range_ok
cmp [code_type],64
je jump_out_of_range
conditional_jump_32bit_range_ok:
mov ah,[base_code]
add ah,10h
mov al,0Fh
stos word [edi]
mov eax,edx
call mark_relocation
stos dword [edi]
jmp instruction_assembled
conditional_jump_64bit:
cmp [code_type],64
jne invalid_operand_size
call get_address_qword_value
call calculate_jump_offset
mov ecx,edx
cdq
cmp edx,ecx
jne jump_out_of_range
call check_for_short_jump
jnc conditional_jump_32bit_store
conditional_jump_short:
mov ah,al
mov al,[base_code]
stos word [edi]
jmp instruction_assembled
conditional_jump_16bit:
call get_address_word_value
cmp [code_type],16
je conditional_jump_16bit_prefix_ok
mov byte [edi],66h
inc edi
conditional_jump_16bit_prefix_ok:
call calculate_jump_offset
cwde
cdq
call check_for_short_jump
jc conditional_jump_short
cmp [value_type],0
jne invalid_use_of_symbol
mov edx,eax
sub dx,2
mov ah,[base_code]
add ah,10h
mov al,0Fh
stos word [edi]
mov eax,edx
stos word [edi]
jmp instruction_assembled
loop_instruction_16bit:
cmp [code_type],64
je illegal_instruction
cmp [code_type],16
je loop_instruction
mov [operand_prefix],67h
jmp loop_instruction
loop_instruction_32bit:
cmp [code_type],32
je loop_instruction
mov [operand_prefix],67h
jmp loop_instruction
loop_instruction_64bit:
cmp [code_type],64
jne illegal_instruction
loop_instruction:
mov [base_code],al
lods byte [esi]
call get_jump_operator
cmp [jump_type],1
ja invalid_operand
call get_size_operator
cmp al,'('
jne invalid_operand
cmp byte [esi],'.'
je invalid_value
mov al,[operand_size]
cmp al,2
je loop_jump_16bit
cmp al,4
je loop_jump_32bit
cmp al,8
je loop_jump_64bit
or al,al
jnz invalid_operand_size
cmp [code_type],16
je loop_jump_16bit
cmp [code_type],64
je loop_jump_64bit
loop_jump_32bit:
cmp [code_type],64
je invalid_operand_size
call get_address_dword_value
cmp [code_type],16
jne loop_jump_32bit_prefix_ok
mov byte [edi],66h
inc edi
loop_jump_32bit_prefix_ok:
call loop_counter_size
call calculate_jump_offset
cdq
make_loop_jump:
call check_for_short_jump
jc conditional_jump_short
scas word [edi]
jmp jump_out_of_range
loop_counter_size:
cmp [operand_prefix],0
je loop_counter_size_ok
push eax
mov al,[operand_prefix]
stos byte [edi]
pop eax
loop_counter_size_ok:
ret
loop_jump_64bit:
cmp [code_type],64
jne invalid_operand_size
call get_address_qword_value
call loop_counter_size
call calculate_jump_offset
mov ecx,edx
cdq
cmp edx,ecx
jne jump_out_of_range
jmp make_loop_jump
loop_jump_16bit:
call get_address_word_value
cmp [code_type],16
je loop_jump_16bit_prefix_ok
mov byte [edi],66h
inc edi
loop_jump_16bit_prefix_ok:
call loop_counter_size
call calculate_jump_offset
cwde
cdq
jmp make_loop_jump
 
movs_instruction:
lods byte [esi]
call get_size_operator
cmp al,'['
jne invalid_operand
call get_address
or eax,eax
jnz invalid_address
or bl,ch
jnz invalid_address
cmp [segment_register],1
ja invalid_address
push ebx
lods byte [esi]
cmp al,','
jne invalid_operand
lods byte [esi]
call get_size_operator
cmp al,'['
jne invalid_operand
call get_address
pop edx
or eax,eax
jnz invalid_address
or bl,ch
jnz invalid_address
mov al,dh
mov ah,bh
shr al,4
shr ah,4
cmp al,ah
jne address_sizes_do_not_agree
and bh,111b
and dh,111b
cmp bh,6
jne invalid_address
cmp dh,7
jne invalid_address
cmp al,2
je movs_address_16bit
cmp al,4
je movs_address_32bit
cmp [code_type],64
jne invalid_address_size
jmp movs_store
movs_address_32bit:
call address_32bit_prefix
jmp movs_store
movs_address_16bit:
cmp [code_type],64
je invalid_address_size
call address_16bit_prefix
movs_store:
xor ebx,ebx
call store_segment_prefix_if_necessary
mov al,0A4h
movs_check_size:
mov bl,[operand_size]
cmp bl,1
je simple_instruction
inc al
cmp bl,2
je simple_instruction_16bit
cmp bl,4
je simple_instruction_32bit
cmp bl,8
je simple_instruction_64bit
or bl,bl
jnz invalid_operand_size
call recoverable_unknown_size
jmp simple_instruction
lods_instruction:
lods byte [esi]
call get_size_operator
cmp al,'['
jne invalid_operand
call get_address
or eax,eax
jnz invalid_address
or bl,ch
jnz invalid_address
cmp bh,26h
je lods_address_16bit
cmp bh,46h
je lods_address_32bit
cmp bh,86h
jne invalid_address
cmp [code_type],64
jne invalid_address_size
jmp lods_store
lods_address_32bit:
call address_32bit_prefix
jmp lods_store
lods_address_16bit:
cmp [code_type],64
je invalid_address_size
call address_16bit_prefix
lods_store:
xor ebx,ebx
call store_segment_prefix_if_necessary
mov al,0ACh
jmp movs_check_size
stos_instruction:
mov [base_code],al
lods byte [esi]
call get_size_operator
cmp al,'['
jne invalid_operand
call get_address
or eax,eax
jnz invalid_address
or bl,ch
jnz invalid_address
cmp bh,27h
je stos_address_16bit
cmp bh,47h
je stos_address_32bit
cmp bh,87h
jne invalid_address
cmp [code_type],64
jne invalid_address_size
jmp stos_store
stos_address_32bit:
call address_32bit_prefix
jmp stos_store
stos_address_16bit:
cmp [code_type],64
je invalid_address_size
call address_16bit_prefix
stos_store:
cmp [segment_register],1
ja invalid_address
mov al,[base_code]
jmp movs_check_size
cmps_instruction:
lods byte [esi]
call get_size_operator
cmp al,'['
jne invalid_operand
call get_address
or eax,eax
jnz invalid_address
or bl,ch
jnz invalid_address
mov al,[segment_register]
push eax ebx
lods byte [esi]
cmp al,','
jne invalid_operand
lods byte [esi]
call get_size_operator
cmp al,'['
jne invalid_operand
call get_address
or eax,eax
jnz invalid_address
or bl,ch
jnz invalid_address
pop edx eax
cmp [segment_register],1
ja invalid_address
mov [segment_register],al
mov al,dh
mov ah,bh
shr al,4
shr ah,4
cmp al,ah
jne address_sizes_do_not_agree
and bh,111b
and dh,111b
cmp bh,7
jne invalid_address
cmp dh,6
jne invalid_address
cmp al,2
je cmps_address_16bit
cmp al,4
je cmps_address_32bit
cmp [code_type],64
jne invalid_address_size
jmp cmps_store
cmps_address_32bit:
call address_32bit_prefix
jmp cmps_store
cmps_address_16bit:
cmp [code_type],64
je invalid_address_size
call address_16bit_prefix
cmps_store:
xor ebx,ebx
call store_segment_prefix_if_necessary
mov al,0A6h
jmp movs_check_size
ins_instruction:
lods byte [esi]
call get_size_operator
cmp al,'['
jne invalid_operand
call get_address
or eax,eax
jnz invalid_address
or bl,ch
jnz invalid_address
cmp bh,27h
je ins_address_16bit
cmp bh,47h
je ins_address_32bit
cmp bh,87h
jne invalid_address
cmp [code_type],64
jne invalid_address_size
jmp ins_store
ins_address_32bit:
call address_32bit_prefix
jmp ins_store
ins_address_16bit:
cmp [code_type],64
je invalid_address_size
call address_16bit_prefix
ins_store:
cmp [segment_register],1
ja invalid_address
lods byte [esi]
cmp al,','
jne invalid_operand
lods byte [esi]
cmp al,10h
jne invalid_operand
lods byte [esi]
cmp al,22h
jne invalid_operand
mov al,6Ch
ins_check_size:
cmp [operand_size],8
jne movs_check_size
jmp invalid_operand_size
outs_instruction:
lods byte [esi]
cmp al,10h
jne invalid_operand
lods byte [esi]
cmp al,22h
jne invalid_operand
lods byte [esi]
cmp al,','
jne invalid_operand
lods byte [esi]
call get_size_operator
cmp al,'['
jne invalid_operand
call get_address
or eax,eax
jnz invalid_address
or bl,ch
jnz invalid_address
cmp bh,26h
je outs_address_16bit
cmp bh,46h
je outs_address_32bit
cmp bh,86h
jne invalid_address
cmp [code_type],64
jne invalid_address_size
jmp outs_store
outs_address_32bit:
call address_32bit_prefix
jmp outs_store
outs_address_16bit:
cmp [code_type],64
je invalid_address_size
call address_16bit_prefix
outs_store:
xor ebx,ebx
call store_segment_prefix_if_necessary
mov al,6Eh
jmp ins_check_size
xlat_instruction:
lods byte [esi]
call get_size_operator
cmp al,'['
jne invalid_operand
call get_address
or eax,eax
jnz invalid_address
or bl,ch
jnz invalid_address
cmp bh,23h
je xlat_address_16bit
cmp bh,43h
je xlat_address_32bit
cmp bh,83h
jne invalid_address
cmp [code_type],64
jne invalid_address_size
jmp xlat_store
xlat_address_32bit:
call address_32bit_prefix
jmp xlat_store
xlat_address_16bit:
cmp [code_type],64
je invalid_address_size
call address_16bit_prefix
xlat_store:
call store_segment_prefix_if_necessary
mov al,0D7h
cmp [operand_size],1
jbe simple_instruction
jmp invalid_operand_size
 
pm_word_instruction:
mov ah,al
shr ah,4
and al,111b
mov [base_code],0Fh
mov [extended_code],ah
mov [postbyte_register],al
lods byte [esi]
call get_size_operator
cmp al,10h
je pm_reg
pm_mem:
cmp al,'['
jne invalid_operand
call get_address
mov al,[operand_size]
cmp al,2
je pm_mem_store
or al,al
jnz invalid_operand_size
pm_mem_store:
jmp instruction_ready
pm_reg:
lods byte [esi]
call convert_register
mov bl,al
cmp ah,2
jne invalid_operand_size
jmp nomem_instruction_ready
pm_store_word_instruction:
mov ah,al
shr ah,4
and al,111b
mov [base_code],0Fh
mov [extended_code],ah
mov [postbyte_register],al
lods byte [esi]
call get_size_operator
cmp al,10h
jne pm_mem
lods byte [esi]
call convert_register
mov bl,al
mov al,ah
call operand_autodetect
jmp nomem_instruction_ready
lgdt_instruction:
mov [base_code],0Fh
mov [extended_code],1
mov [postbyte_register],al
lods byte [esi]
call get_size_operator
cmp al,'['
jne invalid_operand
call get_address
mov al,[operand_size]
cmp al,6
je lgdt_mem_48bit
cmp al,10
je lgdt_mem_80bit
or al,al
jnz invalid_operand_size
jmp lgdt_mem_store
lgdt_mem_80bit:
cmp [code_type],64
jne illegal_instruction
jmp lgdt_mem_store
lgdt_mem_48bit:
cmp [code_type],64
je illegal_instruction
cmp [postbyte_register],2
jb lgdt_mem_store
call operand_32bit
lgdt_mem_store:
jmp instruction_ready
lar_instruction:
mov [extended_code],al
mov [base_code],0Fh
call take_register
mov [postbyte_register],al
lods byte [esi]
cmp al,','
jne invalid_operand
xor al,al
xchg al,[operand_size]
call operand_autodetect
lods byte [esi]
call get_size_operator
cmp al,10h
je lar_reg_reg
cmp al,'['
jne invalid_operand
call get_address
mov al,[operand_size]
or al,al
jz lar_reg_mem
cmp al,2
jne invalid_operand_size
lar_reg_mem:
jmp instruction_ready
lar_reg_reg:
lods byte [esi]
call convert_register
cmp ah,2
jne invalid_operand_size
mov bl,al
jmp nomem_instruction_ready
invlpg_instruction:
mov [base_code],0Fh
mov [extended_code],1
mov [postbyte_register],7
lods byte [esi]
call get_size_operator
cmp al,'['
jne invalid_operand
call get_address
jmp instruction_ready
mcommit_instruction:
mov byte [edi],0F3h
inc edi
jmp simple_instruction_0f_01
swapgs_instruction:
cmp [code_type],64
jne illegal_instruction
simple_instruction_0f_01:
mov ah,al
mov al,0Fh
stos byte [edi]
mov al,1
stos word [edi]
jmp instruction_assembled
 
basic_486_instruction:
mov [base_code],0Fh
mov [extended_code],al
lods byte [esi]
call get_size_operator
cmp al,10h
je basic_486_reg
cmp al,'['
jne invalid_operand
call get_address
push edx ebx ecx
lods byte [esi]
cmp al,','
jne invalid_operand
call take_register
mov [postbyte_register],al
pop ecx ebx edx
mov al,ah
cmp al,1
je basic_486_mem_reg_8bit
call operand_autodetect
inc [extended_code]
basic_486_mem_reg_8bit:
jmp instruction_ready
basic_486_reg:
lods byte [esi]
call convert_register
mov [postbyte_register],al
lods byte [esi]
cmp al,','
jne invalid_operand
call take_register
mov bl,al
xchg bl,[postbyte_register]
mov al,ah
cmp al,1
je basic_486_reg_reg_8bit
call operand_autodetect
inc [extended_code]
basic_486_reg_reg_8bit:
jmp nomem_instruction_ready
bswap_instruction:
call take_register
test al,1000b
jz bswap_reg_code_ok
or [rex_prefix],41h
and al,111b
bswap_reg_code_ok:
add al,0C8h
mov [extended_code],al
mov [base_code],0Fh
cmp ah,8
je bswap_reg64
cmp ah,4
jne invalid_operand_size
call operand_32bit
call store_classic_instruction_code
jmp instruction_assembled
bswap_reg64:
call operand_64bit
call store_classic_instruction_code
jmp instruction_assembled
cmpxchgx_instruction:
mov [base_code],0Fh
mov [extended_code],0C7h
mov [postbyte_register],al
lods byte [esi]
call get_size_operator
cmp al,'['
jne invalid_operand
call get_address
mov ah,1
xchg [postbyte_register],ah
mov al,[operand_size]
or al,al
jz cmpxchgx_size_ok
cmp al,ah
jne invalid_operand_size
cmpxchgx_size_ok:
cmp ah,16
jne cmpxchgx_store
call operand_64bit
cmpxchgx_store:
jmp instruction_ready
nop_instruction:
mov ah,[esi]
cmp ah,10h
je extended_nop
cmp ah,11h
je extended_nop
cmp ah,'['
je extended_nop
stos byte [edi]
jmp instruction_assembled
extended_nop:
mov [base_code],0Fh
mov [extended_code],1Fh
mov [postbyte_register],0
lods byte [esi]
call get_size_operator
cmp al,10h
je extended_nop_reg
cmp al,'['
jne invalid_operand
call get_address
mov al,[operand_size]
or al,al
jz extended_nop_store
call operand_autodetect
extended_nop_store:
jmp instruction_ready
extended_nop_reg:
lods byte [esi]
call convert_register
mov bl,al
mov al,ah
call operand_autodetect
jmp nomem_instruction_ready
 
basic_fpu_instruction:
mov [postbyte_register],al
mov [base_code],0D8h
lods byte [esi]
call get_size_operator
cmp al,10h
je basic_fpu_streg
cmp al,'['
je basic_fpu_mem
dec esi
mov ah,[postbyte_register]
cmp ah,2
jb invalid_operand
cmp ah,3
ja invalid_operand
mov bl,1
jmp nomem_instruction_ready
basic_fpu_mem:
call get_address
mov al,[operand_size]
cmp al,4
je basic_fpu_mem_32bit
cmp al,8
je basic_fpu_mem_64bit
or al,al
jnz invalid_operand_size
call recoverable_unknown_size
basic_fpu_mem_32bit:
jmp instruction_ready
basic_fpu_mem_64bit:
mov [base_code],0DCh
jmp instruction_ready
basic_fpu_streg:
lods byte [esi]
call convert_fpu_register
mov bl,al
mov ah,[postbyte_register]
cmp ah,2
je basic_fpu_single_streg
cmp ah,3
je basic_fpu_single_streg
or al,al
jz basic_fpu_st0
test ah,110b
jz basic_fpu_streg_st0
xor [postbyte_register],1
basic_fpu_streg_st0:
lods byte [esi]
cmp al,','
jne invalid_operand
lods byte [esi]
call get_size_operator
cmp al,10h
jne invalid_operand
lods byte [esi]
call convert_fpu_register
or al,al
jnz invalid_operand
mov [base_code],0DCh
jmp nomem_instruction_ready
basic_fpu_st0:
lods byte [esi]
cmp al,','
jne invalid_operand
lods byte [esi]
call get_size_operator
cmp al,10h
jne invalid_operand
lods byte [esi]
call convert_fpu_register
mov bl,al
basic_fpu_single_streg:
mov [base_code],0D8h
jmp nomem_instruction_ready
simple_fpu_instruction:
mov ah,al
or ah,11000000b
mov al,0D9h
stos word [edi]
jmp instruction_assembled
fi_instruction:
mov [postbyte_register],al
lods byte [esi]
call get_size_operator
cmp al,'['
jne invalid_operand
call get_address
mov al,[operand_size]
cmp al,2
je fi_mem_16bit
cmp al,4
je fi_mem_32bit
or al,al
jnz invalid_operand_size
call recoverable_unknown_size
fi_mem_32bit:
mov [base_code],0DAh
jmp instruction_ready
fi_mem_16bit:
mov [base_code],0DEh
jmp instruction_ready
fld_instruction:
mov [postbyte_register],al
lods byte [esi]
call get_size_operator
cmp al,10h
je fld_streg
cmp al,'['
jne invalid_operand
call get_address
mov al,[operand_size]
cmp al,4
je fld_mem_32bit
cmp al,8
je fld_mem_64bit
cmp al,10
je fld_mem_80bit
or al,al
jnz invalid_operand_size
call recoverable_unknown_size
fld_mem_32bit:
mov [base_code],0D9h
jmp instruction_ready
fld_mem_64bit:
mov [base_code],0DDh
jmp instruction_ready
fld_mem_80bit:
mov al,[postbyte_register]
cmp al,0
je fld_mem_80bit_store
dec [postbyte_register]
cmp al,3
je fld_mem_80bit_store
jmp invalid_operand_size
fld_mem_80bit_store:
add [postbyte_register],5
mov [base_code],0DBh
jmp instruction_ready
fld_streg:
lods byte [esi]
call convert_fpu_register
mov bl,al
cmp [postbyte_register],2
jae fst_streg
mov [base_code],0D9h
jmp nomem_instruction_ready
fst_streg:
mov [base_code],0DDh
jmp nomem_instruction_ready
fild_instruction:
mov [postbyte_register],al
lods byte [esi]
call get_size_operator
cmp al,'['
jne invalid_operand
call get_address
mov al,[operand_size]
cmp al,2
je fild_mem_16bit
cmp al,4
je fild_mem_32bit
cmp al,8
je fild_mem_64bit
or al,al
jnz invalid_operand_size
call recoverable_unknown_size
fild_mem_32bit:
mov [base_code],0DBh
jmp instruction_ready
fild_mem_16bit:
mov [base_code],0DFh
jmp instruction_ready
fild_mem_64bit:
mov al,[postbyte_register]
cmp al,1
je fisttp_64bit_store
jb fild_mem_64bit_store
dec [postbyte_register]
cmp al,3
je fild_mem_64bit_store
jmp invalid_operand_size
fild_mem_64bit_store:
add [postbyte_register],5
mov [base_code],0DFh
jmp instruction_ready
fisttp_64bit_store:
mov [base_code],0DDh
jmp instruction_ready
fbld_instruction:
mov [postbyte_register],al
lods byte [esi]
call get_size_operator
cmp al,'['
jne invalid_operand
call get_address
mov al,[operand_size]
or al,al
jz fbld_mem_80bit
cmp al,10
je fbld_mem_80bit
jmp invalid_operand_size
fbld_mem_80bit:
mov [base_code],0DFh
jmp instruction_ready
faddp_instruction:
mov [postbyte_register],al
mov [base_code],0DEh
mov edx,esi
lods byte [esi]
call get_size_operator
cmp al,10h
je faddp_streg
mov esi,edx
mov bl,1
jmp nomem_instruction_ready
faddp_streg:
lods byte [esi]
call convert_fpu_register
mov bl,al
lods byte [esi]
cmp al,','
jne invalid_operand
lods byte [esi]
call get_size_operator
cmp al,10h
jne invalid_operand
lods byte [esi]
call convert_fpu_register
or al,al
jnz invalid_operand
jmp nomem_instruction_ready
fcompp_instruction:
mov ax,0D9DEh
stos word [edi]
jmp instruction_assembled
fucompp_instruction:
mov ax,0E9DAh
stos word [edi]
jmp instruction_assembled
fxch_instruction:
mov dx,01D9h
jmp fpu_single_operand
ffreep_instruction:
mov dx,00DFh
jmp fpu_single_operand
ffree_instruction:
mov dl,0DDh
mov dh,al
fpu_single_operand:
mov ebx,esi
lods byte [esi]
call get_size_operator
cmp al,10h
je fpu_streg
or dh,dh
jz invalid_operand
mov esi,ebx
shl dh,3
or dh,11000001b
mov ax,dx
stos word [edi]
jmp instruction_assembled
fpu_streg:
lods byte [esi]
call convert_fpu_register
shl dh,3
or dh,al
or dh,11000000b
mov ax,dx
stos word [edi]
jmp instruction_assembled
 
fstenv_instruction:
mov byte [edi],9Bh
inc edi
fldenv_instruction:
mov [base_code],0D9h
jmp fpu_mem
fstenv_instruction_16bit:
mov byte [edi],9Bh
inc edi
fldenv_instruction_16bit:
call operand_16bit
jmp fldenv_instruction
fstenv_instruction_32bit:
mov byte [edi],9Bh
inc edi
fldenv_instruction_32bit:
call operand_32bit
jmp fldenv_instruction
fsave_instruction_32bit:
mov byte [edi],9Bh
inc edi
fnsave_instruction_32bit:
call operand_32bit
jmp fnsave_instruction
fsave_instruction_16bit:
mov byte [edi],9Bh
inc edi
fnsave_instruction_16bit:
call operand_16bit
jmp fnsave_instruction
fsave_instruction:
mov byte [edi],9Bh
inc edi
fnsave_instruction:
mov [base_code],0DDh
fpu_mem:
mov [postbyte_register],al
lods byte [esi]
call get_size_operator
cmp al,'['
jne invalid_operand
call get_address
cmp [operand_size],0
jne invalid_operand_size
jmp instruction_ready
fstcw_instruction:
mov byte [edi],9Bh
inc edi
fldcw_instruction:
mov [postbyte_register],al
mov [base_code],0D9h
lods byte [esi]
call get_size_operator
cmp al,'['
jne invalid_operand
call get_address
mov al,[operand_size]
or al,al
jz fldcw_mem_16bit
cmp al,2
je fldcw_mem_16bit
jmp invalid_operand_size
fldcw_mem_16bit:
jmp instruction_ready
fstsw_instruction:
mov al,9Bh
stos byte [edi]
fnstsw_instruction:
mov [base_code],0DDh
mov [postbyte_register],7
lods byte [esi]
call get_size_operator
cmp al,10h
je fstsw_reg
cmp al,'['
jne invalid_operand
call get_address
mov al,[operand_size]
or al,al
jz fstsw_mem_16bit
cmp al,2
je fstsw_mem_16bit
jmp invalid_operand_size
fstsw_mem_16bit:
jmp instruction_ready
fstsw_reg:
lods byte [esi]
call convert_register
cmp ax,0200h
jne invalid_operand
mov ax,0E0DFh
stos word [edi]
jmp instruction_assembled
finit_instruction:
mov byte [edi],9Bh
inc edi
fninit_instruction:
mov ah,al
mov al,0DBh
stos word [edi]
jmp instruction_assembled
fcmov_instruction:
mov dh,0DAh
jmp fcomi_streg
fcomi_instruction:
mov dh,0DBh
jmp fcomi_streg
fcomip_instruction:
mov dh,0DFh
fcomi_streg:
mov dl,al
lods byte [esi]
call get_size_operator
cmp al,10h
jne invalid_operand
lods byte [esi]
call convert_fpu_register
mov ah,al
cmp byte [esi],','
je fcomi_st0_streg
add ah,dl
mov al,dh
stos word [edi]
jmp instruction_assembled
fcomi_st0_streg:
or ah,ah
jnz invalid_operand
inc esi
lods byte [esi]
call get_size_operator
cmp al,10h
jne invalid_operand
lods byte [esi]
call convert_fpu_register
mov ah,al
add ah,dl
mov al,dh
stos word [edi]
jmp instruction_assembled
 
basic_mmx_instruction:
mov [base_code],0Fh
mov [extended_code],al
mmx_instruction:
lods byte [esi]
call get_size_operator
cmp al,10h
jne invalid_operand
lods byte [esi]
call convert_mmx_register
call make_mmx_prefix
mov [postbyte_register],al
lods byte [esi]
cmp al,','
jne invalid_operand
lods byte [esi]
call get_size_operator
cmp al,10h
je mmx_mmreg_mmreg
cmp al,'['
jne invalid_operand
mmx_mmreg_mem:
call get_address
jmp instruction_ready
mmx_mmreg_mmreg:
lods byte [esi]
call convert_mmx_register
mov bl,al
jmp nomem_instruction_ready
mmx_bit_shift_instruction:
mov [base_code],0Fh
mov [extended_code],al
lods byte [esi]
call get_size_operator
cmp al,10h
jne invalid_operand
lods byte [esi]
call convert_mmx_register
call make_mmx_prefix
mov [postbyte_register],al
lods byte [esi]
cmp al,','
jne invalid_operand
mov [operand_size],0
lods byte [esi]
call get_size_operator
cmp al,10h
je mmx_mmreg_mmreg
cmp al,'('
je mmx_ps_mmreg_imm8
cmp al,'['
je mmx_mmreg_mem
jmp invalid_operand
mmx_ps_mmreg_imm8:
call get_byte_value
mov byte [value],al
test [operand_size],not 1
jnz invalid_value
mov bl,[extended_code]
mov al,bl
shr bl,4
and al,1111b
add al,70h
mov [extended_code],al
sub bl,0Ch
shl bl,1
xchg bl,[postbyte_register]
call store_nomem_instruction
mov al,byte [value]
stos byte [edi]
jmp instruction_assembled
pmovmskb_instruction:
mov [base_code],0Fh
mov [extended_code],al
call take_register
cmp ah,4
je pmovmskb_reg_size_ok
cmp [code_type],64
jne invalid_operand_size
cmp ah,8
jnz invalid_operand_size
pmovmskb_reg_size_ok:
mov [postbyte_register],al
mov [operand_size],0
lods byte [esi]
cmp al,','
jne invalid_operand
lods byte [esi]
call get_size_operator
cmp al,10h
jne invalid_operand
lods byte [esi]
call convert_mmx_register
mov bl,al
call make_mmx_prefix
cmp [extended_code],0C5h
je mmx_nomem_imm8
jmp nomem_instruction_ready
mmx_imm8:
push ebx ecx edx
xor cl,cl
xchg cl,[operand_size]
lods byte [esi]
cmp al,','
jne invalid_operand
lods byte [esi]
call get_size_operator
test ah,not 1
jnz invalid_operand_size
mov [operand_size],cl
cmp al,'('
jne invalid_operand
call get_byte_value
mov byte [value],al
pop edx ecx ebx
call store_instruction_with_imm8
jmp instruction_assembled
mmx_nomem_imm8:
call store_nomem_instruction
call append_imm8
jmp instruction_assembled
append_imm8:
mov [operand_size],0
lods byte [esi]
cmp al,','
jne invalid_operand
lods byte [esi]
call get_size_operator
test ah,not 1
jnz invalid_operand_size
cmp al,'('
jne invalid_operand
call get_byte_value
stosb
ret
pinsrw_instruction:
mov [extended_code],al
mov [base_code],0Fh
lods byte [esi]
call get_size_operator
cmp al,10h
jne invalid_operand
lods byte [esi]
call convert_mmx_register
call make_mmx_prefix
mov [postbyte_register],al
mov [operand_size],0
lods byte [esi]
cmp al,','
jne invalid_operand
lods byte [esi]
call get_size_operator
cmp al,10h
je pinsrw_mmreg_reg
cmp al,'['
jne invalid_operand
call get_address
cmp [operand_size],0
je mmx_imm8
cmp [operand_size],2
jne invalid_operand_size
jmp mmx_imm8
pinsrw_mmreg_reg:
lods byte [esi]
call convert_register
cmp ah,4
jne invalid_operand_size
mov bl,al
jmp mmx_nomem_imm8
pshufw_instruction:
mov [mmx_size],8
mov [opcode_prefix],al
jmp pshuf_instruction
pshufd_instruction:
mov [mmx_size],16
mov [opcode_prefix],al
pshuf_instruction:
mov [base_code],0Fh
mov [extended_code],70h
lods byte [esi]
call get_size_operator
cmp al,10h
jne invalid_operand
lods byte [esi]
call convert_mmx_register
cmp ah,[mmx_size]
jne invalid_operand_size
mov [postbyte_register],al
lods byte [esi]
cmp al,','
jne invalid_operand
lods byte [esi]
call get_size_operator
cmp al,10h
je pshuf_mmreg_mmreg
cmp al,'['
jne invalid_operand
call get_address
jmp mmx_imm8
pshuf_mmreg_mmreg:
lods byte [esi]
call convert_mmx_register
mov bl,al
jmp mmx_nomem_imm8
movd_instruction:
mov [base_code],0Fh
mov [extended_code],7Eh
lods byte [esi]
call get_size_operator
cmp al,10h
je movd_reg
cmp al,'['
jne invalid_operand
call get_address
test [operand_size],not 4
jnz invalid_operand_size
call get_mmx_source_register
jmp instruction_ready
movd_reg:
lods byte [esi]
cmp al,0B0h
jae movd_mmreg
call convert_register
cmp ah,4
jne invalid_operand_size
mov bl,al
call get_mmx_source_register
jmp nomem_instruction_ready
movd_mmreg:
mov [extended_code],6Eh
call convert_mmx_register
mov [postbyte_register],al
call make_mmx_prefix
mov [operand_size],0
lods byte [esi]
cmp al,','
jne invalid_operand
lods byte [esi]
call get_size_operator
cmp al,10h
je movd_mmreg_reg
cmp al,'['
jne invalid_operand
call get_address
test [operand_size],not 4
jnz invalid_operand_size
jmp instruction_ready
movd_mmreg_reg:
lods byte [esi]
call convert_register
cmp ah,4
jne invalid_operand_size
mov bl,al
jmp nomem_instruction_ready
get_mmx_source_register:
mov [operand_size],0
lods byte [esi]
cmp al,','
jne invalid_operand
lods byte [esi]
call get_size_operator
cmp al,10h
jne invalid_operand
lods byte [esi]
call convert_mmx_register
mov [postbyte_register],al
make_mmx_prefix:
cmp [operand_size],16
jne no_mmx_prefix
mov [operand_prefix],66h
no_mmx_prefix:
ret
movq_instruction:
mov [base_code],0Fh
lods byte [esi]
call get_size_operator
cmp al,10h
je movq_reg
cmp al,'['
jne invalid_operand
call get_address
test [operand_size],not 8
jnz invalid_operand_size
call get_mmx_source_register
mov al,7Fh
cmp ah,8
je movq_mem_ready
mov al,0D6h
movq_mem_ready:
mov [extended_code],al
jmp instruction_ready
movq_reg:
lods byte [esi]
cmp al,0B0h
jae movq_mmreg
call convert_register
cmp ah,8
jne invalid_operand_size
mov bl,al
mov [extended_code],7Eh
call operand_64bit
call get_mmx_source_register
jmp nomem_instruction_ready
movq_mmreg:
call convert_mmx_register
mov [postbyte_register],al
mov [extended_code],6Fh
mov [mmx_size],ah
cmp ah,16
jne movq_mmreg_
mov [extended_code],7Eh
mov [opcode_prefix],0F3h
movq_mmreg_:
lods byte [esi]
cmp al,','
jne invalid_operand
mov [operand_size],0
lods byte [esi]
call get_size_operator
cmp al,10h
je movq_mmreg_reg
cmp al,'['
jne invalid_operand
call get_address
test [operand_size],not 8
jnz invalid_operand_size
jmp instruction_ready
movq_mmreg_reg:
lods byte [esi]
cmp al,0B0h
jae movq_mmreg_mmreg
mov [operand_size],0
call convert_register
cmp ah,8
jne invalid_operand_size
mov [extended_code],6Eh
mov [opcode_prefix],0
mov bl,al
cmp [mmx_size],16
jne movq_mmreg_reg_store
mov [opcode_prefix],66h
movq_mmreg_reg_store:
call operand_64bit
jmp nomem_instruction_ready
movq_mmreg_mmreg:
call convert_mmx_register
cmp ah,[mmx_size]
jne invalid_operand_size
mov bl,al
jmp nomem_instruction_ready
movdq_instruction:
mov [opcode_prefix],al
mov [base_code],0Fh
mov [extended_code],6Fh
lods byte [esi]
call get_size_operator
cmp al,10h
je movdq_mmreg
cmp al,'['
jne invalid_operand
call get_address
lods byte [esi]
cmp al,','
jne invalid_operand
lods byte [esi]
call get_size_operator
cmp al,10h
jne invalid_operand
lods byte [esi]
call convert_xmm_register
mov [postbyte_register],al
mov [extended_code],7Fh
jmp instruction_ready
movdq_mmreg:
lods byte [esi]
call convert_xmm_register
mov [postbyte_register],al
lods byte [esi]
cmp al,','
jne invalid_operand
lods byte [esi]
call get_size_operator
cmp al,10h
je movdq_mmreg_mmreg
cmp al,'['
jne invalid_operand
call get_address
jmp instruction_ready
movdq_mmreg_mmreg:
lods byte [esi]
call convert_xmm_register
mov bl,al
jmp nomem_instruction_ready
lddqu_instruction:
lods byte [esi]
call get_size_operator
cmp al,10h
jne invalid_operand
lods byte [esi]
call convert_xmm_register
push eax
lods byte [esi]
cmp al,','
jne invalid_operand
lods byte [esi]
call get_size_operator
cmp al,'['
jne invalid_operand
call get_address
pop eax
mov [postbyte_register],al
mov [opcode_prefix],0F2h
mov [base_code],0Fh
mov [extended_code],0F0h
jmp instruction_ready
 
movdq2q_instruction:
mov [opcode_prefix],0F2h
mov [mmx_size],8
jmp movq2dq_
movq2dq_instruction:
mov [opcode_prefix],0F3h
mov [mmx_size],16
movq2dq_:
lods byte [esi]
call get_size_operator
cmp al,10h
jne invalid_operand
lods byte [esi]
call convert_mmx_register
cmp ah,[mmx_size]
jne invalid_operand_size
mov [postbyte_register],al
mov [operand_size],0
lods byte [esi]
cmp al,','
jne invalid_operand
lods byte [esi]
call get_size_operator
cmp al,10h
jne invalid_operand
lods byte [esi]
call convert_mmx_register
xor [mmx_size],8+16
cmp ah,[mmx_size]
jne invalid_operand_size
mov bl,al
mov [base_code],0Fh
mov [extended_code],0D6h
jmp nomem_instruction_ready
 
sse_ps_instruction_imm8:
mov [immediate_size],1
sse_ps_instruction:
mov [mmx_size],16
jmp sse_instruction
sse_pd_instruction_imm8:
mov [immediate_size],1
sse_pd_instruction:
mov [mmx_size],16
mov [opcode_prefix],66h
jmp sse_instruction
sse_ss_instruction:
mov [mmx_size],4
mov [opcode_prefix],0F3h
jmp sse_instruction
sse_sd_instruction:
mov [mmx_size],8
mov [opcode_prefix],0F2h
jmp sse_instruction
cmp_pd_instruction:
mov [opcode_prefix],66h
cmp_ps_instruction:
mov [mmx_size],16
mov byte [value],al
mov al,0C2h
jmp sse_instruction
cmp_ss_instruction:
mov [mmx_size],4
mov [opcode_prefix],0F3h
jmp cmp_sx_instruction
cmpsd_instruction:
mov al,0A7h
mov ah,[esi]
or ah,ah
jz simple_instruction_32bit
cmp ah,0Fh
je simple_instruction_32bit
mov al,-1
cmp_sd_instruction:
mov [mmx_size],8
mov [opcode_prefix],0F2h
cmp_sx_instruction:
mov byte [value],al
mov al,0C2h
jmp sse_instruction
comiss_instruction:
mov [mmx_size],4
jmp sse_instruction
comisd_instruction:
mov [mmx_size],8
mov [opcode_prefix],66h
jmp sse_instruction
cvtdq2pd_instruction:
mov [opcode_prefix],0F3h
cvtps2pd_instruction:
mov [mmx_size],8
jmp sse_instruction
cvtpd2dq_instruction:
mov [mmx_size],16
mov [opcode_prefix],0F2h
jmp sse_instruction
movshdup_instruction:
mov [mmx_size],16
mov [opcode_prefix],0F3h
sse_instruction:
mov [base_code],0Fh
mov [extended_code],al
lods byte [esi]
call get_size_operator
cmp al,10h
jne invalid_operand
sse_xmmreg:
lods byte [esi]
call convert_xmm_register
sse_reg:
mov [postbyte_register],al
mov [operand_size],0
lods byte [esi]
cmp al,','
jne invalid_operand
lods byte [esi]
call get_size_operator
cmp al,10h
je sse_xmmreg_xmmreg
sse_reg_mem:
cmp al,'['
jne invalid_operand
call get_address
cmp [operand_size],0
je sse_mem_size_ok
mov al,[mmx_size]
cmp [operand_size],al
jne invalid_operand_size
sse_mem_size_ok:
mov al,[extended_code]
mov ah,[supplemental_code]
cmp al,0C2h
je sse_cmp_mem_ok
cmp ax,443Ah
je sse_cmp_mem_ok
cmp [immediate_size],1
je mmx_imm8
cmp [immediate_size],-1
jne sse_ok
call take_additional_xmm0
mov [immediate_size],0
sse_ok:
jmp instruction_ready
sse_cmp_mem_ok:
cmp byte [value],-1
je mmx_imm8
call store_instruction_with_imm8
jmp instruction_assembled
sse_xmmreg_xmmreg:
cmp [operand_prefix],66h
jne sse_xmmreg_xmmreg_ok
cmp [extended_code],12h
je invalid_operand
cmp [extended_code],16h
je invalid_operand
sse_xmmreg_xmmreg_ok:
lods byte [esi]
call convert_xmm_register
mov bl,al
mov al,[extended_code]
mov ah,[supplemental_code]
cmp al,0C2h
je sse_cmp_nomem_ok
cmp ax,443Ah
je sse_cmp_nomem_ok
cmp [immediate_size],1
je mmx_nomem_imm8
cmp [immediate_size],-1
jne sse_nomem_ok
call take_additional_xmm0
mov [immediate_size],0
sse_nomem_ok:
jmp nomem_instruction_ready
sse_cmp_nomem_ok:
cmp byte [value],-1
je mmx_nomem_imm8
call store_nomem_instruction
mov al,byte [value]
stosb
jmp instruction_assembled
take_additional_xmm0:
cmp byte [esi],','
jne additional_xmm0_ok
inc esi
lods byte [esi]
cmp al,10h
jne invalid_operand
lods byte [esi]
call convert_xmm_register
test al,al
jnz invalid_operand
additional_xmm0_ok:
ret
 
pslldq_instruction:
mov [postbyte_register],al
mov [opcode_prefix],66h
mov [base_code],0Fh
mov [extended_code],73h
lods byte [esi]
call get_size_operator
cmp al,10h
jne invalid_operand
lods byte [esi]
call convert_xmm_register
mov bl,al
jmp mmx_nomem_imm8
movpd_instruction:
mov [opcode_prefix],66h
movps_instruction:
mov [base_code],0Fh
mov [extended_code],al
mov [mmx_size],16
jmp sse_mov_instruction
movss_instruction:
mov [mmx_size],4
mov [opcode_prefix],0F3h
jmp sse_movs
movsd_instruction:
mov al,0A5h
mov ah,[esi]
or ah,ah
jz simple_instruction_32bit
cmp ah,0Fh
je simple_instruction_32bit
mov [mmx_size],8
mov [opcode_prefix],0F2h
sse_movs:
mov [base_code],0Fh
mov [extended_code],10h
jmp sse_mov_instruction
sse_mov_instruction:
lods byte [esi]
call get_size_operator
cmp al,10h
je sse_xmmreg
sse_mem:
cmp al,'['
jne invalid_operand
inc [extended_code]
call get_address
cmp [operand_size],0
je sse_mem_xmmreg
mov al,[mmx_size]
cmp [operand_size],al
jne invalid_operand_size
mov [operand_size],0
sse_mem_xmmreg:
lods byte [esi]
cmp al,','
jne invalid_operand
lods byte [esi]
call get_size_operator
cmp al,10h
jne invalid_operand
lods byte [esi]
call convert_xmm_register
mov [postbyte_register],al
jmp instruction_ready
movlpd_instruction:
mov [opcode_prefix],66h
movlps_instruction:
mov [base_code],0Fh
mov [extended_code],al
mov [mmx_size],8
lods byte [esi]
call get_size_operator
cmp al,10h
jne sse_mem
lods byte [esi]
call convert_xmm_register
mov [postbyte_register],al
mov [operand_size],0
lods byte [esi]
cmp al,','
jne invalid_operand
lods byte [esi]
call get_size_operator
jmp sse_reg_mem
movhlps_instruction:
mov [base_code],0Fh
mov [extended_code],al
mov [mmx_size],0
lods byte [esi]
call get_size_operator
cmp al,10h
jne invalid_operand
lods byte [esi]
call convert_xmm_register
mov [postbyte_register],al
lods byte [esi]
cmp al,','
jne invalid_operand
lods byte [esi]
call get_size_operator
cmp al,10h
je sse_xmmreg_xmmreg_ok
jmp invalid_operand
maskmovq_instruction:
mov cl,8
jmp maskmov_instruction
maskmovdqu_instruction:
mov cl,16
mov [opcode_prefix],66h
maskmov_instruction:
mov [base_code],0Fh
mov [extended_code],0F7h
lods byte [esi]
call get_size_operator
cmp al,10h
jne invalid_operand
lods byte [esi]
call convert_mmx_register
cmp ah,cl
jne invalid_operand_size
mov [postbyte_register],al
lods byte [esi]
cmp al,','
jne invalid_operand
lods byte [esi]
call get_size_operator
cmp al,10h
jne invalid_operand
lods byte [esi]
call convert_mmx_register
mov bl,al
jmp nomem_instruction_ready
movmskpd_instruction:
mov [opcode_prefix],66h
movmskps_instruction:
mov [base_code],0Fh
mov [extended_code],50h
call take_register
mov [postbyte_register],al
cmp ah,4
je movmskps_reg_ok
cmp ah,8
jne invalid_operand_size
cmp [code_type],64
jne invalid_operand
movmskps_reg_ok:
mov [operand_size],0
lods byte [esi]
cmp al,','
jne invalid_operand
lods byte [esi]
call get_size_operator
cmp al,10h
je sse_xmmreg_xmmreg_ok
jmp invalid_operand
 
cvtpi2pd_instruction:
mov [opcode_prefix],66h
cvtpi2ps_instruction:
mov [base_code],0Fh
mov [extended_code],al
lods byte [esi]
call get_size_operator
cmp al,10h
jne invalid_operand
lods byte [esi]
call convert_xmm_register
mov [postbyte_register],al
mov [operand_size],0
lods byte [esi]
cmp al,','
jne invalid_operand
lods byte [esi]
call get_size_operator
cmp al,10h
je cvtpi_xmmreg_xmmreg
cmp al,'['
jne invalid_operand
call get_address
cmp [operand_size],0
je cvtpi_size_ok
cmp [operand_size],8
jne invalid_operand_size
cvtpi_size_ok:
jmp instruction_ready
cvtpi_xmmreg_xmmreg:
lods byte [esi]
call convert_mmx_register
cmp ah,8
jne invalid_operand_size
mov bl,al
jmp nomem_instruction_ready
cvtsi2ss_instruction:
mov [opcode_prefix],0F3h
jmp cvtsi_instruction
cvtsi2sd_instruction:
mov [opcode_prefix],0F2h
cvtsi_instruction:
mov [base_code],0Fh
mov [extended_code],al
lods byte [esi]
call get_size_operator
cmp al,10h
jne invalid_operand
lods byte [esi]
call convert_xmm_register
mov [postbyte_register],al
cvtsi_xmmreg:
mov [operand_size],0
lods byte [esi]
cmp al,','
jne invalid_operand
lods byte [esi]
call get_size_operator
cmp al,10h
je cvtsi_xmmreg_reg
cmp al,'['
jne invalid_operand
call get_address
cmp [operand_size],0
je cvtsi_size_ok
cmp [operand_size],4
je cvtsi_size_ok
cmp [operand_size],8
jne invalid_operand_size
call operand_64bit
cvtsi_size_ok:
jmp instruction_ready
cvtsi_xmmreg_reg:
lods byte [esi]
call convert_register
cmp ah,4
je cvtsi_xmmreg_reg_store
cmp ah,8
jne invalid_operand_size
call operand_64bit
cvtsi_xmmreg_reg_store:
mov bl,al
jmp nomem_instruction_ready
cvtps2pi_instruction:
mov [mmx_size],8
jmp cvtpd_instruction
cvtpd2pi_instruction:
mov [opcode_prefix],66h
mov [mmx_size],16
cvtpd_instruction:
mov [base_code],0Fh
mov [extended_code],al
lods byte [esi]
call get_size_operator
cmp al,10h
jne invalid_operand
lods byte [esi]
call convert_mmx_register
cmp ah,8
jne invalid_operand_size
mov [operand_size],0
jmp sse_reg
cvtss2si_instruction:
mov [opcode_prefix],0F3h
mov [mmx_size],4
jmp cvt2si_instruction
cvtsd2si_instruction:
mov [opcode_prefix],0F2h
mov [mmx_size],8
cvt2si_instruction:
mov [extended_code],al
mov [base_code],0Fh
call take_register
mov [operand_size],0
cmp ah,4
je sse_reg
cmp ah,8
jne invalid_operand_size
call operand_64bit
jmp sse_reg
 
ssse3_instruction:
mov [base_code],0Fh
mov [extended_code],38h
mov [supplemental_code],al
jmp mmx_instruction
palignr_instruction:
mov [base_code],0Fh
mov [extended_code],3Ah
mov [supplemental_code],0Fh
lods byte [esi]
call get_size_operator
cmp al,10h
jne invalid_operand
lods byte [esi]
call convert_mmx_register
call make_mmx_prefix
mov [postbyte_register],al
lods byte [esi]
cmp al,','
jne invalid_operand
lods byte [esi]
call get_size_operator
cmp al,10h
je palignr_mmreg_mmreg
cmp al,'['
jne invalid_operand
call get_address
jmp mmx_imm8
palignr_mmreg_mmreg:
lods byte [esi]
call convert_mmx_register
mov bl,al
jmp mmx_nomem_imm8
amd3dnow_instruction:
mov [base_code],0Fh
mov [extended_code],0Fh
mov byte [value],al
lods byte [esi]
call get_size_operator
cmp al,10h
jne invalid_operand
lods byte [esi]
call convert_mmx_register
cmp ah,8
jne invalid_operand_size
mov [postbyte_register],al
lods byte [esi]
cmp al,','
jne invalid_operand
lods byte [esi]
call get_size_operator
cmp al,10h
je amd3dnow_mmreg_mmreg
cmp al,'['
jne invalid_operand
call get_address
call store_instruction_with_imm8
jmp instruction_assembled
amd3dnow_mmreg_mmreg:
lods byte [esi]
call convert_mmx_register
cmp ah,8
jne invalid_operand_size
mov bl,al
call store_nomem_instruction
mov al,byte [value]
stos byte [edi]
jmp instruction_assembled
 
sse4_instruction_38_xmm0:
mov [immediate_size],-1
jmp sse4_instruction_38
sse4_instruction_66_38_xmm0:
mov [immediate_size],-1
sse4_instruction_66_38:
mov [opcode_prefix],66h
sse4_instruction_38:
mov [mmx_size],16
mov [supplemental_code],al
mov al,38h
jmp sse_instruction
sse4_ss_instruction_66_3a_imm8:
mov [immediate_size],1
mov cl,4
jmp sse4_instruction_66_3a_setup
sse4_sd_instruction_66_3a_imm8:
mov [immediate_size],1
mov cl,8
jmp sse4_instruction_66_3a_setup
sse4_instruction_66_3a_imm8:
mov [immediate_size],1
mov cl,16
sse4_instruction_66_3a_setup:
mov [opcode_prefix],66h
sse4_instruction_3a_setup:
mov [supplemental_code],al
mov al,3Ah
mov [mmx_size],cl
jmp sse_instruction
sse4_instruction_3a_imm8:
mov [immediate_size],1
mov cl,16
jmp sse4_instruction_3a_setup
pclmulqdq_instruction:
mov byte [value],al
mov al,44h
mov cl,16
jmp sse4_instruction_66_3a_setup
extractps_instruction:
call setup_66_0f_3a
lods byte [esi]
call get_size_operator
cmp al,10h
je extractps_reg
cmp al,'['
jne invalid_operand
call get_address
cmp [operand_size],4
je extractps_size_ok
cmp [operand_size],0
jne invalid_operand_size
extractps_size_ok:
push edx ebx ecx
mov [operand_size],0
lods byte [esi]
cmp al,','
jne invalid_operand
lods byte [esi]
call get_size_operator
cmp al,10h
jne invalid_operand
lods byte [esi]
call convert_xmm_register
mov [postbyte_register],al
pop ecx ebx edx
jmp mmx_imm8
extractps_reg:
lods byte [esi]
call convert_register
push eax
mov [operand_size],0
lods byte [esi]
cmp al,','
jne invalid_operand
lods byte [esi]
call get_size_operator
cmp al,10h
jne invalid_operand
lods byte [esi]
call convert_xmm_register
mov [postbyte_register],al
pop ebx
mov al,bh
cmp al,4
je mmx_nomem_imm8
cmp al,8
jne invalid_operand_size
cmp [code_type],64
jne illegal_instruction
jmp mmx_nomem_imm8
setup_66_0f_3a:
mov [extended_code],3Ah
mov [supplemental_code],al
mov [base_code],0Fh
mov [opcode_prefix],66h
ret
insertps_instruction:
call setup_66_0f_3a
lods byte [esi]
call get_size_operator
cmp al,10h
jne invalid_operand
lods byte [esi]
call convert_xmm_register
mov [postbyte_register],al
mov [operand_size],0
lods byte [esi]
cmp al,','
jne invalid_operand
lods byte [esi]
call get_size_operator
cmp al,10h
je insertps_xmmreg_reg
cmp al,'['
jne invalid_operand
call get_address
cmp [operand_size],4
je insertps_size_ok
cmp [operand_size],0
jne invalid_operand_size
insertps_size_ok:
jmp mmx_imm8
insertps_xmmreg_reg:
lods byte [esi]
call convert_mmx_register
mov bl,al
jmp mmx_nomem_imm8
pextrq_instruction:
mov [mmx_size],8
jmp pextr_instruction
pextrd_instruction:
mov [mmx_size],4
jmp pextr_instruction
pextrw_instruction:
mov [mmx_size],2
jmp pextr_instruction
pextrb_instruction:
mov [mmx_size],1
pextr_instruction:
call setup_66_0f_3a
lods byte [esi]
call get_size_operator
cmp al,10h
je pextr_reg
cmp al,'['
jne invalid_operand
call get_address
mov al,[mmx_size]
cmp al,[operand_size]
je pextr_size_ok
cmp [operand_size],0
jne invalid_operand_size
pextr_size_ok:
cmp al,8
jne pextr_prefix_ok
call operand_64bit
pextr_prefix_ok:
push edx ebx ecx
mov [operand_size],0
lods byte [esi]
cmp al,','
jne invalid_operand
lods byte [esi]
call get_size_operator
cmp al,10h
jne invalid_operand
lods byte [esi]
call convert_xmm_register
mov [postbyte_register],al
pop ecx ebx edx
jmp mmx_imm8
pextr_reg:
lods byte [esi]
call convert_register
cmp [mmx_size],4
ja pextrq_reg
cmp ah,4
je pextr_reg_size_ok
cmp [code_type],64
jne pextr_invalid_size
cmp ah,8
je pextr_reg_size_ok
pextr_invalid_size:
jmp invalid_operand_size
pextrq_reg:
cmp ah,8
jne pextr_invalid_size
call operand_64bit
pextr_reg_size_ok:
mov [operand_size],0
push eax
lods byte [esi]
cmp al,','
jne invalid_operand
lods byte [esi]
call get_size_operator
cmp al,10h
jne invalid_operand
lods byte [esi]
call convert_mmx_register
mov ebx,eax
pop eax
mov [postbyte_register],al
mov al,ah
cmp [mmx_size],2
jne pextr_reg_store
mov [opcode_prefix],0
mov [extended_code],0C5h
call make_mmx_prefix
jmp mmx_nomem_imm8
pextr_reg_store:
cmp bh,16
jne invalid_operand_size
xchg bl,[postbyte_register]
jmp mmx_nomem_imm8
pinsrb_instruction:
mov [mmx_size],1
jmp pinsr_instruction
pinsrd_instruction:
mov [mmx_size],4
jmp pinsr_instruction
pinsrq_instruction:
mov [mmx_size],8
call operand_64bit
pinsr_instruction:
call setup_66_0f_3a
lods byte [esi]
call get_size_operator
cmp al,10h
jne invalid_operand
lods byte [esi]
call convert_xmm_register
mov [postbyte_register],al
pinsr_xmmreg:
mov [operand_size],0
lods byte [esi]
cmp al,','
jne invalid_operand
lods byte [esi]
call get_size_operator
cmp al,10h
je pinsr_xmmreg_reg
cmp al,'['
jne invalid_operand
call get_address
cmp [operand_size],0
je mmx_imm8
mov al,[mmx_size]
cmp al,[operand_size]
je mmx_imm8
jmp invalid_operand_size
pinsr_xmmreg_reg:
lods byte [esi]
call convert_register
mov bl,al
cmp [mmx_size],8
je pinsrq_xmmreg_reg
cmp ah,4
je mmx_nomem_imm8
jmp invalid_operand_size
pinsrq_xmmreg_reg:
cmp ah,8
je mmx_nomem_imm8
jmp invalid_operand_size
pmovsxbw_instruction:
mov [mmx_size],8
jmp pmovsx_instruction
pmovsxbd_instruction:
mov [mmx_size],4
jmp pmovsx_instruction
pmovsxbq_instruction:
mov [mmx_size],2
jmp pmovsx_instruction
pmovsxwd_instruction:
mov [mmx_size],8
jmp pmovsx_instruction
pmovsxwq_instruction:
mov [mmx_size],4
jmp pmovsx_instruction
pmovsxdq_instruction:
mov [mmx_size],8
pmovsx_instruction:
call setup_66_0f_38
lods byte [esi]
call get_size_operator
cmp al,10h
jne invalid_operand
lods byte [esi]
call convert_xmm_register
mov [postbyte_register],al
lods byte [esi]
cmp al,','
jne invalid_operand
mov [operand_size],0
lods byte [esi]
call get_size_operator
cmp al,10h
je pmovsx_xmmreg_reg
cmp al,'['
jne invalid_operand
call get_address
cmp [operand_size],0
je instruction_ready
mov al,[mmx_size]
cmp al,[operand_size]
jne invalid_operand_size
jmp instruction_ready
pmovsx_xmmreg_reg:
lods byte [esi]
call convert_xmm_register
mov bl,al
jmp nomem_instruction_ready
setup_66_0f_38:
mov [extended_code],38h
mov [supplemental_code],al
mov [base_code],0Fh
mov [opcode_prefix],66h
ret
 
xsaves_instruction_64bit:
call operand_64bit
xsaves_instruction:
mov ah,0C7h
jmp xsave_common
fxsave_instruction_64bit:
call operand_64bit
fxsave_instruction:
mov ah,0AEh
xor cl,cl
xsave_common:
mov [base_code],0Fh
mov [extended_code],ah
mov [postbyte_register],al
mov [mmx_size],cl
lods byte [esi]
call get_size_operator
cmp al,'['
jne invalid_operand
call get_address
mov ah,[operand_size]
or ah,ah
jz xsave_size_ok
cmp ah,[mmx_size]
jne invalid_operand_size
xsave_size_ok:
jmp instruction_ready
clflush_instruction:
mov ah,0AEh
mov cl,1
jmp xsave_common
cldemote_instruction:
mov ah,1Ch
mov cl,1
jmp xsave_common
stmxcsr_instruction:
mov ah,0AEh
mov cl,4
jmp xsave_common
prefetch_instruction:
mov [extended_code],18h
prefetch_mem_8bit:
mov [base_code],0Fh
mov [postbyte_register],al
lods byte [esi]
call get_size_operator
cmp al,'['
jne invalid_operand
or ah,ah
jz prefetch_size_ok
cmp ah,1
jne invalid_operand_size
prefetch_size_ok:
call get_address
jmp instruction_ready
amd_prefetch_instruction:
mov [extended_code],0Dh
jmp prefetch_mem_8bit
clflushopt_instruction:
mov [extended_code],0AEh
mov [opcode_prefix],66h
jmp prefetch_mem_8bit
pcommit_instruction:
mov byte [edi],66h
inc edi
fence_instruction:
mov bl,al
mov ax,0AE0Fh
stos word [edi]
mov al,bl
stos byte [edi]
jmp instruction_assembled
pause_instruction:
mov ax,90F3h
stos word [edi]
jmp instruction_assembled
movntq_instruction:
mov [mmx_size],8
jmp movnt_instruction
movntpd_instruction:
mov [opcode_prefix],66h
movntps_instruction:
mov [mmx_size],16
movnt_instruction:
mov [extended_code],al
mov [base_code],0Fh
lods byte [esi]
call get_size_operator
cmp al,'['
jne invalid_operand
call get_address
lods byte [esi]
cmp al,','
jne invalid_operand
lods byte [esi]
call get_size_operator
cmp al,10h
jne invalid_operand
lods byte [esi]
call convert_mmx_register
cmp ah,[mmx_size]
jne invalid_operand_size
mov [postbyte_register],al
jmp instruction_ready
 
movntsd_instruction:
mov [opcode_prefix],0F2h
mov [mmx_size],8
jmp movnts_instruction
movntss_instruction:
mov [opcode_prefix],0F3h
mov [mmx_size],4
movnts_instruction:
mov [extended_code],al
mov [base_code],0Fh
lods byte [esi]
call get_size_operator
cmp al,'['
jne invalid_operand
call get_address
mov al,[operand_size]
cmp al,[mmx_size]
je movnts_size_ok
test al,al
jnz invalid_operand_size
movnts_size_ok:
lods byte [esi]
cmp al,','
jne invalid_operand
mov [operand_size],0
lods byte [esi]
call get_size_operator
cmp al,10h
jne invalid_operand
lods byte [esi]
call convert_xmm_register
mov [postbyte_register],al
jmp instruction_ready
 
movdiri_instruction:
mov [supplemental_code],al
mov al,38h
movnti_instruction:
mov [base_code],0Fh
mov [extended_code],al
lods byte [esi]
call get_size_operator
cmp al,'['
jne invalid_operand
call get_address
lods byte [esi]
cmp al,','
jne invalid_operand
call take_register
cmp ah,4
je movnti_store
cmp ah,8
jne invalid_operand_size
call operand_64bit
movnti_store:
mov [postbyte_register],al
jmp instruction_ready
monitor_instruction:
mov [postbyte_register],al
cmp byte [esi],0
je monitor_instruction_store
cmp byte [esi],0Fh
je monitor_instruction_store
call take_register
cmp ax,0400h
jne invalid_operand
lods byte [esi]
cmp al,','
jne invalid_operand
call take_register
cmp ax,0401h
jne invalid_operand
cmp [postbyte_register],0C8h
jne monitor_instruction_store
lods byte [esi]
cmp al,','
jne invalid_operand
call take_register
cmp ax,0402h
jne invalid_operand
monitor_instruction_store:
mov ax,010Fh
stos word [edi]
mov al,[postbyte_register]
stos byte [edi]
jmp instruction_assembled
pconfig_instruction:
mov [postbyte_register],al
jmp monitor_instruction_store
movntdqa_instruction:
call setup_66_0f_38
lods byte [esi]
call get_size_operator
cmp al,10h
jne invalid_operand
lods byte [esi]
call convert_xmm_register
mov [postbyte_register],al
lods byte [esi]
cmp al,','
jne invalid_operand
lods byte [esi]
call get_size_operator
cmp al,'['
jne invalid_operand
call get_address
jmp instruction_ready
 
extrq_instruction:
mov [opcode_prefix],66h
mov [base_code],0Fh
mov [extended_code],78h
lods byte [esi]
call get_size_operator
cmp al,10h
jne invalid_operand
lods byte [esi]
call convert_xmm_register
mov [postbyte_register],al
mov [operand_size],0
lods byte [esi]
cmp al,','
jne invalid_operand
lods byte [esi]
call get_size_operator
cmp al,10h
je extrq_xmmreg_xmmreg
test ah,not 1
jnz invalid_operand_size
cmp al,'('
jne invalid_operand
xor bl,bl
xchg bl,[postbyte_register]
call store_nomem_instruction
call get_byte_value
stosb
call append_imm8
jmp instruction_assembled
extrq_xmmreg_xmmreg:
inc [extended_code]
lods byte [esi]
call convert_xmm_register
mov bl,al
jmp nomem_instruction_ready
insertq_instruction:
mov [opcode_prefix],0F2h
mov [base_code],0Fh
mov [extended_code],78h
lods byte [esi]
call get_size_operator
cmp al,10h
jne invalid_operand
lods byte [esi]
call convert_xmm_register
mov [postbyte_register],al
mov [operand_size],0
lods byte [esi]
cmp al,','
jne invalid_operand
lods byte [esi]
call get_size_operator
cmp al,10h
jne invalid_operand
lods byte [esi]
call convert_xmm_register
mov bl,al
cmp byte [esi],','
je insertq_with_imm
inc [extended_code]
jmp nomem_instruction_ready
insertq_with_imm:
call store_nomem_instruction
call append_imm8
call append_imm8
jmp instruction_assembled
 
crc32_instruction:
mov [opcode_prefix],0F2h
mov [base_code],0Fh
mov [extended_code],38h
mov [supplemental_code],0F0h
call take_register
mov [postbyte_register],al
cmp ah,4
je crc32_reg_size_ok
cmp ah,8
jne invalid_operand
cmp [code_type],64
jne illegal_instruction
crc32_reg_size_ok:
lods byte [esi]
cmp al,','
jne invalid_operand
mov [operand_size],0
lods byte [esi]
call get_size_operator
cmp al,10h
je crc32_reg_reg
cmp al,'['
jne invalid_operand
call get_address
mov al,[operand_size]
test al,al
jz crc32_unknown_size
cmp al,1
je crc32_reg_mem_store
inc [supplemental_code]
call operand_autodetect
crc32_reg_mem_store:
jmp instruction_ready
crc32_unknown_size:
call recoverable_unknown_size
jmp crc32_reg_mem_store
crc32_reg_reg:
lods byte [esi]
call convert_register
mov bl,al
mov al,ah
cmp al,1
je crc32_reg_reg_store
inc [supplemental_code]
call operand_autodetect
crc32_reg_reg_store:
jmp nomem_instruction_ready
popcnt_instruction:
mov [opcode_prefix],0F3h
jmp bs_instruction
movbe_instruction:
mov [supplemental_code],al
mov [extended_code],38h
mov [base_code],0Fh
lods byte [esi]
call get_size_operator
cmp al,'['
je movbe_mem
cmp al,10h
jne invalid_operand
lods byte [esi]
call convert_register
mov [postbyte_register],al
lods byte [esi]
cmp al,','
jne invalid_operand
lods byte [esi]
call get_size_operator
cmp al,'['
jne invalid_argument
call get_address
mov al,[operand_size]
call operand_autodetect
jmp instruction_ready
movbe_mem:
inc [supplemental_code]
call get_address
push edx ebx ecx
lods byte [esi]
cmp al,','
jne invalid_operand
call take_register
mov [postbyte_register],al
pop ecx ebx edx
mov al,[operand_size]
call operand_autodetect
jmp instruction_ready
adx_instruction:
mov [base_code],0Fh
mov [extended_code],38h
mov [supplemental_code],0F6h
mov [operand_prefix],al
call get_reg_mem
jc adx_reg_reg
mov al,[operand_size]
cmp al,4
je instruction_ready
cmp al,8
jne invalid_operand_size
call operand_64bit
jmp instruction_ready
adx_reg_reg:
cmp ah,4
je nomem_instruction_ready
cmp ah,8
jne invalid_operand_size
call operand_64bit
jmp nomem_instruction_ready
rdpid_instruction:
mov [postbyte_register],al
mov [extended_code],0C7h
mov [base_code],0Fh
mov [opcode_prefix],0F3h
call take_register
cmp [code_type],64
je rdpid_64bit
cmp ah,4
jne invalid_operand_size
jmp nomem_instruction_ready
rdpid_64bit:
cmp ah,8
jne invalid_operand_size
jmp nomem_instruction_ready
ptwrite_instruction:
mov [base_code],0Fh
mov [extended_code],0AEh
mov [postbyte_register],al
mov [opcode_prefix],0F3h
lods byte [esi]
call get_size_operator
cmp al,10h
je ptwrite_reg
ptwrite_mem:
cmp al,'['
jne invalid_operand
call get_address
mov al,[operand_size]
cmp al,4
je ptwrite_mem_store
cmp al,8
je ptwrite_mem_64bit
or al,al
jnz invalid_operand_size
call recoverable_unknown_size
jmp ptwrite_mem_store
ptwrite_mem_64bit:
call operand_64bit
ptwrite_mem_store:
mov al,[operand_size]
call operand_autodetect
jmp instruction_ready
ptwrite_reg:
lods byte [esi]
call convert_register
mov bl,al
mov al,ah
cmp al,4
je nomem_instruction_ready
cmp al,8
jne invalid_operand_size
call operand_64bit
jmp nomem_instruction_ready
 
vmclear_instruction:
mov [opcode_prefix],66h
jmp vmx_instruction
vmxon_instruction:
mov [opcode_prefix],0F3h
vmx_instruction:
mov [postbyte_register],al
mov [extended_code],0C7h
lods byte [esi]
call get_size_operator
cmp al,'['
jne invalid_operand
call get_address
mov al,[operand_size]
or al,al
jz vmx_size_ok
cmp al,8
jne invalid_operand_size
vmx_size_ok:
mov [base_code],0Fh
jmp instruction_ready
vmread_instruction:
mov [extended_code],78h
lods byte [esi]
call get_size_operator
cmp al,10h
je vmread_nomem
cmp al,'['
jne invalid_operand
call get_address
lods byte [esi]
cmp al,','
jne invalid_operand
call take_register
mov [postbyte_register],al
call vmread_check_size
jmp vmx_size_ok
vmread_nomem:
lods byte [esi]
call convert_register
push eax
call vmread_check_size
lods byte [esi]
cmp al,','
jne invalid_operand
call take_register
mov [postbyte_register],al
call vmread_check_size
pop ebx
mov [base_code],0Fh
jmp nomem_instruction_ready
vmread_check_size:
cmp [code_type],64
je vmread_long
cmp [operand_size],4
jne invalid_operand_size
ret
vmread_long:
cmp [operand_size],8
jne invalid_operand_size
ret
vmwrite_instruction:
mov [extended_code],79h
call take_register
mov [postbyte_register],al
lods byte [esi]
cmp al,','
jne invalid_operand
lods byte [esi]
call get_size_operator
cmp al,10h
je vmwrite_nomem
cmp al,'['
jne invalid_operand
call get_address
call vmread_check_size
jmp vmx_size_ok
vmwrite_nomem:
lods byte [esi]
call convert_register
mov bl,al
mov [base_code],0Fh
jmp nomem_instruction_ready
vmx_inv_instruction:
call setup_66_0f_38
call take_register
mov [postbyte_register],al
call vmread_check_size
mov [operand_size],0
lods byte [esi]
cmp al,','
jne invalid_operand
lods byte [esi]
call get_size_operator
cmp al,'['
jne invalid_operand
call get_address
mov al,[operand_size]
or al,al
jz vmx_size_ok
cmp al,16
jne invalid_operand_size
jmp vmx_size_ok
simple_svm_instruction:
push eax
mov [base_code],0Fh
mov [extended_code],1
call take_register
or al,al
jnz invalid_operand
simple_svm_detect_size:
cmp ah,2
je simple_svm_16bit
cmp ah,4
je simple_svm_32bit
cmp [code_type],64
jne invalid_operand_size
jmp simple_svm_store
simple_svm_16bit:
cmp [code_type],16
je simple_svm_store
cmp [code_type],64
je invalid_operand_size
jmp prefixed_svm_store
simple_svm_32bit:
cmp [code_type],32
je simple_svm_store
prefixed_svm_store:
mov al,67h
stos byte [edi]
simple_svm_store:
call store_classic_instruction_code
pop eax
stos byte [edi]
jmp instruction_assembled
skinit_instruction:
call take_register
cmp ax,0400h
jne invalid_operand
mov al,0DEh
jmp simple_instruction_0f_01
clzero_instruction:
call take_register
or al,al
jnz invalid_operand
mov al,0FCh
cmp [code_type],64
je clzero_64bit
cmp ah,4
jne invalid_operand
jmp simple_instruction_0f_01
clzero_64bit:
cmp ah,8
jne invalid_operand
jmp simple_instruction_0f_01
invlpga_instruction:
push eax
mov [base_code],0Fh
mov [extended_code],1
call take_register
or al,al
jnz invalid_operand
mov bl,ah
mov [operand_size],0
lods byte [esi]
cmp al,','
jne invalid_operand
call take_register
cmp ax,0401h
jne invalid_operand
mov ah,bl
jmp simple_svm_detect_size
 
rdrand_instruction:
mov [base_code],0Fh
mov [extended_code],0C7h
mov [postbyte_register],al
call take_register
mov bl,al
mov al,ah
call operand_autodetect
jmp nomem_instruction_ready
rdfsbase_instruction:
cmp [code_type],64
jne illegal_instruction
mov [opcode_prefix],0F3h
mov [base_code],0Fh
mov [extended_code],0AEh
mov [postbyte_register],al
call take_register
mov bl,al
mov al,ah
cmp ah,2
je invalid_operand_size
call operand_autodetect
jmp nomem_instruction_ready
 
xabort_instruction:
lods byte [esi]
call get_size_operator
cmp ah,1
ja invalid_operand_size
cmp al,'('
jne invalid_operand
call get_byte_value
mov dl,al
mov ax,0F8C6h
stos word [edi]
mov al,dl
stos byte [edi]
jmp instruction_assembled
xbegin_instruction:
lods byte [esi]
cmp al,'('
jne invalid_operand
mov al,[code_type]
cmp al,64
je xbegin_64bit
cmp al,32
je xbegin_32bit
xbegin_16bit:
call get_address_word_value
add edi,4
mov ebp,[addressing_space]
call calculate_relative_offset
sub edi,4
shl eax,16
mov ax,0F8C7h
stos dword [edi]
jmp instruction_assembled
xbegin_32bit:
call get_address_dword_value
jmp xbegin_address_ok
xbegin_64bit:
call get_address_qword_value
xbegin_address_ok:
add edi,5
mov ebp,[addressing_space]
call calculate_relative_offset
sub edi,5
mov edx,eax
cwde
cmp eax,edx
jne xbegin_rel32
mov al,66h
stos byte [edi]
mov eax,edx
shl eax,16
mov ax,0F8C7h
stos dword [edi]
jmp instruction_assembled
xbegin_rel32:
sub edx,1
jno xbegin_rel32_ok
cmp [code_type],64
je jump_out_of_range
xbegin_rel32_ok:
mov ax,0F8C7h
stos word [edi]
mov eax,edx
stos dword [edi]
jmp instruction_assembled
 
bndcl_instruction:
mov ah,0F3h
jmp bndc_instruction
bndcu_instruction:
mov ah,0F2h
bndc_instruction:
mov [opcode_prefix],ah
mov [base_code],0Fh
mov [extended_code],al
call take_bnd_register
mov [postbyte_register],al
call get_bnd_size
mov [operand_size],al
lods byte [esi]
cmp al,','
jne invalid_operand
lods byte [esi]
call get_size_operator
cmp al,'['
je bndc_mem
cmp al,10h
jne invalid_operand
lods byte [esi]
call convert_register
mov bl,al
jmp nomem_instruction_ready
bndc_mem:
call get_address_of_required_size
jmp instruction_ready
bndmov_instruction:
mov [opcode_prefix],66h
mov [base_code],0Fh
mov [extended_code],al
call get_bnd_size
shl al,1
mov [operand_size],al
lods byte [esi]
cmp al,14h
je bndmov_reg
call get_size_operator
cmp al,'['
jne invalid_operand
inc [extended_code]
call get_address_of_required_size
lods byte [esi]
cmp al,','
jne invalid_operand
call take_bnd_register
mov [postbyte_register],al
jmp instruction_ready
bndmov_reg:
lods byte [esi]
call convert_bnd_register
mov [postbyte_register],al
lods byte [esi]
cmp al,','
jne invalid_operand
lods byte [esi]
cmp al,14h
je bndmov_reg_reg
call get_size_operator
cmp al,'['
jne invalid_operand
call get_address_of_required_size
jmp instruction_ready
bndmov_reg_reg:
lods byte [esi]
call convert_bnd_register
mov bl,al
jmp nomem_instruction_ready
take_bnd_register:
lods byte [esi]
cmp al,14h
jne invalid_operand
lods byte [esi]
convert_bnd_register:
mov ah,al
shr ah,4
cmp ah,6
jne invalid_operand
and al,1111b
ret
bndmk_instruction:
mov [opcode_prefix],0F3h
mov [base_code],0Fh
mov [extended_code],al
call take_bnd_register
mov [postbyte_register],al
lods byte [esi]
cmp al,','
jne invalid_operand
lods byte [esi]
call get_size_operator
cmp al,'['
jne invalid_operand
call get_bnd_size
call get_address_prefixes
call get_address_component
cmp byte [esi-1],']'
je bndmk_ready
lods byte [esi]
cmp al,','
jne invalid_operand
lods byte [esi]
cmp al,'('
jne invalid_operand
or dl,bl
or dl,[address_sign]
or edx,[address_high]
jnz invalid_address
mov [address_register],bh
call get_address_component
lods byte [esi]
cmp al,']'
jne invalid_operand
or bh,bh
jz bndmk_selected_base
cmp bl,bh
je bndmk_to_index
or bl,bl
jnz invalid_address
mov bl,bh
bndmk_to_index:
inc cl
bndmk_selected_base:
mov bh,[address_register]
bndmk_ready:
or bx,bx
jz instruction_ready
cmp [address_size_declared],0
jne instruction_ready
and ch,not 0Fh
jmp instruction_ready
get_bnd_size:
mov al,4
cmp [code_type],64
jne bnd_size_ok
add al,4
bnd_size_ok:
mov [address_size],al
ret
get_address_component:
mov [free_address_range],0
call calculate_address
mov [address_high],edx
mov edx,eax
or bx,bx
jz address_component_ok
mov al,bl
or al,bh
shr al,4
cmp al,[address_size]
jne invalid_address
address_component_ok:
ret
bndldx_instruction:
mov [base_code],0Fh
mov [extended_code],al
call take_bnd_register
mov [postbyte_register],al
lods byte [esi]
cmp al,','
jne invalid_operand
call take_bnd_mib
jmp bndmk_ready
bndstx_instruction:
mov [base_code],0Fh
mov [extended_code],al
call take_bnd_mib
lods byte [esi]
cmp al,','
jne invalid_operand
call take_bnd_register
mov [postbyte_register],al
jmp bndmk_ready
take_bnd_mib:
lods byte [esi]
cmp al,'['
jne invalid_operand
call get_bnd_size
call get_address_prefixes
call get_address_component
cmp byte [esi-1],']'
je bnd_mib_ok
lods byte [esi]
cmp al,','
jne invalid_operand
lods byte [esi]
cmp al,'('
jne invalid_operand
mov al,[address_sign]
push eax ebx ecx edx [address_symbol]
call get_address_component
lods byte [esi]
cmp al,']'
jne invalid_operand
or dl,bl
or dl,[address_sign]
or edx,[address_high]
jnz invalid_address
mov [address_register],bh
pop [address_symbol] edx ecx ebx eax
mov [address_sign],al
or bl,bl
jz mib_place_index
or bh,bh
jnz invalid_address
cmp cl,1
jne invalid_address
mov bh,bl
mib_place_index:
mov bl,[address_register]
xor cl,cl
or bl,bl
jz bnd_mib_ok
inc cl
bnd_mib_ok:
ret
 
tpause_instruction:
mov [postbyte_register],6
mov [extended_code],0AEh
mov [base_code],0Fh
mov [opcode_prefix],al
call take_register
cmp ah,4
jne invalid_operand_size
mov bl,al
cmp byte [esi],','
jne nomem_instruction_ready
inc esi
call take_register
cmp ax,0402h
jne invalid_operand
lods byte [esi]
cmp al,','
jne invalid_operand
call take_register
cmp ax,0400h
jne invalid_operand
jmp nomem_instruction_ready
umonitor_instruction:
mov [postbyte_register],6
mov [extended_code],0AEh
mov [base_code],0Fh
mov [opcode_prefix],0F3h
call take_register
mov bl,al
mov al,ah
call operand_autodetect
jmp nomem_instruction_ready
movdir64b_instruction:
call setup_66_0f_38
call take_register
mov [postbyte_register],al
xor al,al
xchg al,[operand_size]
push eax
lods byte [esi]
cmp al,','
jne invalid_operand
lods byte [esi]
call get_size_operator
cmp al,'['
jne invalid_operand
call get_address
mov al,[operand_size]
or al,al
jz movdir64b_ready
cmp al,64
jne invalid_operand_size
movdir64b_ready:
push edi
call store_instruction
pop ebx eax
mov cl,[code_type]
cmp byte [ebx],67h
jne movdir64b_size_check
shr cl,1
cmp cl,16
jae movdir64b_size_check
mov cl,32
movdir64b_size_check:
shl al,3
cmp al,cl
jne invalid_operand_size
jmp instruction_assembled
 
setssbsy_instruction:
shl eax,24
or eax,010FF3h
stos dword [edi]
jmp instruction_assembled
rstorssp_instruction:
mov ah,1
jmp setup_clrssbsy
clrssbsy_instruction:
mov ah,0AEh
setup_clrssbsy:
mov [base_code],0Fh
mov [extended_code],ah
mov [postbyte_register],al
mov [opcode_prefix],0F3h
lods byte [esi]
call get_size_operator
cmp al,'['
jne invalid_operand
call get_address
test [operand_size],not 8
jnz invalid_operand_size
jmp instruction_ready
rdsspq_instruction:
mov [rex_prefix],48h
rdsspd_instruction:
mov ah,1Eh
jmp setup_incssp
incsspq_instruction:
mov [rex_prefix],48h
incsspd_instruction:
mov ah,0AEh
setup_incssp:
mov [base_code],0Fh
mov [extended_code],ah
mov [postbyte_register],al
mov [opcode_prefix],0F3h
lods byte [esi]
call get_size_operator
cmp al,10h
jne invalid_operand
lods byte [esi]
call convert_register
mov bl,al
call cet_size_check
jmp nomem_instruction_ready
cet_size_check:
cmp [rex_prefix],0
je cet_dword
cmp [code_type],64
jne illegal_instruction
shr ah,1
cet_dword:
cmp ah,4
jne invalid_operand_size
ret
wrussq_instruction:
mov [opcode_prefix],66h
wrssq_instruction:
mov [rex_prefix],48h
jmp wrssd_instruction
wrussd_instruction:
mov [opcode_prefix],66h
wrssd_instruction:
mov [base_code],0Fh
mov [extended_code],38h
mov [supplemental_code],al
lods byte [esi]
call get_size_operator
cmp al,10h
je wrss_reg
cmp al,'['
jne invalid_operand
call get_address
push edx ebx ecx
lods byte [esi]
cmp al,','
jne invalid_operand
call take_register
mov [postbyte_register],al
pop ecx ebx edx
call cet_size_check
jmp instruction_ready
wrss_reg:
lods byte [esi]
call convert_register
mov [postbyte_register],al
lods byte [esi]
cmp al,','
jne invalid_operand
call take_register
mov bl,al
xchg bl,[postbyte_register]
call cet_size_check
jmp nomem_instruction_ready
endbr_instruction:
shl eax,24
or eax,1E0FF3h
stos dword [edi]
jmp instruction_assembled
 
take_register:
lods byte [esi]
call get_size_operator
cmp al,10h
jne invalid_operand
lods byte [esi]
convert_register:
mov ah,al
shr ah,4
and al,0Fh
cmp ah,8
je match_register_size
cmp ah,4
ja invalid_operand
cmp ah,1
ja match_register_size
cmp al,4
jb match_register_size
or ah,ah
jz high_byte_register
or [rex_prefix],40h
match_register_size:
cmp ah,[operand_size]
je register_size_ok
cmp [operand_size],0
jne operand_sizes_do_not_match
mov [operand_size],ah
register_size_ok:
ret
high_byte_register:
mov ah,1
or [rex_prefix],10h
jmp match_register_size
convert_fpu_register:
mov ah,al
shr ah,4
and al,111b
cmp ah,10
jne invalid_operand
jmp match_register_size
convert_mmx_register:
mov ah,al
shr ah,4
cmp ah,0Ch
je xmm_register
ja invalid_operand
and al,111b
cmp ah,0Bh
jne invalid_operand
mov ah,8
jmp match_register_size
xmm_register:
and al,0Fh
mov ah,16
cmp al,8
jb match_register_size
cmp [code_type],64
jne invalid_operand
jmp match_register_size
convert_xmm_register:
mov ah,al
shr ah,4
cmp ah,0Ch
je xmm_register
jmp invalid_operand
get_size_operator:
xor ah,ah
cmp al,11h
jne no_size_operator
mov [size_declared],1
lods word [esi]
xchg al,ah
or [operand_flags],1
cmp ah,[operand_size]
je size_operator_ok
cmp [operand_size],0
jne operand_sizes_do_not_match
mov [operand_size],ah
size_operator_ok:
ret
no_size_operator:
mov [size_declared],0
cmp al,'['
jne size_operator_ok
and [operand_flags],not 1
ret
get_jump_operator:
mov [jump_type],0
cmp al,12h
jne jump_operator_ok
lods word [esi]
mov [jump_type],al
mov al,ah
jump_operator_ok:
ret
get_address:
and [address_size],0
get_address_of_required_size:
call get_address_prefixes
and [free_address_range],0
call calculate_address
cmp byte [esi-1],']'
jne invalid_address
mov [address_high],edx
mov edx,eax
cmp [address_size_declared],0
jne address_ok
cmp [segment_register],4
ja address_ok
or bx,bx
jnz clear_address_size
cmp [code_type],64
jne address_ok
calculate_relative_address:
mov edx,[address_symbol]
mov [symbol_identifier],edx
mov edx,[address_high]
mov ebp,[addressing_space]
call calculate_relative_offset
mov [address_high],edx
cdq
cmp edx,[address_high]
je address_high_ok
call recoverable_overflow
address_high_ok:
mov edx,eax
ror ecx,16
mov cl,[value_type]
rol ecx,16
mov bx,9900h
clear_address_size:
and ch,not 0Fh
address_ok:
ret
get_address_prefixes:
and [segment_register],0
and [address_size_declared],0
mov al,[code_type]
shr al,3
mov [value_size],al
mov al,[esi]
and al,11110000b
cmp al,60h
jne get_address_size_prefix
lods byte [esi]
sub al,60h
mov [segment_register],al
mov al,[esi]
and al,11110000b
get_address_size_prefix:
cmp al,70h
jne address_size_prefix_ok
lods byte [esi]
sub al,70h
cmp al,2
jb invalid_address_size
cmp al,8
ja invalid_address_size
mov [value_size],al
or [address_size_declared],1
or [address_size],al
cmp al,[address_size]
jne invalid_address_size
address_size_prefix_ok:
ret
operand_16bit:
cmp [code_type],16
je size_prefix_ok
mov [operand_prefix],66h
ret
operand_32bit:
cmp [code_type],16
jne size_prefix_ok
mov [operand_prefix],66h
size_prefix_ok:
ret
operand_64bit:
cmp [code_type],64
jne illegal_instruction
or [rex_prefix],48h
ret
operand_autodetect:
cmp al,2
je operand_16bit
cmp al,4
je operand_32bit
cmp al,8
je operand_64bit
jmp invalid_operand_size
store_segment_prefix_if_necessary:
mov al,[segment_register]
or al,al
jz segment_prefix_ok
cmp al,4
ja segment_prefix_386
cmp [code_type],64
je segment_prefix_ok
cmp al,3
je ss_prefix
jb segment_prefix_86
cmp bl,25h
je segment_prefix_86
cmp bh,25h
je segment_prefix_86
cmp bh,45h
je segment_prefix_86
cmp bh,44h
je segment_prefix_86
ret
ss_prefix:
cmp bl,25h
je segment_prefix_ok
cmp bh,25h
je segment_prefix_ok
cmp bh,45h
je segment_prefix_ok
cmp bh,44h
je segment_prefix_ok
jmp segment_prefix_86
store_segment_prefix:
mov al,[segment_register]
or al,al
jz segment_prefix_ok
cmp al,5
jae segment_prefix_386
segment_prefix_86:
dec al
shl al,3
add al,26h
stos byte [edi]
jmp segment_prefix_ok
segment_prefix_386:
add al,64h-5
stos byte [edi]
segment_prefix_ok:
ret
store_instruction_code:
cmp [vex_required],0
jne store_vex_instruction_code
store_classic_instruction_code:
mov al,[operand_prefix]
or al,al
jz operand_prefix_ok
stos byte [edi]
operand_prefix_ok:
mov al,[opcode_prefix]
or al,al
jz opcode_prefix_ok
stos byte [edi]
opcode_prefix_ok:
mov al,[rex_prefix]
test al,40h
jz rex_prefix_ok
cmp [code_type],64
jne invalid_operand
test al,0B0h
jnz disallowed_combination_of_registers
stos byte [edi]
rex_prefix_ok:
mov al,[base_code]
stos byte [edi]
cmp al,0Fh
jne instruction_code_ok
store_extended_code:
mov al,[extended_code]
stos byte [edi]
cmp al,38h
je store_supplemental_code
cmp al,3Ah
je store_supplemental_code
instruction_code_ok:
ret
store_supplemental_code:
mov al,[supplemental_code]
stos byte [edi]
ret
store_nomem_instruction:
test [postbyte_register],10000b
jz nomem_reg_high_code_ok
or [vex_required],10h
and [postbyte_register],1111b
nomem_reg_high_code_ok:
test [postbyte_register],1000b
jz nomem_reg_code_ok
or [rex_prefix],44h
and [postbyte_register],111b
nomem_reg_code_ok:
test bl,10000b
jz nomem_rm_high_code_ok
or [rex_prefix],42h
or [vex_required],8
and bl,1111b
nomem_rm_high_code_ok:
test bl,1000b
jz nomem_rm_code_ok
or [rex_prefix],41h
and bl,111b
nomem_rm_code_ok:
and [displacement_compression],0
call store_instruction_code
mov al,[postbyte_register]
shl al,3
or al,bl
or al,11000000b
stos byte [edi]
ret
store_instruction:
mov [current_offset],edi
and [displacement_compression],0
test [postbyte_register],10000b
jz reg_high_code_ok
or [vex_required],10h
and [postbyte_register],1111b
reg_high_code_ok:
test [postbyte_register],1000b
jz reg_code_ok
or [rex_prefix],44h
and [postbyte_register],111b
reg_code_ok:
cmp [code_type],64
jne address_value_ok
xor eax,eax
bt edx,31
sbb eax,[address_high]
jz address_value_ok
cmp [address_high],0
jne address_value_out_of_range
test ch,44h
jnz address_value_ok
test bx,8080h
jz address_value_ok
address_value_out_of_range:
call recoverable_overflow
address_value_ok:
call store_segment_prefix_if_necessary
test [vex_required],4
jnz address_vsib
or bx,bx
jz address_immediate
cmp bx,9800h
je address_rip_based
cmp bx,9400h
je address_eip_based
cmp bx,9900h
je address_relative
mov al,bl
or al,bh
and al,11110000b
cmp al,80h
je postbyte_64bit
cmp al,40h
je postbyte_32bit
cmp al,20h
jne invalid_address
cmp [code_type],64
je invalid_address_size
call address_16bit_prefix
test ch,22h
setz [displacement_compression]
call store_instruction_code
cmp bl,bh
jbe determine_16bit_address
xchg bl,bh
determine_16bit_address:
cmp bx,2600h
je address_si
cmp bx,2700h
je address_di
cmp bx,2300h
je address_bx
cmp bx,2500h
je address_bp
cmp bx,2625h
je address_bp_si
cmp bx,2725h
je address_bp_di
cmp bx,2723h
je address_bx_di
cmp bx,2623h
jne invalid_address
address_bx_si:
xor al,al
jmp postbyte_16bit
address_bx_di:
mov al,1
jmp postbyte_16bit
address_bp_si:
mov al,10b
jmp postbyte_16bit
address_bp_di:
mov al,11b
jmp postbyte_16bit
address_si:
mov al,100b
jmp postbyte_16bit
address_di:
mov al,101b
jmp postbyte_16bit
address_bx:
mov al,111b
jmp postbyte_16bit
address_bp:
mov al,110b
postbyte_16bit:
test ch,22h
jnz address_16bit_value
or ch,ch
jnz address_sizes_do_not_agree
cmp edx,10000h
jge value_out_of_range
cmp edx,-8000h
jl value_out_of_range
or dx,dx
jz address
cmp [displacement_compression],2
ja address_8bit_value
je address_16bit_value
cmp dx,80h
jb address_8bit_value
cmp dx,-80h
jae address_8bit_value
address_16bit_value:
or al,10000000b
mov cl,[postbyte_register]
shl cl,3
or al,cl
stos byte [edi]
mov eax,edx
stos word [edi]
ret
address_8bit_value:
or al,01000000b
mov cl,[postbyte_register]
shl cl,3
or al,cl
stos byte [edi]
mov al,dl
stos byte [edi]
ret
address:
cmp al,110b
je address_8bit_value
mov cl,[postbyte_register]
shl cl,3
or al,cl
stos byte [edi]
ret
address_vsib:
mov al,bl
shr al,4
test al,1
jz vsib_high_code_ok
or [vex_register],10000b
or [vex_required],8
xor al,1
vsib_high_code_ok:
cmp al,6
je vsib_index_ok
cmp al,0Ch
jb invalid_address
vsib_index_ok:
mov al,bh
shr al,4
cmp al,4
je postbyte_32bit
cmp [code_type],64
je address_prefix_ok
test al,al
jnz invalid_address
postbyte_32bit:
call address_32bit_prefix
jmp address_prefix_ok
postbyte_64bit:
cmp [code_type],64
jne invalid_address_size
address_prefix_ok:
cmp bl,44h
je invalid_address
cmp bl,84h
je invalid_address
test bh,1000b
jz base_code_ok
or [rex_prefix],41h
base_code_ok:
test bl,1000b
jz index_code_ok
or [rex_prefix],42h
index_code_ok:
test ch,44h or 88h
setz [displacement_compression]
call store_instruction_code
or cl,cl
jz only_base_register
base_and_index:
mov al,100b
xor ah,ah
cmp cl,1
je scale_ok
cmp cl,2
je scale_1
cmp cl,4
je scale_2
or ah,11000000b
jmp scale_ok
scale_2:
or ah,10000000b
jmp scale_ok
scale_1:
or ah,01000000b
scale_ok:
or bh,bh
jz only_index_register
and bl,111b
shl bl,3
or ah,bl
and bh,111b
or ah,bh
sib_ready:
test ch,44h or 88h
jnz sib_address_32bit_value
or ch,ch
jnz address_sizes_do_not_agree
cmp bh,5
je address_value
or edx,edx
jz sib_address
address_value:
cmp [displacement_compression],2
ja sib_address_8bit_value
je sib_address_32bit_value
cmp edx,80h
jb sib_address_8bit_value
cmp edx,-80h
jnb sib_address_8bit_value
sib_address_32bit_value:
or al,10000000b
mov cl,[postbyte_register]
shl cl,3
or al,cl
stos word [edi]
jmp store_address_32bit_value
sib_address_8bit_value:
or al,01000000b
mov cl,[postbyte_register]
shl cl,3
or al,cl
stos word [edi]
mov al,dl
stos byte [edi]
ret
sib_address:
mov cl,[postbyte_register]
shl cl,3
or al,cl
stos word [edi]
ret
only_index_register:
or ah,101b
and bl,111b
shl bl,3
or ah,bl
mov cl,[postbyte_register]
shl cl,3
or al,cl
stos word [edi]
test ch,44h or 88h
jnz store_address_32bit_value
or ch,ch
jnz invalid_address_size
cmp [displacement_compression],2
jbe store_address_32bit_value
mov edx,[uncompressed_displacement]
jmp store_address_32bit_value
zero_index_register:
mov bl,4
mov cl,1
jmp base_and_index
only_base_register:
mov al,bh
and al,111b
cmp al,4
je zero_index_register
test ch,44h or 88h
jnz simple_address_32bit_value
or ch,ch
jnz address_sizes_do_not_agree
or edx,edx
jz simple_address
cmp [displacement_compression],2
ja simple_address_8bit_value
je simple_address_32bit_value
cmp edx,80h
jb simple_address_8bit_value
cmp edx,-80h
jnb simple_address_8bit_value
simple_address_32bit_value:
or al,10000000b
mov cl,[postbyte_register]
shl cl,3
or al,cl
stos byte [edi]
jmp store_address_32bit_value
simple_address_8bit_value:
or al,01000000b
mov cl,[postbyte_register]
shl cl,3
or al,cl
stos byte [edi]
mov al,dl
stos byte [edi]
ret
simple_address:
cmp al,5
je simple_address_8bit_value
mov cl,[postbyte_register]
shl cl,3
or al,cl
stos byte [edi]
ret
address_immediate:
cmp [code_type],64
je address_immediate_sib
test ch,44h or 88h
jnz address_immediate_32bit
test ch,22h
jnz address_immediate_16bit
or ch,ch
jnz invalid_address_size
cmp [code_type],16
je addressing_16bit
address_immediate_32bit:
call address_32bit_prefix
call store_instruction_code
store_immediate_address:
mov al,101b
mov cl,[postbyte_register]
shl cl,3
or al,cl
stos byte [edi]
store_address_32bit_value:
test ch,0F0h
jz address_32bit_relocation_ok
mov eax,ecx
shr eax,16
cmp al,4
jne address_32bit_relocation
mov al,2
address_32bit_relocation:
xchg [value_type],al
mov ebx,[address_symbol]
xchg ebx,[symbol_identifier]
call mark_relocation
mov [value_type],al
mov [symbol_identifier],ebx
address_32bit_relocation_ok:
mov eax,edx
stos dword [edi]
ret
store_address_64bit_value:
test ch,0F0h
jz address_64bit_relocation_ok
mov eax,ecx
shr eax,16
xchg [value_type],al
mov ebx,[address_symbol]
xchg ebx,[symbol_identifier]
call mark_relocation
mov [value_type],al
mov [symbol_identifier],ebx
address_64bit_relocation_ok:
mov eax,edx
stos dword [edi]
mov eax,[address_high]
stos dword [edi]
ret
address_immediate_sib:
test ch,44h
jnz address_immediate_sib_32bit
test ch,not 88h
jnz invalid_address_size
test edx,80000000h
jz address_immediate_sib_store
cmp [address_high],0
je address_immediate_sib_nosignextend
address_immediate_sib_store:
call store_instruction_code
mov al,100b
mov ah,100101b
mov cl,[postbyte_register]
shl cl,3
or al,cl
stos word [edi]
jmp store_address_32bit_value
address_immediate_sib_32bit:
test ecx,0FF0000h
jnz address_immediate_sib_nosignextend
test edx,80000000h
jz address_immediate_sib_store
address_immediate_sib_nosignextend:
call address_32bit_prefix
jmp address_immediate_sib_store
address_eip_based:
mov al,67h
stos byte [edi]
address_rip_based:
cmp [code_type],64
jne invalid_address
call store_instruction_code
jmp store_immediate_address
address_relative:
call store_instruction_code
movzx eax,[immediate_size]
add eax,edi
sub eax,[current_offset]
add eax,5
sub edx,eax
jno @f
call recoverable_overflow
@@:
mov al,101b
mov cl,[postbyte_register]
shl cl,3
or al,cl
stos byte [edi]
shr ecx,16
xchg [value_type],cl
mov ebx,[address_symbol]
xchg ebx,[symbol_identifier]
mov eax,edx
call mark_relocation
mov [value_type],cl
mov [symbol_identifier],ebx
stos dword [edi]
ret
addressing_16bit:
cmp edx,10000h
jge address_immediate_32bit
cmp edx,-8000h
jl address_immediate_32bit
movzx edx,dx
address_immediate_16bit:
call address_16bit_prefix
call store_instruction_code
mov al,110b
mov cl,[postbyte_register]
shl cl,3
or al,cl
stos byte [edi]
mov eax,edx
stos word [edi]
cmp edx,10000h
jge value_out_of_range
cmp edx,-8000h
jl value_out_of_range
ret
address_16bit_prefix:
cmp [code_type],16
je instruction_prefix_ok
mov al,67h
stos byte [edi]
ret
address_32bit_prefix:
cmp [code_type],32
je instruction_prefix_ok
mov al,67h
stos byte [edi]
instruction_prefix_ok:
ret
store_instruction_with_imm8:
mov [immediate_size],1
call store_instruction
mov al,byte [value]
stos byte [edi]
ret
store_instruction_with_imm16:
mov [immediate_size],2
call store_instruction
mov ax,word [value]
call mark_relocation
stos word [edi]
ret
store_instruction_with_imm32:
mov [immediate_size],4
call store_instruction
mov eax,dword [value]
call mark_relocation
stos dword [edi]
ret
/programs/develop/koldbg/font.inc
0,0 → 1,132
fontname equ 'font8x9.bmp'
virtual at 0
file fontname,3Eh
; sanity check
load a1 word from 0
load a2 dword from 0xE
if (a1 <> 'BM') | (a2 <> 0x28)
error 'not BMP file!'
end if
load a1 dword from 0x12
load a2 dword from 0x16
if (a1 and 0xF) | (a2 and 0xF) | (a1 > 16*16)
error 'font: invalid width or height'
end if
FontWidth = a1 shr 4
font_bmp_scanline = (FontWidth*2 + 3) and not 3
FontHeight = a2 shr 4
load a1 dword from 0x1A
if a1 <> 0x10001
error 'font: not monochrome bitmap'
end if
end virtual
 
Font:
macro set_name_test a,b
{
if %=a
font_data_#a = b
end if
}
macro set_name b
{
set_name_test 1,b
set_name_test 2,b
set_name_test 3,b
set_name_test 4,b
set_name_test 5,b
set_name_test 6,b
set_name_test 7,b
set_name_test 8,b
set_name_test 9,b
set_name_test 10,b
set_name_test 11,b
set_name_test 12,b
set_name_test 13,b
set_name_test 14,b
set_name_test 15,b
set_name_test 16,b
}
macro db_name_test a
{
if %=a
db font_data_#a
end if
}
macro db_name
{
db_name_test 1
db_name_test 2
db_name_test 3
db_name_test 4
db_name_test 5
db_name_test 6
db_name_test 7
db_name_test 8
db_name_test 9
db_name_test 10
db_name_test 11
db_name_test 12
db_name_test 13
db_name_test 14
db_name_test 15
db_name_test 16
}
macro dw_name_test a
{
if %=a
dw font_data_#a
end if
}
macro dw_name
{
dw_name_test 1
dw_name_test 2
dw_name_test 3
dw_name_test 4
dw_name_test 5
dw_name_test 6
dw_name_test 7
dw_name_test 8
dw_name_test 9
dw_name_test 10
dw_name_test 11
dw_name_test 12
dw_name_test 13
dw_name_test 14
dw_name_test 15
dw_name_test 16
}
repeat FontHeight
cur_scan = %
repeat 16
virtual at 0
file fontname:3Eh + font_bmp_scanline*(FontHeight*(17-%)-cur_scan),FontWidth*2
dd 0
repeat 16
load a1 dword from ((%-1)*FontWidth) shr 3
a1 = ((a1 and 0x55555555) shl 1) or ((a1 and 0xAAAAAAAA) shr 1)
a1 = ((a1 and 0x33333333) shl 2) or ((a1 and 0xCCCCCCCC) shr 2)
a1 = ((a1 and 0x0F0F0F0F) shl 4) or ((a1 and 0xF0F0F0F0) shr 4)
a1 = (a1 shr (((%-1)*FontWidth) and 7)) and ((1 shl FontWidth) - 1)
a1 = a1 xor ((1 shl FontWidth) - 1)
set_name a1
end repeat
end virtual
if FontWidth > 8
repeat 16
dw_name
end repeat
else
repeat 16
db_name
end repeat
end if
end repeat
end repeat
purge set_name_test
purge db_name_test
purge dw_name_test
purge set_name
purge db_name
purge dw_name
/programs/develop/koldbg/font8x9.bmp
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/programs/develop/koldbg/globals!.inc
0,0 → 1,118
 
macro forward_list_builder name {
local c
macro .#name a& \{
\local m
c equ m
macro m a
\}
macro name#List \{
irpv v,c \\{
;\\forward
v
\\}
\}
}
 
macro reverse_list_builder name {
local c
macro .#name a& \{
\local m
c equ m
macro m a
\}
macro name#List \{
irpv v,c \\{
\\reverse
v
\\}
\}
}
 
forward_list_builder IGlobalBlock
forward_list_builder SGlobalBlock
forward_list_builder TGlobalBlock
forward_list_builder UGlobalBlock
forward_list_builder VGlobalBlock
forward_list_builder XGlobalBlock
 
;------------------------------------------------------------------
; use "tglobal" for inserting TLS definitions.
;------------------------------------------------------------------
macro tglobal {
.TGlobalBlock { }
 
macro tglobal_nested {
.TGlobalBlock \{ }
 
;------------------------------------------------------------------
; use "vglobal" for inserting virtual definitions.
;------------------------------------------------------------------
macro vglobal {
.VGlobalBlock { }
 
macro vglobal_nested {
.VGlobalBlock \{ }
 
;------------------------------------------------------------------
; use "iglobal" for inserting initialized global data definitions.
;------------------------------------------------------------------
macro iglobal {
.IGlobalBlock { }
 
macro iglobal_nested {
.IGlobalBlock \{ }
 
;------------------------------------------------------------------
; use "sglobal" for inserting strings definitions.
;------------------------------------------------------------------
macro sglobal {
.SGlobalBlock { }
 
macro sglobal_nested {
.SGlobalBlock \{ }
 
;-------------------------------------------------------------
; use 'uglobal' for inserting uninitialized global definitions.
; even when you define some data values, these variables
; will be stored as uninitialized data.
;-------------------------------------------------------------
macro uglobal {
.UGlobalBlock { }
 
macro uglobal_nested {
.UGlobalBlock \{ }
 
;-------------------------------------------------------------
; use 'xglobal' for inserting uninitialized global definitions.
; even when you define some data values, these variables
; will be stored as uninitialized data.
;-------------------------------------------------------------
macro xglobal {
.XGlobalBlock { }
 
macro xglobal_nested {
.XGlobalBlock \{ }
 
endg fix } ; Use endg for ending iglobal and uglobal blocks.
endg_nested fix \}
 
macro IncludeGlobals MacroName
{
local Begin,Size
virtual at $
Begin = $
MacroName
Size = $-Begin
end virtual
rb Size
}
 
macro IncludeAllGlobals {
IGlobalBlockList
SGlobalBlockList
UDataStr:
IncludeGlobals UGlobalBlockList ;will be zeroed
UDataEnd:
IncludeGlobals XGlobalBlockList ;will be undefined
}
/programs/develop/koldbg/kernel.inc
0,0 → 1,3316
;-----------------------------------------------------------------------------
OS = 0
Loader = 1
;-----------------------------------------------------------------------------
SkipAddr = 8
;-----------------------------------------------------------------------------
Bitness equ 32
;-----------------------------------------------------------------------------
include "globals!.inc"
include "fasm\fasm.asm"
include "disasm\disasm32.asm"
if ~OS
include "loadmap.inc"
end if
include "assemble.inc"
;-----------------------------------------------------------------------------
xglobal
even 16
StdMemStr rb 4*1024
StdMemEnd:
AddMemStr rb 4*1024
AddMemEnd:
endg
;-----------------------------------------------------------------------------
uglobal
even 16
Inst TInstruction
even 16
DefInst TInstruction
endg
;-----------------------------------------------------------------------------
virtual at 0
dq ?
sizeof.dq = $
end virtual
;---------------------------------------;
JccCalls: ;
seto al ; 0
ret ;
setno al ; 1
ret ;
setc al ; 2
ret ;
setnc al ; 3
ret ;
setz al ; 4
ret ;
setnz al ; 5
ret ;
setbe al ; 6
ret ;
seta al ; 7
ret ;
sets al ; 8
ret ;
setns al ; 9
ret ;
setpe al ; A
ret ;
setpo al ; B
ret ;
setl al ; C
ret ;
setge al ; D
ret ;
setle al ; E
ret ;
setg al ; F
ret ;
;-----------------------------------------------------------------------------
ShowCPU:
mov [XPos],3
mov [YPos],0
mov edx,Msg00
call PrintS
movzx edx,[CPUType]
cmp dl,6
jb @F
mov dl,6
@@:
lea edx,[CPUTable+rdx*4]
jmp PrintS
;-----------------------------------------------------------------------------
ShowFPU:
movzx edx,[CPUType]
cmp dl,6
jb @F
mov dl,6
@@:
lea edx,[FPUTable+rdx*8]
jmp PrintS
;-----------------------------------------------------------------------------
DetectCPU:
mov dl,1
push sp
pop ax
cmp ax,sp
jnz .RetCPU
inc edx
pushfw
pop ax
mov cx,ax
xor ah,40h
push ax
popfw
pushfw
pop ax
push cx
popfw
xor ah,ch
jz .RetCPU
inc edx
pushfd
pop eax
mov ecx,eax
btc eax,18
push eax
popfd
pushfd
pop eax
push ecx
popfd
xor eax,ecx
jz .RetCPU
inc edx
mov eax,ecx
btc eax,21
push eax
popfd
pushfd
pop eax
push ecx
popfd
xor eax,ecx
jz .RetCPU
inc edx
xor eax,eax
cpuid
test eax,eax
jz .RetCPU
xor eax,eax
inc eax
cpuid
mov dl,ah
and dl,0Fh
.RetCPU:ret
;-----------------------------------------------------------------------------
DetectFPU:
xor eax,eax
push ax
mov ebp,esp
fninit
fnstcw word [ebp]
mov dx,[ebp]
cmp dh,03h
jnz .Done ; done: no FPU present
inc eax
and word [ebp],0FF7Fh
wait
fldcw word [ebp]
fdisi
fstcw word [ebp]
wait
test byte [ebp],0080h
jnz .Done ; done: 8087 is present
inc eax
fninit
wait
fld1
wait
fldz
wait
fdivp st1,st0
wait
fld st0
wait
fchs
wait
fcompp
wait
fnstsw ax
wait
fnclex
wait
sahf
jz .Done ; done: 80287 is present
inc eax
mov ah,[CPUType]
cmp ah,4
jb .Done ; done: 80387 is present
mov al,ah ; done: 80487+ (build-in)
.Done: or al,al
jz .Exit
mov ecx,8
.Loop: fldz ; set ST(0) to ST(7) to +ZERO
loop .Loop
finit ; reinitialize FPU
.Exit: pop dx
ret
;-----------------------------------------------------------------------------
ClearCmdLine:
mov [XPos],1
mov [YPos],MinHeight-1
mov [Color],7
mov al,32
mov ecx,[CurWidth]
sub ecx,2
.Loop: call PrintC
loop .Loop
ret
;-----------------------------------------------------------------------------
PrintCmdLine:
call ClearCmdLine
mov [XPos],1
lea edx,[Msg50]
jmp PrintS
;-----------------------------------------------------------------------------
Decode: push rax rcx rsi rdi
xor ecx,ecx
mov [Origin],rsi
mov rdi,rsi
@@:
mov rsi,rdi
add rsi,rcx
call GetDataByte
mov [rcx+BufferI],al
inc ecx
cmp cl,15
jb @B
pop rdi rsi rcx rax
pushad
mov [DefInst.Addr],BufferI
mov [TheBufferO],BufferO
call DisAsmLine
mov [rsp+1Ch],rax
popad
add rsi,rax
ret
DisAsmLine:
push rbp
mov al,[CodeType]
mov ah,0
cmp al,16
jz @F
mov ah,1
cmp al,32
jz @F
mov ah,2
@@:
mov [DefInst.Arch],ah
mov [DefInst.Emulated],-1 ;#
lea ebp,[Inst+128]
mov ecx,sizeof.TInstruction
lea esi,[DefInst]
lea edi,[Inst]
rep movsb
mov [SpaceSize],8
call DisAsm
push rax
call PrnAsm
pop rax
pop rbp
ret
;-----------------------------------------------------------------------------
ShowText:
MakeText:
xor ebp,ebp
mov [CPUXPtr],ebp
mov rsi,[CodeAddr]
mov [AddrBuffer],rsi
mov [YPos],0
.Loop: mov [Color],30h
mov [BufferO-1],byte 30h ;Default Color
inc [YPos]
mov [XPos],1
call Decode
mov eax,[_EIP]
inc ebp
cmp [AddrBuffer+(rbp-1)*sizeof.dq],rax
jnz .1
mov [CPUXPtr],ebp
mov [BufferO+SkipAddr+1],byte 10h ;'>>'
cmp [Inst.IsAddress],0
je .1
call CheckJump
cmp [JumpTaken],0
jz .1
mov [BufferO+SkipAddr+2*16+1],byte 18h
mov rax,[Inst.Arg1.Imm]
cmp rax,rsi
jbe .1
.0: mov [BufferO+SkipAddr+2*16+1],byte 19h
 
.1: mov [AddrBuffer+rbp*sizeof.dq],rsi
lea edx,[BufferO]
cmp byte [rdx-1],30h
jnz .2
mov ax,'+'
xchg ax,[rdx+9+9]
cmp al,32
ifz mov [rdx+9+9],al
call PrintS
add edx,9+15*2
jmp .3
.2: mov eax,edx
.N: cmp [eax],byte 32
jz .F
inc eax
jmp .N
.F: mov [rax],byte 0
sub eax,edx
cmp eax,(MinWidth-2)
jbe .X
mov [rdx+(MinWidth-2)],byte 0
.X: add edx,43
mov [Color],30h
mov [XPos],9+15*2-(9+9)+3
call PrintS
sub edx,43
mov al,[rdx-1]
mov [Color],al
mov [XPos],1
.3: call PrintS
mov rax,[AddrBuffer+(rbp-1)*sizeof.dq]
call BChk
cmp ebp,28
jb .Loop
ret
;-----------------------------------------------------------------------------
BChk: push rbp rbx rcx rsi rdi
xor ebp,ebp
.001: cmp [DrXBreak+rbp*4],eax
jnz .NotFound
push rax
mov esi,1
movzx edi,[YPos]
mov ecx,[CurWidth]
sub ecx,25
mov ax,7F00h
call Cursor
mov eax,ebp ; EBP = breakpoint number
shl eax,16
add eax,60306023h ; show #X (X=BrkPnt)
add esi,ecx ; adjust X-pos
push rdx
mov edx,[CurWidth]
add edx,edx
imul edx,edi
lea esi,[rdx+rsi*2]
add esi,ConsoleDataPtr
mov [rsi],eax
pop rdx
pop rax
.NotFound:
inc ebp
cmp ebp,4
jnz .001
 
push rax
call FindEnabledBreakPoint;FindBreakPoint
inc eax
jz .NoFound2
mov esi,1
movzx edi,[YPos]
mov ecx,[CurWidth]
sub ecx,21
mov ax,7F00h
call Cursor
.NoFound2:
pop rax
 
pop rdi rsi rcx rbx rbp
ret
;-----------------------------------------------------------------------------
CheckJump:
pushf
push rax rdx
pushf
and dword [rsp],$FFFFF700
mov eax,[_EFL]
and eax,000008FFh
or [rsp],eax
mov rax,[Inst.SaveRSI]
movzx edx,byte [rax-2]
movzx eax,byte [rax-1]
mov [JumpTaken],ah ;ah=0
cmp al,0xE8
jz .2
cmp al,0xE9
jz .2
cmp al,0xEB
jz .2
cmp al,0xE0 ;LOOPNZ
jz .3
cmp al,0xE1 ;LOOPZ
jz .4
cmp al,0xE2 ;LOOP
jz .5
cmp al,0xE3 ;JxCXZ
jz .6
and al,7Fh ;70-7F
cmp al,0Fh ;0F80-0F8F
jbe .1
sub al,70h
.1:
popf
lea eax,[JccCalls+rax*4]
call rax
mov [JumpTaken],al
pop rdx rax
popf
ret
.2:
mov [JumpTaken],1
popf
pop rdx rax
popf
ret
.3:
popf
call JccCalls+5*4
mov [JumpTaken],al
call TypeLoop
pop rdx rax
popf
ret
.4:
popf
call JccCalls+4*4
mov [JumpTaken],al
call TypeLoop
pop rdx rax
popf
ret
.5:
popf
call TypeLoop
pop rdx rax
popf
ret
.6:
popf
call TypeJxCXZ
pop rdx rax
popf
ret
;-----------------------------------------------------------------------------
TypeJxCXZ:
cmp [CodeType],32
jz JCXZ32
cmp [CodeType],16
jz JCXZ16
if %B=64
cmp dl,67h
jnz .1
cmp [Reg.ECX],0
jmp .2
.1: cmp [Reg.RCX],0
.2: setz [JumpTaken]
end if
ret
;-----------------------------------------------------------------------------
JCXZ16: cmp dl,67h
jz .1
cmp word [_ECX],0
setz [JumpTaken]
jmp .2
.1: cmp [_ECX],0
setz [JumpTaken]
.2: ret
;-----------------------------------------------------------------------------
JCXZ32: cmp dl,67h
jz .1
cmp [_ECX],0
setz [JumpTaken]
jmp .2
.1: cmp word [_ECX],0
setz [JumpTaken]
.2: ret
;-----------------------------------------------------------------------------
TypeLoop:
cmp [CodeType],32
jz .32
cmp [CodeType],16
jz .16
if %B=64
mov rax,[_RCX]
cmp dl,67h ; check for ECX or RCX == 0
jnz .1X
mov eax,eax
.1X: dec rax
setnz al
or [JumpTaken],al
end if
ret
.32: mov eax,[_ECX]
cmp dl,67h ; check for CX or ECX == 0
jnz .1Y
movzx eax,ax
.1Y: dec eax
setnz al
or [JumpTaken],al
ret
.16: mov eax,[_ECX]
cmp dl,67h ; check for CX or ECX == 0
jz .1Z
movzx eax,ax
.1Z: dec eax
setnz al
or [JumpTaken],al
ret
;-----------------------------------------------------------------------------
CPUCursor:
mov esi,[CPUXPos]
mov edi,[CPUYPos]
mov ecx,[CurWidth]
sub ecx,23
mov ax,2F00h
call Cursor
mov eax,[CPUYPos]
mov rsi,[(rax-1)*sizeof.dq+AddrBuffer]
call Decode
call ShowAddress
ret
;-----------------------------------------------------------------------------
RegCursor:
mov esi,[RegXPos]
mov edi,[RegYPos]
mov ecx,[RegLDat]
jmp CursorXY
;-----------------------------------------------------------------------------
MemCursor:
mov esi,[MemXPos]
mov edi,[MemYPos]
mov ecx,2
mov ax,2F00h
jmp Cursor
;-----------------------------------------------------------------------------
StkCursor:
mov esi,[StkXPos]
mov edi,[StkYPos]
mov ecx,20
mov ax,2F00h
jmp Cursor
;-----------------------------------------------------------------------------
CursorXY:
pushad
mov eax,[CurWidth]
add eax,eax
imul eax,edi
lea esi,[rax+rsi*2]
add esi,ConsoleDataPtr
.Loop: mov al,[rsi+1]
cmp al,17h
jz .1
cmp al,1Fh
jz .2
cmp al,30h
jz .3
cmp al,3Fh
jz .4
jmp .Next
.1: mov al,3Fh
jmp .Next
.2: mov al,30h
jmp .Next
.3: mov al,1Fh
jmp .Next
.4: mov al,17h
.Next: mov [rsi+1],al
add esi,2
dec cl
jnz .Loop
popad
ret
;-----------------------------------------------------------------------------
Cursor: push rcx rdx rsi
mov edx,eax
mov eax,[CurWidth]
add eax,eax
imul eax,edi
xchg edx,eax
lea esi,[rdx+rsi*2]
add esi,ConsoleDataPtr
.Loop: xor [rsi],ax
add esi,2
dec cl
jnz .Loop
pop rsi rdx rcx
ret
;-----------------------------------------------------------------------------
ShowCursor:
mov ebp,CursorTab
GotoWindow:
mov ebx,[CurrentWindow]
and ebx,3
jmp dword [rbp+rbx*4]
;-----------------------------------------------------------------------------
WindowSwitch:
test [CtrlState],3
jz .1
dec [CurrentWindow]
jmp .2
.1: inc [CurrentWindow]
.2: and [CurrentWindow],3
xor eax,eax
WinSwitch:
mov [AfterKey],1
call ShowImage
mov ebp,WindowTab
jmp GotoWindow
;-----------------------------------------------------------------------------
DrawChar:
mov [rdi+rdx*2],ax
inc edx
ret
;-----------------------------------------------------------------------------
DrawLine:
mov [rdi+rdx*2],ax
inc edx
loop DrawLine
ret
;-----------------------------------------------------------------------------
DrawDown:
mov [rdi+rdx*2],ax
add edx,[CurWidth]
loop DrawDown
ret
;-----------------------------------------------------------------------------
PrintAL:push rdi
mov edi,HexBuf
call MakeHex
lea edi,[rdi+6]
jmp PrintHex
;-----------------------------------------------------------------------------
PrintAX:push rdi
mov edi,HexBuf
call MakeHex
lea edi,[rdi+4]
jmp PrintHex
;-----------------------------------------------------------------------------
PrintEAX:
push rdi
mov edi,HexBuf
call MakeHex
PrintHex:
push rdx
mov edx,edi
call PrintS
pop rdx rdi
ret
;-----------------------------------------------------------------------------
MakeHex:push rax rdx rsi
mov edx,3
.Loop: mov esi,eax
and eax,$FF
mov ax,[rax*2+HexString]
mov [rdi+rdx*2],ax
mov eax,esi
shr eax,8
sub edx,1
jnc .Loop
pop rsi rdx rax
ret
;-----------------------------------------------------------------------------
DrawFrame:
mov ah,3Fh ; color
mov edi,ConsoleDataPtr
xor edx,edx
xor ecx,ecx
 
mov al, 'É'
call DrawChar
mov al, 'Í'
mov cl,byte [CurWidth]
sub cl,2
call DrawLine
mov al, '»'
call DrawChar
 
mov al, 'º' ; left border
mov edx,[CurWidth]
mov cl,byte [CurHeight]
sub cl,2
call DrawDown
mov al, 'È'
call DrawChar
mov al, 'º' ; right border
imul edx,[CurWidth],2
dec edx
mov cl,byte [CurHeight]
sub cl,2
call DrawDown
mov al, '¼'
call DrawChar
 
mov al, 'Ç'
imul edx,[CurWidth],29
call DrawChar
mov al, 'Ä'
mov cl,byte [CurWidth]
sub cl,2
call DrawLine
mov al, '¶'
call DrawChar
 
mov al, 'Ç'
imul edx,[CurWidth],40
call DrawChar
mov al, 'Ä'
mov cl,byte [CurWidth]
sub cl,(2+45)
call DrawLine
mov al, '´'
call DrawChar
 
mov al, 'Ç'
imul edx,[CurWidth],49
call DrawChar
mov al, 'Ä'
mov cl,byte [CurWidth]
sub cl,2
call DrawLine
mov al, '¶'
call DrawChar
 
mov al, 'Â'
imul edx,[CurWidth],30
sub edx,46
call DrawChar
imul edx,[CurWidth],31
sub edx,46
mov al, '³'
mov cl,10
call DrawDown
 
imul edx,[CurWidth],40
sub edx,46
mov al, '³'
mov cl,10
call DrawDown
 
mov al, 'Ã'
imul edx,[CurWidth],46
sub edx,46
call DrawChar
mov al, 'Ä'
mov cl,44
call DrawLine
mov al, '¶'
call DrawChar
mov al, 'Ñ'
mov edx,[CurWidth]
sub edx,22
call DrawChar
 
mov al, '³'
imul edx,[CurWidth],2
sub edx,22
mov cl,28
call DrawDown
mov al, 'Á'
call DrawChar
 
mov al, 'Ã'
imul edx,[CurWidth],42
sub edx,46
call DrawChar
mov al, 'Ä'
mov cl,44
call DrawLine
mov al, '¶'
call DrawChar
 
mov al, 'Ã'
imul edx,[CurWidth],34
sub edx,46
call DrawChar
mov al, 'Ä'
mov cl,44
call DrawLine
mov al, '¶'
call DrawChar
 
mov al, 'Ã'
imul edx,[CurWidth],38
sub edx,46
call DrawChar
mov al, 'Ä'
mov cl,44
call DrawLine
mov al, '¶'
call DrawChar
mov al, '´'
imul edx,[CurWidth],41
sub edx,46
call DrawChar
mov al, 'Á'
imul edx,[CurWidth],50
sub edx,46
call DrawChar
if 1
mov al, 'Ç'
imul edx,[CurWidth],MinHeight-2-(MSG_HEIGHT-1)-1
call DrawChar
mov al, 'Ä'
mov cl,byte [CurWidth]
sub cl,2
call DrawLine
mov al, '¶'
call DrawChar
end if
mov [Color],3Ah
call ShowCPU
call ShowFPU
mov [Color],3Ah
mov [XPos],3
mov [YPos],29
lea edx,[Msg10]
call PrintS
mov [Color],30h
mov [XPos],1
inc [YPos]
lea edx,[Msg11]
call PrintS
mov [XPos],1
inc [YPos]
lea edx,[Msg12]
call PrintS
mov [XPos],1
inc [YPos]
lea edx,[Msg13]
call PrintS
mov [XPos],1
inc [YPos]
lea edx,[Msg14]
call PrintS
mov [XPos],1
inc [YPos]
lea edx,[Msg15]
call PrintS
mov [XPos],1
inc [YPos]
lea edx,[Msg16]
call PrintS
mov [XPos],1
inc [YPos]
lea edx,[Msg17]
call PrintS
mov [XPos],1
inc [YPos]
lea edx,[Msg18]
call PrintS
mov [XPos],1
inc [YPos]
lea edx,[Msg19]
call PrintS
mov [XPos],1
inc [YPos]
lea edx,[Msg20]
call PrintS
mov [XPos],3
inc [YPos]
mov [Color],3Ah
lea edx,[Msg21]
call PrintS
mov eax,[CurWidth]
sub eax,43
mov [XPos],al
mov [YPos],29
lea edx,[MsgX2]
call PrintS
mov eax,[CurWidth]
sub eax,43
mov [XPos],al
mov [YPos],33
lea edx,[MsgX3]
call PrintS
mov eax,[CurWidth]
sub eax,43
mov [XPos],al
mov [YPos],37
lea edx,[MsgX4]
call PrintS
mov eax,[CurWidth]
sub eax,43
mov [XPos],al
mov [YPos],41
lea edx,[Msg22]
call PrintS
mov eax,[CurWidth]
sub eax,43
mov [XPos],al
mov [YPos],45
lea edx,[Msg23]
call PrintS
mov eax,[CurWidth]
sub eax,19
mov [XPos],al
mov [YPos],0
lea edx,[Msg30]
call PrintS
mov [XPos],3
mov [YPos],MinHeight-2-(MSG_HEIGHT-1)-1
lea edx,[Msg3M]
call PrintS
mov eax,[CurWidth]
sub eax,51-23
mov [XPos],al
mov [YPos],MinHeight-2-(MSG_HEIGHT-1)-1
lea edx,[Msg40]
call PrintS
 
cmp [DebuggeePID],0
jz .Exit
 
call MakeText
btr dword [AfterKey],0
jc .0
 
cmp [CPUXPtr],0
jnz .1
mov eax,[_EIP]
mov [CodeAddr],rax
mov [CPUYPos],1
.0:
mov ebx,28 ;dY
mov ecx,[CurWidth] ;\dX
sub ecx,23 ;/
mov esi,1 ;X
mov edi,1 ;Y
mov edx,3F203F20h
call ClearWindow
call MakeText
jmp .2
.1: mov eax,[CPUXPtr]
mov [CPUYPos],eax
mov rsi,[AddrBuffer+(rax-1)*sizeof.dq]
call Decode
call ShowAddress
.2:
call ShowRegs
call ShowData
call ShowCursor
.Exit:
mov eax,PrintCmdLine
cmp [CmdLineActive],0
ifnz mov eax,DrawCmdLine
call eax
 
mov edx,Messages
push MSG_WIDTH
pop esi
xor ecx,ecx
@@:
mov eax,MinHeight-2-(MSG_HEIGHT-1)
add eax,ecx
mov [XPos],1
mov [YPos],al
mov [Color],8Fh
xor ebp,ebp
.Loop:
mov al,[rdx+rbp]
cmp al,8
jnz .NoColor
inc ebp
mov al,[rdx+rbp]
mov [Color],al
jmp .Next
.NoColor:
call PrintC
.Next:
inc ebp
cmp ebp,MSG_WIDTH
jnz .Loop
inc ecx
add edx,esi
cmp edx,Messages+MSG_WIDTH*MSG_HEIGHT
jb @B
 
mov esi,[PrgNamePtr]
mov edi,HeaderE-61
mov ecx,60
@@:
lodsb
stosb
or al,al
loopnz @B
 
mov eax,71
mov ebx,2
mov dl,1 ;CP866
mov ecx,HeaderN
cmp [DebuggeePID],0
jz @F
mov ecx,HeaderY
@@: int 40h
ret
;-----------------------------------------------------------------------------
ShowRegs:
call ShowGRegs
call ShowSRegs
call ShowXRegs
call ShowSlide
if 0
jmp ShowMode
else
ret
end if
;-----------------------------------------------------------------------------
PrintC: push rax rdx rdi rbx
mov bl,byte [CurWidth]
mov bh,byte [CurHeight]
cmp al,09h
jz .09
cmp al,0Ah
jz .0A
cmp al,0Dh
jz .0D
;
mov edi,eax
movzx eax,[YPos]
mul [CurWidth]
movzx edx,[XPos]
add edx,eax
mov eax,edi
mov edi,ConsoleDataPtr
;
mov ah,[Color]
mov [rdi+rdx*2],ax
inc [XPos]
cmp [XPos],bl
jb .Done
mov [XPos],0
jmp .0A
.0D: pop rbx rdi rdx rax
mov [XPos],ah
ret
.09: and [XPos],$F8
add [XPos],8
cmp [XPos],bl
jb .Done
sub [XPos],bl
.0A: inc [YPos]
cmp [YPos],bh
jb .Done
mov [YPos],0
.Done: pop rbx rdi rdx rax
ret
;-----------------------------------------------------------------------------
PrintS: push rax rdx
mov ah,[XPos]
.Loop: mov al,[rdx]
inc edx
test al,al
jz .Done
cmp al,08h
jz .1
call PrintC
jmp .Loop
.1: mov al,[rdx]
inc edx
test al,al
jz .Done
mov [Color],al
jmp .Loop
.Done: pop rdx rax
ret
;-----------------------------------------------------------------------------
ShowGRegs:
mov dl,5
mov [YPos],30
mov [XPos],dl
lea rbp,[_EAX]
call DisplayIfChanged
lea rbp,[_EBX]
call DisplayIfChanged
lea rbp,[_ECX]
call DisplayIfChanged
lea rbp,[_EDX]
call DisplayIfChanged
lea rbp,[_ESI]
call DisplayIfChanged
lea rbp,[_EDI]
call DisplayIfChanged
lea rbp,[_EBP]
call DisplayIfChanged
lea rbp,[_ESP]
DisplayIfChanged:
mov rax,[rbp]
cmp rax,[rbp+Plus]
mov [Color],30h
jz @F
mov [Color],3Fh
@@: call PrintEAX
inc [YPos]
mov [XPos],dl
ret
;-----------------------------------------------------------------------------
ShowXRegs:
mov dl,18
mov [YPos],30
mov [XPos],dl
lea rbp,[_EFL]
call DisplayIfChanged
lea rbp,[_EIP]
call DisplayIfChanged
ret
;-----------------------------------------------------------------------------
ShowSlide:
mov [XPos],1
mov [YPos],39
mov esi,[_EFL]
mov edi,[_EFL+Plus]
shl esi,14
shl edi,14
call .Show ; VM-flag
call .Show ; RF-flag
shl esi,1
shl edi,1
call .Show ; NT-flag
call .Show ; IOPL-flag
dec [XPos]
call .Show
call .Show ; OF-flag
call .Show ; DF-flag
call .Show ; IF-flag
call .Show ; TF-flag
call .Show ; SF-flag
inc [XPos]
call .Show ; ZF-flag
shl esi,1
shl edi,1
call .Show ; AF-flag
shl esi,1
shl edi,1
call .Show ; PF-flag
shl esi,1
shl edi,1
.Show: xor ax,ax
shl esi,1
adc al,'0'
shl edi,1
adc ah,'0'
cmp al,ah
mov [Color],30h
jz .S1
mov [Color],3Fh
.S1: call PrintC
inc [XPos]
ret
;-----------------------------------------------------------------------------
ShowSRegs:
mov dl,17
mov [YPos],32
mov eax,cs
call .DisplaySel
mov eax,ds
call .DisplaySel
mov eax,es
call .DisplaySel
mov eax,fs
call .DisplaySel
mov eax,gs
call .DisplaySel
mov eax,ss
.DisplaySel:
mov [Color],31h
mov [XPos],dl
call PrintAX
add [XPos],10
lar eax,ax
shr eax,8
call PrintAX
inc [YPos]
ret
;-----------------------------------------------------------------------------
ShowData:
mov bl,8
mov [YPos],41
mov [Color],30h
mov rsi,[DataAddr]
call ShowDataX
mov bl,3
xor ebp,ebp
mov edi,[_EDX]
mov [YPos],30
call ShowDataRDX
mov bl,3
xor ebp,ebp
mov edi,[_EBX]
mov [YPos],34
call ShowDataRBX
mov bl,3
xor ebp,ebp
mov edi,[_ESI]
mov [YPos],42
call ShowDataRSI
mov bl,3
xor ebp,ebp
mov edi,[_EDI]
mov [YPos],46
call ShowDataRDI
mov bl,3
xor ebp,ebp
mov edi,[_EBP]
mov [YPos],38
call ShowDataRBP
call ShowStack32
call ShowFPURegs
cmp [MMXType],0
ifnz call ShowMMXRegs
cmp [XMMType],0
ifnz call ShowXMMRegs
ret
;-----------------------------------------------------------------------------
ShowDataX:
.1: mov [Color],30h
mov [XPos],1
mov rax,rsi
call PrintEAX
mov al,':'
call PrintC
inc [XPos]
mov ecx,35 by 8
.2: mov [Color],30h
call GetDataByte
jc .3
lea eax,[Msg2ER]
xchg eax,edx
call PrintS
xchg eax,edx
mov al,'?'
jmp .5
.3: call PrintAL
test al,al
jz .4
cmp al,08h
jz .4
cmp al,09h
jz .4
cmp al,0Ah
jz .4
cmp al,0Dh
jnz .5
.4: mov al,'.'
.5: xchg [XPos],ch
call PrintC
xchg [XPos],ch
inc [XPos]
inc rsi
dec cl
jnz .2
inc [YPos]
dec bl
jnz .1
ret
;-----------------------------------------------------------------------------
ShowDataRSI:
.1: mov eax,[CurWidth]
sub eax,29+16
mov [XPos],al
mov rax,rbp
test rbp,rbp
lea edx,[Msg2SIP]
jns .01
lea edx,[Msg2SIM]
neg rax
.01: call PrintS
call PrintAL
mov al,']'
call PrintC
mov al,32
test rbp,rbp
jnz .03
mov al,10h
.03: call PrintC
inc [XPos]
.04: mov ecx,[CurWidth]
sub ecx,5+5
shl ecx,8
mov cl,8
.2: lea rsi,[rdi+rbp]
mov al,3 ;ds
call GetDataByte
jc .3
lea edx,[Msg2ER]
call PrintS
mov al,'?'
jmp .5
.3: call PrintAL
test al,al
jz .4
cmp al,08h
jz .4
cmp al,09h
jz .4
cmp al,0Ah
jz .4
cmp al,0Dh
jnz .5
.4: mov al,'.'
.5: xchg [XPos],ch
call PrintC
xchg [XPos],ch
inc [XPos]
inc rbp
dec cl
jnz .2
inc [YPos]
dec bl
jnz .1
ret
ShowDataRDI:
.1: mov eax,[CurWidth]
sub eax,29+16
mov [XPos],al
mov rax,rbp
test rbp,rbp
lea edx,[Msg2DIP]
jns .01
lea edx,[Msg2DIM]
neg rax
.01: call PrintS
call PrintAL
mov al,']'
call PrintC
mov al,32
test rbp,rbp
jnz .03
mov al,10h
.03: call PrintC
inc [XPos]
.04: mov ecx,[CurWidth]
sub ecx,5+5
shl ecx,8
mov cl,8
.2: lea rsi,[rdi+rbp]
mov al,0 ;es
call GetDataByte
jc .3
lea edx,[Msg2ER]
call PrintS
mov al,'?'
jmp .5
.3: call PrintAL
test al,al
jz .4
cmp al,08h
jz .4
cmp al,09h
jz .4
cmp al,0Ah
jz .4
cmp al,0Dh
jnz .5
.4: mov al,'.'
.5: xchg [XPos],ch
call PrintC
xchg [XPos],ch
inc [XPos]
inc rbp
dec cl
jnz .2
inc [YPos]
dec bl
jnz .1
ret
ShowDataRBX:
.1: mov eax,[CurWidth]
sub eax,29+16
mov [XPos],al
mov rax,rbp
test rbp,rbp
lea edx,[Msg2BXP]
jns .01
lea edx,[Msg2BXM]
neg rax
.01: call PrintS
call PrintAL
mov al,']'
call PrintC
mov al,32
test rbp,rbp
jnz .03
mov al,10h
.03: call PrintC
inc [XPos]
.04: mov ecx,[CurWidth]
sub ecx,5+5
shl ecx,8
mov cl,8
.2: lea rsi,[rdi+rbp]
mov al,3 ;ds
call GetDataByte
jc .3
lea edx,[Msg2ER]
call PrintS
mov al,'?'
jmp .5
.3: call PrintAL
test al,al
jz .4
cmp al,08h
jz .4
cmp al,09h
jz .4
cmp al,0Ah
jz .4
cmp al,0Dh
jnz .5
.4: mov al,'.'
.5: xchg [XPos],ch
call PrintC
xchg [XPos],ch
inc [XPos]
inc rbp
dec cl
jnz .2
inc [YPos]
dec bl
jnz .1
ret
;-----------------------------------------------------------------------------
ShowDataRDX:
.1: mov eax,[CurWidth]
sub eax,29+16
mov [XPos],al
mov rax,rbp
test rbp,rbp
lea edx,[Msg2DXP]
jns .01
lea edx,[Msg2DXM]
neg rax
.01: call PrintS
call PrintAL
mov al,']'
call PrintC
mov al,32
test rbp,rbp
jnz .03
mov al,10h
.03: call PrintC
inc [XPos]
.04: mov ecx,[CurWidth]
sub ecx,5+5
shl ecx,8
mov cl,8
.2: lea rsi,[rdi+rbp]
mov al,3 ;ds
call GetDataByte
jc .3
lea edx,[Msg2ER]
call PrintS
mov al,'?'
jmp .5
.3: call PrintAL
test al,al
jz .4
cmp al,08h
jz .4
cmp al,09h
jz .4
cmp al,0Ah
jz .4
cmp al,0Dh
jnz .5
.4: mov al,'.'
.5: xchg [XPos],ch
call PrintC
xchg [XPos],ch
inc [XPos]
inc rbp
dec cl
jnz .2
inc [YPos]
dec bl
jnz .1
ret
;-----------------------------------------------------------------------------
ShowDataRBP:
.1: mov eax,[CurWidth]
sub eax,29+16
mov [XPos],al
mov rax,rbp
test rbp,rbp
lea edx,[Msg2BPP]
jns .01
lea edx,[Msg2BPM]
neg rax
.01: call PrintS
call PrintAL
mov al,']'
call PrintC
mov al,32
test rbp,rbp
jnz .03
mov al,10h
.03: call PrintC
inc [XPos]
.04: mov ecx,[CurWidth]
sub ecx,5+5
shl ecx,8
mov cl,8
.2: lea rsi,[rdi+rbp]
mov al,2 ;ss
call GetDataByte
jc .3
lea edx,[Msg2ER]
call PrintS
mov al,'?'
jmp .5
.3: call PrintAL
test al,al
jz .4
cmp al,08h
jz .4
cmp al,09h
jz .4
cmp al,0Ah
jz .4
cmp al,0Dh
jnz .5
.4: mov al,'.'
.5: xchg [XPos],ch
call PrintC
xchg [XPos],ch
inc [XPos]
inc rbp
dec cl
jnz .2
inc [YPos]
dec bl
jnz .1
ret
;-----------------------------------------------------------------------------
GetSeg: mov edx,TDS
cmp [Inst.DefSeg],VSS
ifz mov edx,TSS
mov al,[Inst.CurSeg]
or al,al
jz .SkipSegm
cmp al,[Inst.DefSeg]
jz .SkipSegm
mov dx,[Inst.SegmName]
.SkipSegm:
mov dx,[rdx+Names]
ret
;-----------------------------------------------------------------------------
GetSegm:mov dx,TDS
cmp [Inst.DefSeg],VSS
ifz mov dx,TSS
mov al,[Inst.CurSeg]
or al,al
jz @F
cmp al,[Inst.DefSeg]
jz @F
mov dx,[Inst.SegmName]
@@:
mov al,0
cmp dx,TES
jz @F
mov al,1
cmp dx,TCS
jz @F
mov al,2
cmp dx,TSS
jz @F
mov al,3
cmp dx,TDS
jz @F
mov al,4
cmp dx,TFS
jz @F
mov al,5
@@:
ret
;-----------------------------------------------------------------------------
GetMemAddress:
;
xor ebx,ebx
mov ecx,1
;
movzx eax,[Inst.Scale]
cmp al,-1
jz @F
mov cl,[eax+AnScale]
@@:
movzx eax,[Inst.Base]
cmp al,-1
jz @F
mov eax,[rax*4+RegVTab]
mov rax,[rax]
call Address2Reg
add rbx,rax
@@:
movzx eax,[Inst.Indx]
cmp al,-1
jz @F
mov eax,[rax*4+RegVTab]
mov rax,[rax]
call Address2Reg
mul rcx
add rbx,rax
@@:
cmp [Inst.DispSize],0
jz @F
mov rax,[Inst.Disp]
call Address2Reg
add rbx,rax
@@:
mov rax,rbx
call Address2Reg
mov rbx,rax
ret
;-----------------------------------------------------------------------------
ShowAddress:
;
mov [Color],3Fh
mov [XPos],15
mov [YPos],ch
mov al,0xCD
mov ecx,[CurWidth]
sub ecx,21+16+1
.LoopX: call PrintC
loop .LoopX
;
mov al,[Inst.Arg1.Mem]
or al,[Inst.Arg2.Mem]
or al,[Inst.Arg3.Mem]
or al,[Inst.Arg4.Mem]
or al,[Inst.Arg5.Mem]
ifz ret
;
call GetSeg
mov [AddressStr],dx
;
call GetMemAddress
if %B=64
rol rax,32
mov edi,AddressStr+3
call MakeHex
rol rax,32
mov edi,AddressStr+3+8
call MakeHex
else
mov edi,AddressStr+3
call MakeHex
end if
mov edi,AddressFin
 
movzx edx,[Inst.RandSize]
and dl,7Fh
movzx ebp,[rdx*2+RndSize+0]
movzx ecx,[rdx*2+RndSize+1]
jrcxz .Exit
lea rsi,[rbx+rcx]
;
cmp edx,3
jnz @F
cmp [Inst.Point],0
jz @F
mov bp,2+1
mov cx,2+2
@@:
;
.Loop:
dec rsi
sub ebp,1
jnz @F
mov [rdi],byte ':'
inc edi
@@:
mov [rdi],word '--'
call GetSegm
call GetDataByte
jnc @F
movzx eax,al
mov ax,[rax*2+HexString]
mov [rdi],ax
@@:
add edi,2
loop .Loop
.Exit:
mov [rdi],word 'h'
 
sub edi,AddressStr
mov eax,[CurWidth]
sub eax,24
sub eax,edi
ifc ret
mov [XPos],al
mov [YPos],0
mov [Color],3Fh
mov edx,AddressStr
jmp PrintS
;-----------------------------------------------------------------------------
Address2Reg:
cmp [Inst.Address],2
jz @F
cmp [Inst.Address],1
mov eax,eax
jz @F
movzx eax,ax
@@:
ret
;-----------------------------------------------------------------------------
sglobal
if %B=32
AddressStr: db '??:xxxxxxxx = '
AddressFin: db 64*2+2 dup 0
else
AddressStr: db '??:xxxxxxxxxxxxxxxx = '
AddressFin db 64*2+2 dup 0
end if
endg
;-----------------------------------------------------------------------------
iglobal
RndSize db 0,0 ;NULL
db 0,1 ;TWORD
db 0,2 ;SWORD
db 0,4 ;DWORD
db 0,8 ;QWORD
db 0,16 ;XWORD
db 0,32 ;YWORD
db 0,52 ;ZWORD -> 64 too large
db 2+1,4+2;FWORD
db 2+1,8+2;TWORD
AnScale db 1,2,4,8
endg
;-----------------------------------------------------------------------------
ClearWindow:
mov ebp,[CurWidth]
mov eax,edi
imul eax,ebp
add eax,eax
lea edi,[rax+rsi*2]
add edi,ConsoleDataPtr
mov eax,edx
lea edx,[rcx*2]
.Loop: push rcx
shr ecx,1
rep stosd
adc cl,cl
rep stosw
pop rcx
sub esi,edx
sub edi,edx
lea esi,[rsi+rbp*2]
lea edi,[rdi+rbp*2]
dec ebx
jnz .Loop
ret
;-----------------------------------------------------------------------------
ShowStack32:
mov [YPos],28
mov [Color],30h
mov cl,28
mov edi,[_ESP]
add rdi,[StckAddr]
.1: mov rax,rdi
sub rax,[_ESP]
mov edx,Msg3SPP
jns .2
neg rax
mov edx,Msg3SPM
.2: mov ebx,[CurWidth]
sub ebx,21
mov [XPos],bl
call PrintS
call PrintAX
mov al,']'
call PrintC
.20:
cmp edi,[_ESP]
mov al,10h
jz .3
cmp edi,[_EBP]
mov al,'>'
jz .3
mov al,20h
.3: call PrintC
lea rsi,[rdi+3]
rept 3
{
call GetDataByte
dec rsi
shl rax,8
}
call GetDataByte
add rdi,4
call PrintEAX
;lea edx,[Spaces32+6]
;call PrintS
dec [YPos]
dec cl
jnz .1
cmp [CurrentWindow],3
jz ShowAddrStk
ret
ShowAddrStk:
mov eax,[CurWidth]
sub eax,51-23-9
mov [XPos],al
mov [YPos],60-2-9+10
mov [Color],3Fh
mov rax,[StckAddr]
add eax,[_ESP]
call PrintEAX
add [XPos],3
mov rsi,rax
call GetDataByte
jc PrintAL
lea edx,[Msg2ER]
jmp PrintS
;-----------------------------------------------------------------------------
FindCodeUp:
mov rax,[AddrBuffer]
sub rax,16 ; average opcode length
.1: inc rax
mov rbx,rax
mov rsi,rax
.2: mov rsi,rbx
mov rdx,rbx
call Decode
cmp rbx,rsi
ja .Done
mov rbx,rsi
sub rsi,[AddrBuffer]
jb .2
.Done: mov rax,rdx
ret
;-----------------------------------------------------------------------------
CPUWindow:
cmp ah,0x0F
jz WindowSwitch
cmp ah,0x3B ; F1 - Toggle Show
jz ToggleShow
cmp ah,0x3C ; F2 - Toggle BP
jz ToggleBP
cmp ah,0x3D ; F3 - Return To
jz ReturnTo
cmp ah,0x3E ; F4 - Here
jz ComeHere
cmp ah,0x40 ; F6 - New EIP
jz NewAddress
cmp ah,0x41 ; F7 - Trace
jz F7
cmp ah,0x42 ; F8 - Step over
jz F8
cmp ah,0x43 ; F9 - Proceed
jz Proceed
cmp ah,0x44 ; F10 - Jump over
jz JumpOver
cmp al,0xB1
jz CPUDn
cmp al,0xB2
jz CPUUp
cmp al,0xB4
jz CPUHome
cmp al,0xB7
jz CPUPgDn
cmp al,0xB8
jz CPUPgUp
cmp ah,0x4B
jz CPULeft
cmp ah,0x4D
jz CPURight
cmp ah,0xE
jz CPUGoToMem
;
cmp al,'a'
jb .Skip1
cmp al,'z'
jbe DoCommandLine
.Skip1:
;
cmp al,'A'
jb .Skip2
cmp al,'Z'
jbe DoCommandLine
.Skip2:
;
jmp WaitEvent
RegWindow:
cmp ah,0x0F
jz WindowSwitch
cmp ah,0x01
jz SwitchCPU
cmp ah,0x3B ; F1 - Toggle Show
jz ToggleShow
;
cmp al,0xB1 ; dn
jz RegDn
cmp al,0xB2 ; up
jz RegUp
cmp al,0xB4 ; home
jz RegHome
cmp al,0xB5 ; end
jz RegEnd
cmp ah,0x4B ; left
jz RegLeft
cmp ah,0x4D ; right
jz RegRight
cmp al,'+' ; '+'
jz RegIncR
cmp al,'-' ; '-'
jz RegDecR
cmp al,'*' ; '*'
jz RegNot
cmp al,'/' ; '/'
jz RegRes
cmp ah,0xE ; BackSpace - GoTo MemAddr
jz RegGoToMem
cmp ah,0x39 ; Space
jz RegXor
;
cmp al,'a'
jb .Skip1
cmp al,'z'
jbe DoCommandLine
.Skip1:
;
cmp al,'A'
jb .Skip2
cmp al,'Z'
jbe DoCommandLine
.Skip2:
;
jmp WaitEvent
MemWindow:
cmp ah,0x0F
jz WindowSwitch
cmp ah,0x01
jz SwitchCPU
cmp ah,0x3B ; F1 - Toggle Show
jz ToggleShow
;
cmp al,0xB1 ; down
jz MemDn
cmp al,0xB2 ; up
jz MemUp
cmp ah,0x4B ; left
jz MemLeft
cmp ah,0x4D ; right
jz MemRight
cmp al,0xB4 ; home
jz MemHome
cmp al,0xB7 ; page-dn
jz MemPageDn
cmp al,0xB8 ; page-up
jz MemPageUp
;
cmp al,'+'
jz MemIncB
cmp al,'-'
jz MemDecB
cmp al,'*'
jz MemNotB
cmp al,'/'
jz MemResB
;
cmp al,'a'
jb .Skip1
cmp al,'z'
jbe DoCommandLine
.Skip1:
;
cmp al,'A'
jb .Skip2
cmp al,'Z'
jbe DoCommandLine
.Skip2:
;
jmp WaitEvent
StkWindow:
cmp ah,0x0F
jz WindowSwitch
cmp ah,0x01
jz SwitchCPU
cmp ah,0x3B ; F1 - Toggle Show
jz ToggleShow
;
cmp al,0xB1 ; dn
jz StkDn
cmp al,0xB2 ; up
jz StkUp
cmp al,0xB4 ; home
jz StkHome
cmp al,0xB7 ; page-dn
jz StkPgDn
cmp al,0xB8 ; page-up
jz StkPgUp
cmp al,'+' ; '+'
jz StkIncV
cmp al,'-' ; '-'
jz StkDecV
cmp al,'*' ; '*'
jz StkNotV
cmp al,'/' ; '/'
jz StkResV
cmp al,0xE ; BackSpace - GoTo MemAddr
jz StkGoToMem
;
cmp al,'a'
jb .Skip1
cmp al,'z'
jbe DoCommandLine
.Skip1:
;
cmp al,'A'
jb .Skip2
cmp al,'Z'
jbe DoCommandLine
.Skip2:
;
jmp WaitEvent
;-----------------------------------------------------------------------------
DoCommandLine:
mov [CmdLineActive],1
jmp GetCommandLine
;-----------------------------------------------------------------------------
Proceed:call GoOn
jmp WaitEvent
;-----------------------------------------------------------------------------
SwitchCPU:
and [CurrentWindow],0
jmp WinSwitch
;-----------------------------------------------------------------------------
ToggleShow:
xor [ShowNames],-1
jmp CPUCommon
;-----------------------------------------------------------------------------
StkUp: mov eax,2
cmp [CodeType],16
je .1
mov eax,4
cmp [CodeType],32
je .1
mov eax,8
.1:
add [StckAddr],rax
jmp StkCommon
;-----------------------------------------------------------------------------
StkDn: mov eax,2
cmp [CodeType],16
je .1
mov eax,4
cmp [CodeType],32
je .1
mov eax,8
.1:
sub [StckAddr],rax
jmp StkCommon
;-----------------------------------------------------------------------------
StkPgUp:mov eax,2*4
cmp [CodeType],16
je .1
mov eax,4*4
cmp [CodeType],32
je .1
mov eax,8*4
.1:
add [StckAddr],rax
jmp StkCommon
;-----------------------------------------------------------------------------
StkPgDn:mov eax,2*4
cmp [CodeType],16
je .1
mov eax,4*4
cmp [CodeType],32
je .1
mov eax,8*4
.1:
sub [StckAddr],rax
jmp StkCommon
;-----------------------------------------------------------------------------
StkHome:
and [StckAddr],0
StkCommon:
jmp CPUCommon
;-----------------------------------------------------------------------------
StkGetAddress:
mov rax,[StckAddr]
add eax,[_ESP]
ret
;-----------------------------------------------------------------------------
StkIncV:call StkGetAddress
mov rsi,rax
mov rdi,rax
call SafeLoadDD
inc rax
call SafeStoreDD
jmp StkCommon
;-----------------------------------------------------------------------------
StkDecV:call StkGetAddress
mov rsi,rax
mov rdi,rax
call SafeLoadDD
dec rax
call SafeStoreDD
jmp StkCommon
;-----------------------------------------------------------------------------
StkNotV:call StkGetAddress
mov rsi,rax
mov rdi,rax
call SafeLoadDD
not rax
call SafeStoreDD
jmp StkCommon
;-----------------------------------------------------------------------------
StkResV:call StkGetAddress
mov rdi,rax
xor eax,eax
call SafeStoreDD
jmp StkCommon
;-----------------------------------------------------------------------------
StkGoToMem:
call StkGetAddress
mov [DataAddr],rax
jmp StkCommon
;-----------------------------------------------------------------------------
RegUp: mov ebp,[RegXPtr]
dec ebp
jns RegCommon
jmp WaitEvent
;-----------------------------------------------------------------------------
RegDn: mov ebp,[RegXPtr]
inc ebp
cmp ebp,17
jb RegCommon
jmp WaitEvent
;-----------------------------------------------------------------------------
RegLeft:
mov ebp,[RegXPtr]
sub ebp,8
jns RegCommon
xor ebp,ebp
jmp RegCommon
;-----------------------------------------------------------------------------
RegRight:
mov ebp,[RegXPtr]
add ebp,8
cmp ebp,17
jb RegCommon
jmp WaitEvent
;-----------------------------------------------------------------------------
RegHome:xor ebp,ebp
jmp RegCommon
;-----------------------------------------------------------------------------
RegEnd: mov ebp,16
jmp RegCommon
;-----------------------------------------------------------------------------
RegXor: mov ebp,[RegXPtr]
cmp ebp,17-8
jae RegIncR.0
jmp WaitEvent
;-----------------------------------------------------------------------------
RegIncR:mov ebp,[RegXPtr]
cmp ebp,17-8
jb .1
.0: mov eax,[RegRTab+rbp*4]
xor [_EFL],eax
jmp RegCommon
.1: mov eax,[RegRTab+rbp*4]
inc dword [rax]
jmp RegCommon
;-----------------------------------------------------------------------------
RegDecR:mov ebp,[RegXPtr]
cmp ebp,17-8
jb .1
mov eax,[RegRTab+rbp*4]
xor [_EFL],eax
jmp RegCommon
.1: mov eax,[RegRTab+rbp*4]
dec dword [rax]
jmp RegCommon
;-----------------------------------------------------------------------------
RegRes: mov ebp,[RegXPtr]
cmp ebp,17-8
jb .1
mov eax,[RegRTab+rbp*4]
not eax
and [_EFL],eax
jmp RegCommon
.1: mov eax,[RegRTab+rbp*4]
and dword [rax],0
jmp RegCommon
;-----------------------------------------------------------------------------
RegNot: mov ebp,[RegXPtr]
cmp ebp,17-8
jb .1
mov eax,[RegRTab+rbp*4]
xor [_EFL],eax
jmp RegCommon
.1: mov eax,[RegRTab+rbp*4]
not dword [rax]
;jmp RegCommon
RegCommon:
mov [RegXPtr],ebp
mov eax,RegXTab
movzx eax,byte [rax+rbp]
mov [RegXPos],eax
mov eax,RegYTab
movzx eax,byte [rax+rbp]
mov [RegYPos],eax
mov eax,RegLTab
movzx eax,byte [rax+rbp]
mov [RegLDat],eax
call SetContext
jmp CPUCommon
;-----------------------------------------------------------------------------
RegGoToMem:
mov ebp,[RegXPtr]
cmp ebp,9
jae GoToMemRAX.Next
mov eax,[RegRTab+rbp*4]
mov rax,[rax]
GoToMemRAX:
mov [DataAddr],rax
.Next: jmp CPUCommon
;-----------------------------------------------------------------------------
MemUp: dec [MemYPos]
cmp [MemYPos],40
ja MemCommon
inc [MemYPos]
sub [DataAddr],8
jmp MemCommon
;-----------------------------------------------------------------------------
MemDn: inc [MemYPos]
cmp [MemYPos],49
jb MemCommon
dec [MemYPos]
add [DataAddr],8
jmp MemCommon
;-----------------------------------------------------------------------------
MemPageUp:
sub [DataAddr],8*8
jmp MemCommon
;-----------------------------------------------------------------------------
MemPageDn:
add [DataAddr],8*8
jmp MemCommon
;-----------------------------------------------------------------------------
MemLeft:sub [MemXPos],3
cmp [MemXPos],11-3
ja MemCommon
add [MemXPos],3*8
jmp MemUp
;-----------------------------------------------------------------------------
MemRight:
add [MemXPos],3
cmp [MemXPos],11-1+3*8
jb MemCommon
sub [MemXPos],3*8
jmp MemDn
;-----------------------------------------------------------------------------
MemHome:and [DataAddr],0
mov [MemXPos],11
MemCommon:
jmp CPUCommon
;-----------------------------------------------------------------------------
MemGetAddress:
xor edx,edx
mov ebx,3
mov eax,[MemXPos]
sub al,11
div ebx
add rax,[DataAddr]
mov ecx,[MemYPos]
sub cl,41
add ecx,ecx
lea rax,[rax+rcx*8]
ret
;-----------------------------------------------------------------------------
MemIncB:call MemGetAddress
mov rsi,rax
mov rdi,rax
call GetDataByte
inc al
call SafeStore
jmp MemCommon
;-----------------------------------------------------------------------------
MemDecB:call MemGetAddress
mov rsi,rax
mov rdi,rax
call GetDataByte
dec al
call SafeStore
jmp MemCommon
;-----------------------------------------------------------------------------
MemNotB:call MemGetAddress
mov rsi,rax
mov rdi,rax
call GetDataByte
not al
call SafeStore
jmp MemCommon
;-----------------------------------------------------------------------------
MemResB:call MemGetAddress
mov rdi,rax
mov al,0
call SafeStore
jmp MemCommon
;-----------------------------------------------------------------------------
ToggleBP:
mov eax,[CPUYPos]
mov rax,[AddrBuffer+(rax-1)*sizeof.dq]
push rax
call FindBreakPoint
mov edx,eax
inc eax
pop rax
jz .NotFound
mov eax,edx
call ClearBreakPoint
jmp .Ret
.NotFound:
mov bl,1
call AddBreakPoint
jnc .Ret
mov esi,aBreakpointLimitExceeded
.SayErr:
call PutMessage
.Ret:
jmp CPUCommon
;-----------------------------------------------------------------------------
ReturnTo:
mov ecx,1024 ; try 1024 instructions
mov esi,[_EIP]
.0: mov ebp,esi
call Decode
mov eax,[BufferO+35+SkipAddr]
mov ebx,'iret'
cmp eax,ebx ; check for IRET
jz .1
and eax,00FFFFFFh
mov ebx,00746572h ;' ter'
cmp eax,ebx ; check for RET
jz .1
mov ebx,00706D6Ah ;' pmj'
cmp eax,ebx ; check for JMP
jz .1
loop .0
jmp WaitEvent
.1: call OnResume.Jmp
jmp WaitEvent
;-----------------------------------------------------------------------------
JumpOver:
mov esi,[_EIP]
call Decode
mov eax,[BufferO+35+SkipAddr]
cmp eax,'call' ; check for CALL
jz .DoIt
cmp eax,'loop' ; check for LOOP..
jz .DoIt
and eax,00FFFFFFh
mov ebx,00746E69h ;' tni'
cmp eax,ebx ; check for INT
jz .DoIt
mov ebx,00706572h ;' per'
cmp eax,ebx ; check for REP
jz .DoIt
mov ebx,00706D6Ah ;' pmj'
cmp eax,ebx ; check for JMP
jz .DoIt
mov ebx,006F6E6Ah ;' onj'
cmp eax,ebx ; check for JNO
jz .DoIt
mov ebx,0065616Ah ;' eaj'
cmp eax,ebx ; check for JAE
jz .DoIt
mov ebx,007A6E6Ah ;' znj'
cmp eax,ebx ; check for JNZ
jz .DoIt
mov ebx,0065626Ah ;' ebj'
cmp eax,ebx ; check for JBE
jz .DoIt
mov ebx,00736E6Ah ;' snj'
mov ebx,00736E6Ah ;' snj'
cmp eax,ebx ; check for JNS
jz .DoIt
mov ebx,0065706Ah ;' epj'
cmp eax,ebx ; check for JPE
jz .DoIt
mov ebx,006F706Ah ;' opj'
cmp eax,ebx ; check for JPO
jz .DoIt
mov ebx,0065676Ah ;' egj'
cmp eax,ebx ; check for JGE
jz .DoIt
mov ebx,00656C6Ah ;' elj'
cmp eax,ebx ; check for JLE
jz .DoIt
and eax,0000FFFFh
mov ebx,00006F6Ah ;' oj'
cmp eax,ebx ; check for JO
jz .DoIt
mov ebx,0000626Ah ;' bj'
cmp eax,ebx ; check for JB
jz .DoIt
mov ebx,00007A6Ah ;' zj'
cmp eax,ebx ; check for JZ
jz .DoIt
mov ebx,0000616Ah ;' aj'
cmp eax,ebx ; check for JA
jz .DoIt
mov ebx,0000736Ah ;' sj'
cmp eax,ebx ; check for JS
jz .DoIt
mov ebx,00006C6Ah ;' lj'
cmp eax,ebx ; check for JL
jz .DoIt
mov ebx,0000676Ah ;' gj'
cmp eax,ebx ; check for JG
jz .DoIt
jmp F7
.DoIt: mov ebp,esi
call OnResume.Jmp
jmp WaitEvent
;-----------------------------------------------------------------------------
ComeHere:
mov eax,[CPUYPos]
mov rax,[AddrBuffer+(rax-1)*sizeof.dq]
push eax
call FindEnabledBreakPoint
pop eax
jz .GoOn
mov bl,5 ; valid enabled one-shot
call AddBreakPoint
jnc .GoOn
mov esi,aBreakpointLimitExceeded
call PutMessage
jmp WaitEvent
.GoOn: call GoOn
jmp WaitEvent
;-----------------------------------------------------------------------------
NewAddress:
mov eax,[CPUYPos]
mov rax,[AddrBuffer+(rax-1)*sizeof.dq]
mov [_EIP],eax
call SetContext
jmp CPUCommon
;-----------------------------------------------------------------------------
CPUUp: cmp [CPUYPos],1
jbe .1
dec [CPUYPos]
mov ebx,[CPUYPos]
mov rsi,[AddrBuffer+(rbx-1)*sizeof.dq]
call Decode
jmp CPUCommon
.1: call FindCodeUp
mov [CodeAddr],rax
jmp CPUCommon
;-----------------------------------------------------------------------------
CPUDn: cmp [CPUYPos],28
jae .1
inc [CPUYPos]
mov ebx,[CPUYPos]
mov rsi,[AddrBuffer+(rbx-1)*sizeof.dq]
call Decode
jmp CPUCommon
.1: mov rax,[AddrBuffer+sizeof.dq]
mov [CodeAddr],rax
jmp CPUCommon
;-----------------------------------------------------------------------------
CPULeft:dec [CodeAddr]
jmp CPUCommon
;-----------------------------------------------------------------------------
CPURight:
inc [CodeAddr]
jmp CPUCommon
;-----------------------------------------------------------------------------
CPUPgUp:mov ecx,28
.1: call FindCodeUp
mov [AddrBuffer],rax
loop .1
mov [CodeAddr],rax
jmp CPUCommon
;-----------------------------------------------------------------------------
CPUPgDn:mov rsi,[AddrBuffer+27*sizeof.dq]
call Decode
mov [CodeAddr],rsi
jmp CPUCommon
;-----------------------------------------------------------------------------
CPUHome:mov eax,[_EIP]
mov [CodeAddr],rax
mov [CPUYPos],1
CPUCommon:
mov [AfterKey],1
call ShowImage
jmp WaitEvent
;-----------------------------------------------------------------------------
SafeLoadDD:
push rcx rsi
mov ecx,4
.Loop: call GetDataByte
ror rax,8
inc rsi
loop .Loop
pop rsi rcx
ret
;-----------------------------------------------------------------------------
CPUGoToMem:
mov eax,[CPUYPos]
mov rsi,[(rax-1)*sizeof.dq+AddrBuffer]
call Decode
mov al,[Inst.Arg1.Mem]
or al,[Inst.Arg2.Mem]
or al,[Inst.Arg3.Mem]
or al,[Inst.Arg4.Mem]
or al,[Inst.Arg5.Mem]
jnz .Mem
;
mov rdx,[Inst.Arg1.Imm]
cmp [Inst.IsAddress],0 ;relative
jnz .Ofs
 
cmp [Inst.MemSeparator],0
jz .NoFar
mov ax,[Inst.Point]
cmp ax,TDWORD
jz .DW2
cmp ax,TFWORD
jz .FW2
.NoFar:
jmp WaitEvent
.DW2:
sub rsi,4
call SafeLoadDD
movzx edx,ax
shr eax,16
jmp .All
.FW2:
sub rsi,6
call SafeLoadDD
mov edx,eax
add rsi,4
call SafeLoadDD
movzx eax,ax
jmp .All
;
.Mem:
;
cmp [Inst.Point],0
jz .Ptr
movzx edx,[Inst.RandSize]
and dl,7Fh
push rdx
call GetLinAddr
pop rdx
cmp dl,3
jz .DW
cmp dl,8
jz .FW
cmp dl,9
jz .TW
jmp WaitEvent
.DW:
mov rsi,rax
call SafeLoadDD
movzx edx,ax
shr eax,16
jmp .All
.FW:
mov rsi,rax
call SafeLoadDD
mov edx,eax
add rsi,4
call SafeLoadDD
movzx eax,ax
jmp .All
.TW:
mov rsi,rax
call SafeLoadDD
mov rdx,rax
add rsi,8
call SafeLoadDD
movzx eax,ax
.All:
;verr eax
;jnz .Err
;mov [Reg.CS],eax
;call SelectorInit
.Ofs:
mov [CodeAddr],rdx
mov [CPUYPos],1
if 0
call RepaintText
jmp ShowRegs
else
jmp CPUCommon
end if
.Err:
jmp WaitEvent
.Ptr:
call GetMemAddress
jmp GoToMemRAX
;-----------------------------------------------------------------------------
GetLinAddr:
call GetSeg
mov [AddressStr],dx
;
xor ebx,ebx
mov ecx,1
;
movzx eax,[Inst.Scale]
cmp al,-1
jz @F
mov cl,[rax+AnScale]
@@:
movzx eax,[Inst.Base]
cmp al,-1
jz @F
mov eax,[rax*4+RegVTab]
mov rax,[rax]
call Address2Reg
add rbx,rax
@@:
movzx eax,[Inst.Indx]
cmp al,-1
jz @F
mov eax,[rax*4+RegVTab]
mov rax,[rax]
call Address2Reg
mul rcx
add rbx,rax
@@:
cmp [Inst.DispSize],0
jz @F
mov rax,[Inst.Disp]
call Address2Reg
add rbx,rax
@@:
mov rax,rbx
call Address2Reg
mov rbx,rax
AddSeg:
if 0
call GetSegm
movzx eax,al
mov rax,[rax*sizeof.dq+ESBase]
add rax,rbx
end if
ret
;-----------------------------------------------------------------------------
ShowFPURegs:
if 1
mov ah,3Fh
xor ecx,ecx
mov edi,ConsoleDataPtr
mov al, 'Â'
imul edx,[CurWidth],49+1
sub edx,31
call DrawChar
mov al, 'Ä'
mov cl,28
call DrawLine
imul edx,[CurWidth],50+1
sub edx,31
mov al, '³'
mov cl,9
call DrawDown
mov al, 'º'
imul edx,[CurWidth],55
dec edx
call DrawChar
if 0
mov al, 'À'
imul edx,[CurWidth],49+1+10
sub edx,31
call DrawChar
mov al, 'Ä'
mov cl,28+1
call DrawLine
end if
end if
mov ebp,[CurWidth]
lea eax,[ebp-28]
mov [Color],3Ah
mov [XPos],al
mov [YPos],49
lea edx,[Msg10F]
call PrintS
mov [Color],30h
lea eax,[ebp-30]
mov [XPos],al
mov [YPos],50
lea edx,[Msg11F]
call PrintS
lea eax,[ebp-30]
mov [XPos],al
inc [YPos]
lea edx,[Msg12F]
call PrintS
lea eax,[ebp-30]
mov [XPos],al
inc [YPos]
lea edx,[Msg13F]
call PrintS
lea eax,[ebp-30]
mov [XPos],al
inc [YPos]
lea edx,[Msg14F]
call PrintS
lea eax,[ebp-30]
mov [XPos],al
inc [YPos]
lea edx,[Msg15F]
call PrintS
lea eax,[ebp-30]
mov [XPos],al
inc [YPos]
lea edx,[Msg16F]
call PrintS
lea eax,[ebp-30]
mov [XPos],al
inc [YPos]
lea edx,[Msg17F]
call PrintS
lea eax,[ebp-30]
mov [XPos],al
inc [YPos]
lea edx,[Msg18F]
call PrintS
lea eax,[ebp-30]
mov [XPos],al
inc [YPos]
lea edx,[Msg19F]
call PrintS
fninit ; reinitialize FPU
.1: lea eax,[ebp-26]
mov [XPos],al
mov [YPos],50
xor edi,edi ; displacement
mov bl,8 ; counter
movzx eax,word [_FTW]
mov [Temp],eax
movzx eax,[_FSW]
shr eax,11
and eax,07h
lea ecx,[rax*2]
ror word [Temp],cl
.Loop: ;
mov [Color],30h
mov eax,dword [_ST0+rdi]
cmp eax,dword [_ST0+rdi+Plus]
jnz .NotEQ
mov eax,dword [_ST0+rdi+4]
cmp eax,dword [_ST0+rdi+Plus+4]
jnz .NotEQ
mov ax,word [_ST0+rdi+8]
cmp ax,word [_ST0+rdi+Plus+8]
jz .YeaEQ
.NotEQ: mov [Color],3Fh
.YeaEQ:
mov eax,[Temp]
ror word [Temp],02h
and eax,0003h
cmp eax,0003h
jz .__ftoa_empty
fld tbyte [_ST0+rdi]
fxam
fstsw ax
mov al,ah
; C= 3 210
and al,01000101b
jz .__ftoa_err ; unsupported number
cmp al,00000001b
jz .__ftoa_NaN ; NaN number
cmp al,00000101b
jz .__ftoa_inf ; infinity
cmp al,01000000b
jz .__ftoa_zero ; zero
cmp al,01000100b
jz .__ftoa_den ; denormal
cmp al,01000001b
jz .__ftoa_unu ; unused
cmp al,01000101b
jz .__ftoa_unu ; unused
mov eax,57
call _float2dec
add eax,17
mov edx,eax ; save exponent in edx
 
sub esp,12
fbstp tbyte [rsp]
mov cx,[rsp+8]
mov esi,[rsp+4]
mov ebp,[rsp+0]
add esp,12
 
mov bh,15
and ch,80h
mov al,'+'
jz .2
mov al,'-'
.2: call PrintC
call __ftoa_char
call PrintC
mov al,'.'
call PrintC
.3: call __ftoa_char
call PrintC
dec bh
jnz .3
 
mov al,'E'
call PrintC
test edx,edx
mov al,'+'
jns .4
mov al,'-'
neg edx
.4: call PrintC
 
mov bh,4
mov eax,edx
xor ebp,ebp
.5: mov ecx,10
xor edx,edx
idiv ecx
shl ebp,8
or ebp,edx
dec bh
jnz .5
 
mov bh,4
.6: mov eax,ebp
add al,30h
shr ebp,8
call PrintC
dec bh
jnz .6
 
.Next: add edi,16
mov eax,[CurWidth]
sub eax,26
mov [XPos],al
inc [YPos]
dec bl
jnz .Loop
 
mov eax,[CurWidth]
sub eax,27
mov [XPos],al
mov [Color],30h
mov ax,[_FCW] ; CW
cmp ax,[_FCW+Plus]
ifnz mov [Color],3Fh
call PrintAX
add [XPos],5
mov [Color],30h
mov ax,[_FSW] ; SW
cmp ax,[_FSW+Plus]
ifnz mov [Color],3Fh
call PrintAX
add [XPos],6
mov [Color],30h
mov ax,word [_FTW] ; Tag
cmp ax,word [_FTW+Plus]
ifnz mov [Color],3Fh
call PrintAX
fwait
ret
 
.__ftoa_err:
lea edx,[Msg1EF1]
jmp .__ftoa_
.__ftoa_NaN:
and ah,00000010h
mov al,'+'
jz .__ftoa_NaN_
mov al,'-'
.__ftoa_NaN_:
lea edx,[Msg1EF2]
mov [rdx],al
jmp .__ftoa_
.__ftoa_inf:
and ah,00000010h
mov al,'+'
jz .__ftoa_inf_
mov al,'-'
.__ftoa_inf_:
lea edx,[Msg1EF3]
mov [rdx],al
jmp .__ftoa_
.__ftoa_zero:
and ah,00000010h
mov al,'+'
jz .__ftoa_zero_
mov al,'-'
.__ftoa_zero_:
lea edx,[Msg1EF4]
mov [rdx],al
jmp .__ftoa_
.__ftoa_den:
and ah,00000010h
mov al,'+'
jz .__ftoa_den_
mov al,'-'
.__ftoa_den_:
lea edx,[Msg1EF5]
mov [rdx],al
jmp .__ftoa_
.__ftoa_unu:
lea edx,[Msg1EF6]
jmp .__ftoa_
.__ftoa_empty:
lea edx,[Msg1EF7]
.__ftoa_:
call PrintS
jmp .Next
 
__ftoa_char:
mov al,cl
shl ebp,1
rcl esi,1
rcl cl,1
shl ebp,1
rcl esi,1
rcl cl,1
shl ebp,1
rcl esi,1
rcl cl,1
shl ebp,1
rcl esi,1
rcl cl,1
shr al,4
add al,30h
ret
 
_float2dec:
sub esp,3*4
fstcw word [rsp]
mov word [rsp+2],03BFh
fldcw word [rsp+2]
mov [rsp+4],eax
fld st0
fxtract
fstp st0
fisubr dword [rsp+4]
fldl2t
fdivp st1,st0
frndint
fist dword [rsp+8]
call _exp10
fmulp st1,st0
fldcw word [rsp]
mov eax,[rsp+2*4]
add esp,3*4
neg eax
ret
 
_exp10: fldl2t
fmulp st1,st0
_exp2: sub esp,2*4
fstcw word [rsp]
mov word [rsp+2],03BFh
fldcw word [rsp+2]
fld st0
frndint
fxch
fsub st0,st1
ftst
fstsw word [rsp+4]
and byte [rsp+5],45h
cmp byte [rsp+5],01h
ja .Err
je .Neg
f2xm1
fld1
faddp st1,st0
fxch
fld1
fscale
fmulp st2,st0
fstp st0
jmp .Done
.Neg: fabs
f2xm1
fld1
faddp st1,st0
fxch
fld1
fscale
fdivrp st2,st0
fstp st0
.Done: fldcw word [rsp]
add esp,2*4
ret
.Err: fstp st0
fstp st0
fld1
jmp .Done
;-----------------------------------------------------------------------------
ShowMMXRegs:
if 1
mov ah,3Fh
xor ecx,ecx
mov edi,ConsoleDataPtr
mov al, 'Â'
imul edx,[CurWidth],49+1
sub edx,52
call DrawChar
imul edx,[CurWidth],50+1
sub edx,52
mov al, '³'
mov cl,9
call DrawDown
mov al, 'º'
imul edx,[CurWidth],54
dec edx
call DrawChar
end if
mov ebx,[CurWidth]
mov bh,bl
sub bh,47
sub bl,51
 
mov [Color],3Ah
mov [XPos],bl
add [XPos],2
mov [YPos],49
lea edx,[MsgMMX]
call PrintS
mov [Color],30h
mov [XPos],bl
mov [YPos],50
lea edx,[MsgMM0]
call PrintS
mov [XPos],bl
inc [YPos]
lea edx,[MsgMM1]
call PrintS
mov [XPos],bl
inc [YPos]
lea edx,[MsgMM2]
call PrintS
mov [XPos],bl
inc [YPos]
lea edx,[MsgMM3]
call PrintS
mov [XPos],bl
inc [YPos]
lea edx,[MsgMM4]
call PrintS
mov [XPos],bl
inc [YPos]
lea edx,[MsgMM5]
call PrintS
mov [XPos],bl
inc [YPos]
lea edx,[MsgMM6]
call PrintS
mov [XPos],bl
inc [YPos]
lea edx,[MsgMM7]
call PrintS
mov [XPos],bl
inc [YPos]
lea edx,[MsgXMMX]
call PrintS
inc [XPos]
add edx,4
mov [Color],3Eh
call PrintS
mov [YPos],50
mov bl,8 ; counter
lea esi,[_MM0]
.Skip: lea ecx,[_MM0+Plus]
.Loop: mov [XPos],bh
mov [Color],30h
mov eax,[rsi+0]
cmp eax,[rcx+0]
jne @F
mov eax,[rsi+4]
cmp eax,[rcx+4]
je .@
@@: mov [Color],3Fh
.@: mov eax,[rsi+4]
call PrintEAX
mov eax,[rsi+0]
call PrintEAX
inc [YPos]
add esi,16
add ecx,16
dec bl
jnz .Loop
ret
;-----------------------------------------------------------------------------
ShowXMMRegs:
mov [Color],3Ah
mov [XPos],3
mov [YPos],49
lea edx,[MsgXMM]
call PrintS
mov [Color],30h
mov [XPos],1
mov [YPos],50
lea edx,[MsgXM0]
call PrintS
mov [XPos],1
inc [YPos]
lea edx,[MsgXM1]
call PrintS
mov [XPos],1
inc [YPos]
lea edx,[MsgXM2]
call PrintS
mov [XPos],1
inc [YPos]
lea edx,[MsgXM3]
call PrintS
mov [XPos],1
inc [YPos]
lea edx,[MsgXM4]
call PrintS
mov [XPos],1
inc [YPos]
lea edx,[MsgXM5]
call PrintS
mov [XPos],1
inc [YPos]
lea edx,[MsgXM6]
call PrintS
mov [XPos],1
inc [YPos]
lea edx,[MsgXM7]
call PrintS
mov [YPos],50
mov bl,8 ; counter
lea esi,[_XMM0]
.Skip: lea ecx,[_XMM0+Plus]
.Loop: mov [XPos],6
mov [Color],30h
mov eax,[rsi+4*0]
cmp eax,[rcx+4*0]
jne @F
mov eax,[rsi+4*1]
cmp eax,[rcx+4*1]
jne @F
mov eax,[rsi+4*2]
cmp eax,[rcx+4*2]
jne @F
mov eax,[rsi+4*3]
cmp eax,[rcx+4*3]
je .@
@@: mov [Color],3Fh
.@: mov eax,[rsi+4*3]
call PrintEAX
mov eax,[rsi+4*2]
call PrintEAX
mov eax,[rsi+4*1]
call PrintEAX
mov eax,[rsi+4*0]
call PrintEAX
inc [YPos]
add esi,16
add ecx,16
dec bl
jnz .Loop
mov [XPos],1
lea edx,[MsgXCSR]
call PrintS
mov [XPos],1+6+9
lea edx,[MsgMCSR]
call PrintS
mov [XPos],7
mov eax,[_MXCSR]
cmp eax,[_MXCSR+Plus]
mov [Color],30h
ifnz mov [Color],3Fh
call PrintEAX
mov [XPos],7+9+11
mov eax,[_MXCSRM]
cmp eax,[_MXCSRM+Plus]
mov [Color],30h
ifnz mov [Color],3Fh
call PrintEAX
ret
;-----------------------------------------------------------------------------
Msg10 db 'CPU Registers',0
;-----------------------------------------------------------------------------
Msg11 db 'EAX 00000000 EFL 00000000 ',0
Msg12 db 'EBX 00000000 EIP 00000000 ',0
Msg13 db 'ECX 00000000 CS 0000/00000000/0000 ',0
Msg14 db 'EDX 00000000 DS 0000/00000000/0000 ',0
Msg15 db 'ESI 00000000 ES 0000/00000000/0000 ',0
Msg16 db 'EDI 00000000 FS 0000/00000000/0000 ',0
Msg17 db 'EBP 00000000 GS 0000/00000000/0000 ',0
Msg18 db 'ESP 00000000 SS 0000/00000000/0000 ',0
Msg19 db 'V R N IO O D I T S Z A P C ',0
Msg20 db '0 0 0 00 0 0 0 0 0 0 0 0 0 ',0
;-----------------------------------------------------------------------------
Msg22 db '[ds:esi]',0
Msg23 db '[es:edi]',0
MsgX2 db '[ds:edx]',0
MsgX3 db '[ds:ebx]',0
MsgX4 db '[ss:ebp]',0
MsgX5 db '[ds:ecx]',0
;-----------------------------------------------------------------------------
Msg2SIP db '[esi+',0
Msg2SIM db '[esi-',0
Msg2DIP db '[edi+',0
Msg2DIM db '[edi-',0
Msg2BXP db '[ebx+',0
Msg2BXM db '[ebx-',0
Msg2DXP db '[edx+',0
Msg2DXM db '[edx-',0
Msg2BPP db '[ebp+',0
Msg2BPM db '[ebp-',0
Msg3SPP db '[esp+',0
Msg3SPM db '[esp-',0
Msg2ER db '--',0
;-----------------------------------------------------------------------------
Msg00 db 'CPU ',0
CPUTable \
dd '8086'
dd '186'
dd '286'
dd '386'
dd '486'
dd '586'
dd '686'
FPUTable \
db '/None',0,0,0
db '/8087',0,0,0
dd '/287',0
dd '/387',0
dd '/487',0
dd '/587',0
dd '/687',0
;-----------------------------------------------------------------------------
Msg21 db 'Memory',0
;-----------------------------------------------------------------------------
Msg30 db 'Stack',0
;-----------------------------------------------------------------------------
Msg3M db 'Messages',0
;-----------------------------------------------------------------------------
Msg40 db 'Address: ',8,3Fh,'00000000 ',8,3Ah,'=',8,3Fh,' 00h',0
;-----------------------------------------------------------------------------
Msg10F db 'FPU Registers',0
Msg11F db 'ST0',0
Msg12F db 'ST1',0
Msg13F db 'ST2',0
Msg14F db 'ST3',0
Msg15F db 'ST4',0
Msg16F db 'ST5',0
Msg17F db 'ST6',0
Msg18F db 'ST7',0
Msg19F db 'CW=0000 SW=0000 TAG=0000',0
;-----------------------------------------------------------------------------
MsgMMX db 'MMX Registers',0
MsgMM0 db 'MM0',0
MsgMM1 db 'MM1',0
MsgMM2 db 'MM2',0
MsgMM3 db 'MM3',0
MsgMM4 db 'MM4',0
MsgMM5 db 'MM5',0
MsgMM6 db 'MM6',0
MsgMM7 db 'MM7',0
;-----------------------------------------------------------------------------
MsgXMM db 'XMM Registers',0
MsgXM0 db 'XMM0',0
MsgXM1 db 'XMM1',0
MsgXM2 db 'XMM2',0
MsgXM3 db 'XMM3',0
MsgXM4 db 'XMM4',0
MsgXM5 db 'XMM5',0
MsgXM6 db 'XMM6',0
MsgXM7 db 'XMM7',0
;-----------------------------------------------------------------------------
Msg1EF1 db 'Unsupported ',0
Msg1EF2 db '+NaN ',0
Msg1EF3 db '+Infinity ',0
Msg1EF4 db '+0.0 ',0
Msg1EF5 db '+Denormal ',0
Msg1EF6 db 'Unused ',0
Msg1EF7 db 'Empty ',0
;-----------------------------------------------------------------------------
MsgXMMX db 'CPU',0,'GenuineIntel',0
;-----------------------------------------------------------------------------
MsgXCSR db 'MXCSR=',0
MsgMCSR db 'MXCSR_MASK=',0
;-----------------------------------------------------------------------------
Msg50 db 8,74h,'F1',8,70h,'-Show '
db 8,74h,'F2',8,70h,'-BreakPnt '
db 8,74h,'F3',8,70h,'-Return '
db 8,74h,'F4',8,70h,'-Here '
db 8,74h,'F5',8,70h,'-Screen '
db 8,74h,'F6',8,70h,'-New '
db 8,74h,'F7',8,70h,'-Trace '
db 8,74h,'F8',8,70h,'-Step '
db 8,74h,'F9',8,70h,'-Run '
db 8,74h,'F10',8,70h,'-Over '
db 0
;-----------------------------------------------------------------------------
even 4
RegVTab dd _EAX,_ECX,_EDX,_EBX,_ESP,_EBP,_ESI,_EDI,_EIP
RegRTab dd _EAX,_EBX,_ECX,_EDX,_ESI,_EDI,_EBP,_ESP,_EIP
dd 0800h,0400h,0200h,0080h,0040h,0010h,0004h,0001h
;-----------------------------------------------------------------------------
RegXTab db 1, 1, 1, 1, 1, 1, 1, 1, 14, 10,12,14,18, 21,23,25,27
RegYTab db 30,31,32,33,34,35,36,37, 31, 39,39,39,39, 39,39,39,39
RegLTab db 12,12,12,12,12,12,12,12, 12, 1, 1, 1, 1, 1, 1, 1, 1
;-----------------------------------------------------------------------------
CursorTab dd CPUCursor,RegCursor,MemCursor,StkCursor
WindowTab dd CPUWindow,RegWindow,MemWindow,StkWindow
;-----------------------------------------------------------------------------
HexBuf: db 8 dup 20h,0
;-----------------------------------------------------------------------------
XPos db 0
YPos db 0
Color db 7
;-----------------------------------------------------------------------------
/programs/develop/koldbg/koldbg.asm
0,0 → 1,2911
use32
db 'MENUET01'
dd 1
dd Start
dd I_END
MemSize dd Mem
dd StackTop
dd 0,AppPath
 
VERSION equ '0.01+'
 
;-----------------------------------------------------------------------------
Bitness equ 32
;-----------------------------------------------------------------------------
bit equ 1 shl
by equ shl 8 +
 
%B = 32
 
macro even Value { rb (Value-1)-($+Value-1) mod Value }
 
macro ifc Opc&
{
local ..L
jnc ..L
Opc
..L:
}
 
macro ifa Opc&
{
local ..L
jna ..L
Opc
..L:
}
 
macro ifae Opc&
{
local ..L
jnae ..L
Opc
..L:
}
 
macro ifb Opc&
{
local ..L
jnb ..L
Opc
..L:
}
 
macro ifbe Opc&
{
local ..L
jnbe ..L
Opc
..L:
}
 
macro ifg Opc&
{
local ..L
jng ..L
Opc
..L:
}
 
macro ifge Opc&
{
local ..L
jnge ..L
Opc
..L:
}
 
macro ifl Opc&
{
local ..L
jnl ..L
Opc
..L:
}
 
macro ifle Opc&
{
local ..L
jnle ..L
Opc
..L:
}
 
macro ifno Opc&
{
local ..L
jo ..L
Opc
..L:
}
 
macro ifnp Opc&
{
local ..L
jp ..L
Opc
..L:
}
 
macro ifns Opc&
{
local ..L
js ..L
Opc
..L:
}
 
macro ifnz Opc&
{
local ..L
jz ..L
Opc
..L:
}
 
macro ifo Opc&
{
local ..L
jno ..L
Opc
..L:
}
 
macro ifp Opc&
{
local ..L
jnp ..L
Opc
..L:
}
 
macro ifs Opc&
{
local ..L
jns ..L
Opc
..L:
}
 
macro ifz Opc&
{
local ..L
jnz ..L
Opc
..L:
}
 
macro lea Dst,Src
{
local ..L,..H
virtual at 0
mov al,byte Src
load ..L byte from 0x0
if ..L = 0xA0
load ..H dword from 0x1
end if
end virtual
if ..L = 0xA0
mov Dst,..H
else
lea Dst,Src
end if
}
 
include 'kosfuncs.inc'
include '../../macros.inc'
 
include 'font.inc'
include 'tools.inc'
include 'kernel.inc'
 
virtual at rsp
All:
.edi dd ?
.esi dd ?
.ebp dd ?
.res dd ?
.ebx dd ?
.edx dd ?
.ecx dd ?
.eax dd ?
end virtual
 
macro jecxnz Target
{
inc ecx
loop Target
}
 
TestFile db '/rd/1/develop/scancode',0
 
MinWidth = 90
MaxWidth = 255
MinHeight = 75
MaxHeight = 255
 
DATA_WIDTH = 88 ; in characters, multiple of 4
 
CMD_WIDTH = DATA_WIDTH
 
CursorNormSize = 2
CursorBigsSize = FontHeight
 
;-----------------------------------------------------------------------------
; Fast load test file event
DoLoad: mov esi,TestFile
mov edi,LoadName
jmp OnLoadInit
;-----------------------------------------------------------------------------
; Load executable event
OnLoad: mov esi,[CurArg]
OnLoadInit:
mov edi,LoadName
or [PrgNameLen],-1
mov [PrgNamePtr],edi
.CopyName:
lodsb
stosb
inc [PrgNameLen]
cmp al,'/'
jnz @F
or [PrgNameLen],-1
mov [PrgNamePtr],edi
@@:
cmp al,' '
ja .CopyName
mov byte [edi-1],0
and [LoadParams],0
dec esi
call GetArg.SkipSpaces
cmp al,0
jz @F
mov [LoadParams],esi
@@:
;and [DumpPos],0
mov ecx,[Symbols]
jecxz DoReLoad
mcall 68,13
and [Symbols],0
and [NumSymbols],0
DoReLoad:
mcall 18,7
mov [DbgWnd],eax
xchg ecx,eax
mcall 70,FN70LoadBlock
test eax,eax
jns .Loaded
 
.LoadErr:
push eax
mov esi,LoadErrMsg
call PutMessage
pop eax
not eax
cmp eax,0x20
jae .UnkErr
mov esi,[LoadErrMsgs+eax*4]
test esi,esi
jnz PutMessage
 
.UnkErr:
mov esi,UnkErrMsg
inc eax
push eax
call PutMessageNoDraw
jmp DrawMessages
 
.Loaded:
mov [DebuggeePID],eax
mov [bSuspended],1
mcall 5,20
push ecx
call GetContext
mov edi,OldContext
mov ecx,(CtxEnd-Context)/4
rep movsd
; activate debugger window
pop ecx
mcall 18,3
call GetDump
if 1
push dword [ShowNames]
mov [ShowNames],-1
end if
mov [AfterKey],0
call ShowImage
mov esi,LoadSuccMsg
push [DebuggeePID]
call PutMessageNoDraw
call DrawMessages
; try to load symbols
mov esi,LoadName
mov edi,SymbolsFile
push edi
@@:
lodsb
stosb
test al,al
jnz @B
lea ecx,[edi-1]
@@:
dec edi
cmp edi,SymbolsFile
jb @F
cmp byte [edi],'/'
jz @F
cmp byte [edi],'.'
jnz @B
mov ecx,edi
@@:
mov dword [ecx],'.dbg'
mov byte [ecx+4],0
pop esi
mov ebp,esi
push ecx esi
call OnLoadSymbols.Silent ; Try to load .dbg file
pop esi ecx
xor eax,eax
cmp [NumSymbols],eax
jne @F
mov dword [ecx],'.map' ; If failed, try .map file too
call OnLoadSymbols.Silent
@@:
if 1
pop eax
mov [ShowNames],al
call DrawMessages
end if
ret
 
;-----------------------------------------------------------------------------
; Working with debug context
GetNewContext:
mov esi,Context
mov edi,OldContext
mov ecx,(CtxEnd-Context)/4
rep movsd
 
GetContext:
mcall 69,1,[DebuggeePID],CtxEnd-Context,Context
ret
 
SetContext:
mcall 69,2,[DebuggeePID],28h,Context
ret
 
;-----------------------------------------------------------------------------
; Resume process event
DoResume:
mcall 69,5,[DebuggeePID]
mov [bSuspended],0
ret
 
;-----------------------------------------------------------------------------
; Breakpoints manipulation
OnBp: mov esi,[CurArg]
call CalcExpression
jc .Ret
xchg eax,ebp
push eax
call FindBreakPoint
inc eax
pop eax
jz .NotFound
mov esi,aDuplicateBreakpoint
jmp .SayErr
.NotFound:
mov bl,1
call AddBreakPoint
jnc .Ret
mov esi,aBreakpointLimitExceeded
.SayErr:
call PutMessage
.Ret:
jmp DrawMessages;DrawDisAsm
 
;-----------------------------------------------------------------------------
; Dump memory event
OnDump: mov esi,[CurArg]
cmp byte [esi],0
jnz .Param
;add [DumpPos],DUMP_HEIGHT*10h
add [DataAddr],8*8
jmp .DoIt
 
.Param:
call CalcExpression
jc .Ret
;mov [DumpPos],ebp
mov [DataAddr],ebp
.DoIt:
;call GetDump
;call DrawDump.Redraw
call DrawMessages
.Ret:
ret
 
OnBpmb: mov dh,0011b
jmp DoBpm
 
OnBpmw: mov dh,0111b
jmp DoBpm
 
OnBpmd: mov dh,1111b
 
DoBpm: mov esi,[CurArg]
cmp byte [esi],'w'
jnz @F
and dh,not 2
inc esi
@@:
push edx
call CalcExpression
pop edx
jnc @F
ret
; ebp = expression, dh = flags
@@:
movzx eax,dh
shr eax,2
test ebp,eax
jz @F
mov esi,aUnaligned
jmp PutMessage
@@:
mov eax,ebp
mov bl,0Bh
call AddBreakPoint
jnc @F
mov esi,aBreakpointLimitExceeded
jmp PutMessage
; now find index
@@:
push eax
xor ecx,ecx
.L1:
cmp [DrXBreak+ecx*4],0
jnz .L2
push ecx
mov dl,cl
mov esi,ebp
mcall 69,9,[DebuggeePID]
test eax,eax
jz .OK
pop ecx
.L2:
inc ecx
cmp ecx,4
jb .L1
pop eax
call ClearBreakPoint
mov esi,aBreakpointLimitExceeded
jmp PutMessage
.OK:
pop ecx
pop eax
and byte [edi],not 2 ; breakpoint is enabled
shl dl,6
or dl,dh
mov byte [edi+1],dl
inc eax
mov [DrXBreak+ecx*4],eax
ret
 
OnBc: mov esi,[CurArg]
@@:
call GetHexNumber
jc OnBp.Ret
call ClearBreakPoint
jmp @B
OnBd:
mov esi,[CurArg]
@@:
call GetHexNumber
jc OnBp.Ret
call DisableBreakPoint
jmp @B
OnBe:
mov esi,[CurArg]
@@:
call GetHexNumber
jc OnBp.Ret
push eax
call FindEnabledBreakPoint
pop eax
jz .Err
call EnableBreakPoint
jmp @B
.Err:
mov esi,OnBeErrMsg
jmp PutMessage
 
GetHexNumber:
call GetArg.SkipSpaces
xor ecx,ecx
xor edx,edx
@@:
lodsb
call IsHexDigit
jc .Ret
shl edx,4
or dl,al
inc ecx
jmp @B
.Ret:
dec esi
cmp ecx,1
xchg eax,edx
ret
 
;-----------------------------------------------------------------------------
; Breakpoints list event
OnBl: mov esi,[CurArg]
cmp byte [esi],0
jz .ListAll
call GetHexNumber
jc .Ret
cmp eax,BreakPointsN
jae .Err
push eax
add eax,eax
lea edi,[BreakPoints+eax+eax*2]
pop eax
test byte [edi+4],1
jz .Err
call ShowBreakInfo
.Ret:
ret
.Err:
mov esi,aInvalidBreak
jmp PutMessage
 
.ListAll:
mov edi,BreakPoints
xor eax,eax
@@:
test byte [edi+4],1
jz .Cont
push edi eax
call ShowBreakInfo
pop eax edi
.Cont:
add edi,6
inc eax
cmp eax,BreakPointsN
jb @B
ret
 
ShowBreakInfo:
push edi
test byte [edi+4],8
jnz .DR
push dword [edi]
push eax
mov esi,aBreakNum
call PutMessageNoDraw
jmp .CMN
.DR:
push eax
mov esi,aMemBreak1
call PutMessageNoDraw
pop edi
push edi
mov esi,aMemBreak2
test byte [edi+5],2
jz @F
mov esi,aMemBreak3
@@:
call PutMessageNoDraw
pop edi
push edi
mov esi,aMemBreak6
test byte [edi+5],8
jnz @F
mov esi,aMemBreak5
test byte [edi+5],4
jnz @F
mov esi,aMemBreak4
@@:
call PutMessageNoDraw
pop edi
push edi
push dword [edi]
mov esi,aMemBreak7
call PutMessageNoDraw
.CMN:
pop edi
test byte [edi+4],2
jz @F
push edi
mov esi,aDisabled
call PutMessageNoDraw
pop edi
@@:
test byte [edi+4],4
jz @F
mov esi,aOneShot
call PutMessageNoDraw
@@:
mov esi,NewLine
jmp PutMessage
 
;-----------------------------------------------------------------------------
; Unpack executable event
OnUnpack:
; program must be loaded - checked when command was parsed
; program must be stopped
mov esi,aRunningErr
cmp [bSuspended],0
jz PutMessage
; all breakpoints must be disabled
mov edi,BreakPoints
@@:
test byte [edi+4],1
jz .Cont
test byte [edi+4],2
jnz .Cont
mov esi,aEnabledBreakErr
jmp PutMessage
.Cont:
add edi,6
cmp edi,BreakPoints+BreakPointsN*6
jb @B
; ok, now do it
; set breakpoint on 0xC dword access
push 9
pop ebx
mov ecx,[DebuggeePID]
mov dx,1111b*256
push 0xC
pop esi
@@:
mcall 69
test eax,eax
jz .BreakOK
inc edx
cmp dl,4
jb @B
.BreakOK:
call GoOn
; now wait for event
.Wait:
mcall 10
dec eax
jz .Redraw
dec eax
jz .Key
dec eax
jnz .Debug
; button; we have only one button, close
or eax,-1
mcall
 
.Redraw:
mov [DoDraw],1
call DrawWindow
jmp .Wait
 
.Key:
mov al,2
mcall
cmp ah,3 ; Ctrl+C
jnz .Wait
 
.UserBreak:
mov esi,aInterrupted
.X1:
push edx esi
call PutMessage
pop esi edx
or dh,80h
mcall 69,9,[DebuggeePID]
cmp esi,aUnpacked
jnz OnSuspend
jmp AfterSuspend
 
.Debug:
cmp [DbgBufLen],4*3
jnz .NotOur
cmp dword [DbgBuf],3
jnz .NotOur
test byte [DbgBuf+8],1
jnz .Our
 
.NotOur:
mov esi,aInterrupted
push edx
call PutMessage
pop edx
or dh,80h
mcall 69,9,[DebuggeePID]
jmp DebugMsg
 
.Our:
and [DbgBufLen],0
push edx
call GetContext
push eax
mcall 69,6,[DebuggeePID],4,0xC,esp
pop eax
pop edx
cmp eax,[_EIP]
jz .Done
call DoResume
jmp .Wait
 
.Done:
mov esi,aUnpacked
jmp .X1
 
;-----------------------------------------------------------------------------
; Calculate expression event
OnCalc: mov esi,[CurArg]
call CalcExpression
jc .Ret
push ebp
mov esi,CalcString
call PutMessageNoDraw
jmp DrawMessages
.Ret:
ret
 
;-----------------------------------------------------------------------------
; Access to register value event
OnReg: mov esi,[CurArg]
call GetArg.SkipSpaces
call FindReg
jnc @F
.Err:
mov esi,RSyntax
jmp PutMessage
@@:
call GetArg.SkipSpaces
test al,al
jz .Err
cmp al,'='
jnz @F
inc esi
call GetArg.SkipSpaces
test al,al
jz .Err
@@:
push edi
call CalcExpression
pop edi
jc .Ret
; now edi=register id, ebp=value
cmp [bSuspended],0
mov esi,aRunningErr
jz PutMessage
xchg eax,ebp
cmp edi,24
jz .EIP
sub edi,4
jb .8LO
sub edi,4
jb .8HI
sub edi,8
jb .16
mov [_EAX+edi*4],eax
jmp .Ret
.16:
mov word [_EAX+(edi+8)*4],ax
jmp .Ret
.8LO:
mov byte [_EAX+(edi+4)*4],al
jmp .Ret
.8HI:
mov byte [_EAX+(edi+4)*4+1],al
jmp .Ret
.EIP:
mov [_EIP],eax
;call UpdateDisAsmEIP
.Ret:
call SetContext
jmp DrawMessages;DrawRegisters.ReDraw
 
;-----------------------------------------------------------------------------
; Step execution event
;Here we get [<number>] argument at do step <number> times
OnStepMultiple:
cmp [bSuspended],0
jz OnStep.Running
mov [StepNum],1
mov esi,[CurArg]
test esi,esi
jz .Do
cmp byte [esi],0
jz .Do
call GetHexNumber
jc .Ret
or eax,eax ; check if lesser or equal than 0
jle .Ret
mov [StepNum],eax
.Do: call OnStep
dec [StepNum]
jnz .Do
.Ret: ret
 
OnStep:
cmp [bSuspended],0
jz .Running
call GetContext
or byte [_EFL+1],1 ; set TF
call SetContext
and byte [_EFL+1],not 1
; if instruction at eip is "int xx", set one-shot breakpoint immediately after
mov eax,[_EIP]
call FindEnabledBreakPoint
jnz @F
cmp byte [edi+5],0xCD
jz .Int
@@:
push 0
mcall 69,6,[DebuggeePID],3,[_EIP],esp
cmp eax,edx
pop eax
jnz .DoIt
cmp al,0xCD
jz .Int
cmp ax,0x050F
jz .SysCall
cmp ax,0x340F
jz .SysEnter
; resume process
.DoIt:
call GoOn
cmp [bAfterGo],0
jz @F
mov [bAfterGo],2
@@:
ret
 
; return address is [ebp-4]
.SysEnter:
push 0
inc edx ; read 4 bytes
mov esi,[_EBP]
sub esi,4
mcall 69
cmp eax,edx
pop eax
jnz .SysCall
push eax
and byte [_EFL+1],not 1
call SetContext
pop eax
jmp @F
 
.SysCall:
and byte [_EFL+1],not 1 ; clear TF - avoid system halt (!)
call SetContext
.Int:
mov eax,[_EIP]
inc eax
inc eax
@@:
push eax
call FindEnabledBreakPoint
pop eax
jz .DoIt
; there is no enabled breakpoint yet; set temporary breakpoint
mov bl,5
call AddBreakPoint
jmp .DoIt
 
.Running:
mov esi,aRunningErr
jmp PutMessage
 
;-----------------------------------------------------------------------------
; Proceed process event
;Here we get [<number>] argument at do step <number> times
OnProceedMultiple:
cmp [bSuspended],0
jz OnStep.Running
mov [ProcNum],1
mov esi,[CurArg]
test esi,esi
jz .Do
cmp byte [esi],0
jz .Do
call GetHexNumber
jc .Ret
or eax,eax ; check if lesser or equal than 0
jle .Ret
mov [ProcNum],eax
and [CurArg],0
.Do:
call OnProceed
dec [ProcNum]
jnz .Do
.Ret:
ret
 
OnProceed:
cmp [bSuspended],0
jz OnStep.Running
mov esi,[_EIP]
 
@@:
call GetByteNoBreak
jc OnStep
inc esi
; skip prefixes
call IsPrefix
jz @B
cmp al,0xE8 ; call
jnz @f
add esi,4
jmp .DoIt
 
; A4,A5 = movs; A6,A7 = cmps
@@:
cmp al,0xA4
jb @F
cmp al,0xA8
jb .DoIt
 
; AA,AB = stos; AC,AD = lods; AE,AF = scas
@@:
cmp al,0xAA
jb @F
cmp al,0xB0
jb .DoIt
 
; E0 = loopnz; E1 = loopz; E2 = loop
@@:
cmp al,0xE0
jb .NoLoop
cmp al,0xE2
ja .NoLoop
inc esi
jmp .DoIt
 
; FF /2 = call
.NoLoop:
cmp al,0xFF
jnz OnStep
call GetByteNoBreak
jc OnStep
inc esi
mov cl,al
and al,00111000b
cmp al,00010000b
jnz OnStep
; skip instruction
mov al,cl
and eax,7
shr cl,6
jz .Mod0
jp .DoIt
cmp al,4
jnz @F
inc esi
@@:
inc esi
dec cl
jz @F
add esi,3
@@:
jmp .DoIt
.Mod0:
cmp al,4
jnz @F
call GetByteNoBreak
jc OnStep
inc esi
and al,7
@@:
cmp al,5
jnz .DoIt
add esi,4
.DoIt:
; insert one-shot breakpoint at esi and resume
call GetByteNoBreak
jc OnStep
mov eax,esi
call FindEnabledBreakPoint
jz @F
mov eax,esi
mov bl,5
call AddBreakPoint
jmp OnStep.DoIt
@@:
ret
 
;-----------------------------------------------------------------------------
; Read next byte of machine code
GetByteNoBreak:
mov eax,esi
call FindEnabledBreakPoint
jnz .NoBreak
mov al,[edi+5]
clc
ret
 
.NoBreak:
xor edx,edx
push edx
inc edx
mov edi,esp
mcall 69,6,[DebuggeePID]
dec eax
clc
jz @F
stc
@@:
pop eax
ret
 
IsPrefix:
cmp al,0x64 ; fs:
jz .Ret
cmp al,0x65 ; gs:
jz .Ret
cmp al,0x66 ; use16/32
jz .Ret
cmp al,0x67 ; addr16/32
jz .Ret
cmp al,0xF0 ; lock
jz .Ret
cmp al,0xF2 ; repnz
jz .Ret
cmp al,0xF3 ; rep(z)
jz .Ret
cmp al,0x2E ; cs:
jz .Ret
cmp al,0x36 ; ss:
jz .Ret
cmp al,0x3E ; ds:
jz .Ret
cmp al,0x26 ; es:
.Ret:
ret
 
OnResume:
mov esi,[CurArg]
cmp byte [esi],0
jz GoOn
call CalcExpression
jc .Ret
.Jmp:
mov eax,ebp
push eax
call FindEnabledBreakPoint
pop eax
jz GoOn
mov bl,5 ; valid enabled one-shot
call AddBreakPoint
jnc GoOn
mov esi,aBreakpointLimitExceeded
call PutMessage
.Ret:
ret
 
;-----------------------------------------------------------------------------
; Jump event
OnJump: mov esi,[CurArg]
cmp byte [rsi],0
jz .Ret
call CalcExpression
jc .Ret
mov ecx,[CurrentWindow]
mov [CodeAddr+rcx*4],ebp
jecxnz .Next
mov [CPUYPos],1
.Next:
cmp ecx,1 ;Reg Window?
jnz .NReg
mov eax,[RegXPtr]
cmp eax,9
jae .NReg
mov eax,[RegRTab+rax*4]
mov [rax],ebp
call SetContext
.NReg:
mov [AfterKey],1
call ShowImage
.Ret: ret
 
;-----------------------------------------------------------------------------
; Help event
OnHelp: mov esi,HelpMsg
mov edi,[CurArg]
cmp byte [edi],0
jz .X
mov esi,HelpGroups
call FindCmd
jc .NoCmd
mov esi,[esi+12]
.X:
jmp PutMessage
 
.NoCmd:
mov esi,aUnknownCommand
jmp .X
 
;-----------------------------------------------------------------------------
; Detach process event
OnDetach:
mcall 69,3,[DebuggeePID]
and [DebuggeePID],0
call FreeSymbols
mov esi,aContinued
jmp PutMessage
 
;-----------------------------------------------------------------------------
; Reload executable event
OnReLoad:
cmp [DebuggeePID],0
jnz TerminateReLoad
mov esi,NeedDebuggee
cmp byte [LoadName],0
jnz DoReLoad
jz PutMessage
 
TerminateReLoad:
mov [bReload],1
;-----------------------------------------------------------------------------
; Terminate process event
OnTerminate:
mcall 69,8,[DebuggeePID]
ret
 
;-----------------------------------------------------------------------------
; Suspend process event
AfterSuspend:
mov [bSuspended],1
call GetNewContext
call GetDump
call ShowImage
ret
 
OnSuspend:
mcall 69,4,[DebuggeePID]
call AfterSuspend
mov esi,aSuspended
jmp PutMessage
GoOn:
; test for enabled breakpoint at eip
mov eax,[_EIP]
call FindEnabledBreakPoint
jnz .NoBreak
; temporarily disable breakpoint, make step, enable breakpoint, continue
inc eax
mov [TempBreak],eax
mov [bAfterGo],1
dec eax
call DisableBreakPoint
call GetContext
or byte [_EFL+1],1 ; set TF
call SetContext
and byte [_EFL+1],not 1
call DoResume
ret
.NoBreak:
call DoResume
ShowImage:
pushad
call InitConsole
call DrawWindow
popad
ret
 
even 4
InitConsole:
mov eax,[CurWidth]
mul [CurHeight]
mov ecx,eax
mov edi,ConsoleDataPtr
mov eax,3F203F20h
shr ecx,1
rep stosd
adc cl,cl
rep stosw
;
mov ebx,MSG_HEIGHT ;dY
mov ecx,[CurWidth] ;\dX
sub ecx,2 ;/
mov esi,1 ;X
mov edi,MinHeight-MSG_HEIGHT-1 ;Y
mov edx,87208720h
call ClearWindow
;
call DrawFrame
ret
 
InitCoords:
mov [CPUXPos],1
mov [CPUYPos],1
mov [CPUXPtr],0
mov [MemXPos],11
mov [MemYPos],41
mov eax,[CurWidth]
SUB eax,21
mov [StkXPos],eax
mov [StkYPos],28
mov [RegXPos],1
mov [RegYPos],30
mov [RegLDat],12
and [RegXPtr],0
ret
 
GetDataByte:
;I: esi - address
;O: al - byte
pushad
mov al,0
push eax
mcall 69,6,[DebuggeePID],1,[All.esi+4],esp
if 1
mov esi,[All.esi+4]
mov edi,esp
call RestoreFromBreaksOne
end if
cmp eax,-1 ;invalid PID?
jz @F ;Yes,CF=0
cmp eax,1 ;CF=1,eax=1 if OK
cmc
@@: pop dword [esp+1Ch]
popad
ret
 
SafeStoreDD:
pushad
mov eax,69
mov ebx,7
mov ecx,[DebuggeePID]
mov edx,4
mov esi,edi
lea edi,[All.eax]
int 40h
popad
ret
 
SafeStore:
pushad
mov eax,69
mov ebx,7
mov ecx,[DebuggeePID]
mov edx,1
mov esi,edi
lea edi,[All.eax]
int 40h
popad
ret
 
DrawWindow:
btr dword [DoDraw],0
jc .CopyDraw
mov esi,ConsoleDataPtr
mov edi,ConsoleDataOld
mov ecx,[CurWidth]
imul ecx,[CurHeight]
shr ecx,1
repz cmpsd
jnz .CopyDraw
adc cl,cl
repz cmpsw
jz .SkipDraw
.CopyDraw:
mov esi,ConsoleDataPtr
mov edi,ConsoleDataOld
mov ecx,[CurWidth]
imul ecx,[CurHeight]
shr ecx,1
rep movsd
adc cl,cl
rep movsw
 
push SF_REDRAW
pop eax
push SSF_BEGIN_DRAW
pop ebx
int 40h
mov al,SF_STYLE_SETTINGS
mov bl,SSF_GET_SKIN_HEIGHT
int 40h
mov [SkinH],eax
mov ebx,[CurWidth]
imul ebx,FontWidth
add ebx,100*65536+5*2-1
mov ecx,[CurHeight]
imul ecx,FontHeight
lea ecx,[eax+ecx+5-1+100*65536]
xor eax,eax
mov edx,0x53000000
 
mov edi,HeaderN
cmp [DebuggeePID],0
jz @F
mov edi,HeaderY
@@: int 40h
 
mov al,SF_DRAW_RECT
xor edx,edx
cmp [FillWidth],0
jz @F
mov ebx,[WndWidth]
sub ebx,[FillWidth]
sub ebx,5-1
shl ebx,16
mov bx,word [FillWidth]
mov ecx,[SkinH-2]
mov cx,word [WndHeight]
sub cx,word [SkinH]
sub cx,5-1
int 40h
@@:
cmp [FillHeight],0
jz @F
xor edx,edx
mov ebx,50000h
mov bx,word [WndWidth]
sub ebx,9
mov ecx,[WndHeight]
sub ecx,[FillHeight]
sub ecx,5-1
shl ecx,16
mov cx,word [FillHeight]
int 40h
@@:
call DrawImage
mov al,SF_PUT_IMAGE_EXT
mov ebx,[MemForImage]
test ebx,ebx
jz @F
mov ecx,[CurWidth]
imul ecx,FontWidth*10000h
mov cx,word [CurHeight]
imul cx,FontHeight
mov edx,[SkinH]
add edx,5*10000h
mov esi,8
mov edi,ConsoleColors
xor ebp,ebp
int 40h
@@:
mov al,SF_REDRAW
push SSF_END_DRAW
pop ebx
int 40h
.SkipDraw:
ret
 
align 16
DrawImage:
mov [bMemForImageValidData],byte 1
cmp [MemForImage],0
jnz .Allocated
; allocate memory for image
mov ecx,[CurWidth]
imul ecx,[CurHeight]
imul ecx,FontWidth*FontHeight
call PGAlloc
test eax,eax
ifz ret
mov [MemForImage],eax
mov [bMemForImageValidData],byte 0
.Allocated:
push ebp
and [MaxX],0
or [MinX],-1
and [MaxY],0
or [MinY],-1
mov eax,[CursorY]
mul [CurWidth]
add eax,[CursorX]
add eax,eax
add eax,ConsoleDataPtr
xchg [CurCursorPos],eax
mov [OldCursorPos],eax
mov edi,[MemForImage]
mov esi,ConsoleDataPtr
mov ecx,[CurHeight]
.LH:
push ecx
mov ecx,[CurWidth]
.LW:
push ecx
mov eax,[CurWidth]
imul eax,[CurHeight]
mov ebx,[esi]
cmp [bMemForImageValidData],0
jz @F
cmp esi,[CurCursorPos]
jz @F
cmp esi,[OldCursorPos]
jz @F
cmp bx,[eax*2+esi]
jnz @F
inc esi
inc esi
jmp .SkipSymbol
@@:
mov [eax*2+esi],bx
cmp ecx,[MinX]
ja @F
mov [MinX],ecx
@@:
cmp ecx,[MaxX]
jb @F
mov [MaxX],ecx
@@:
mov eax,[esp+4]
mov [MinY],eax
cmp eax,[MaxY]
jb @F
mov [MaxY],eax
@@:
push edi
xor eax,eax
mov al,[esi+1]
and al,0xF
mov ebx,eax
mov al,[esi+1]
shr al,4
mov ebp,eax
sub ebx,ebp
lodsb
inc esi
if FontWidth > 8
lea edx,[eax+eax+Font]
else
lea edx,[eax+Font]
end if
.SH:
mov ecx,[edx]
repeat FontWidth
shr ecx,1
sbb eax,eax
and eax,ebx
add eax,ebp
mov [edi+%-1],al
end repeat
mov eax,[CurWidth]
if FontWidth = 6
lea eax,[eax*2+eax]
lea edi,[edi+eax*2]
else if FontWidth = 7
lea edi,[edi+eax*8]
sub edi,eax
else if FontWidth = 8
lea edi,[edi+eax*8]
else if FontWidth = 9
lea edi,[edi+eax*8]
add edi,eax
else if FontWidth = 10
lea eax,[eax*4+eax]
lea edi,[edi+eax*2]
else
Unknown FontWidth Value!
end if
if FontWidth > 8
add edx,256*2
cmp edx,Font+256*2*FontHeight
else
add edx,256
cmp edx,Font+256*FontHeight
end if
jb .SH
pop edi
.SkipSymbol:
pop ecx
add edi,FontWidth
dec ecx
jnz .LW
mov eax,[CurWidth]
imul eax,(FontHeight-1)*FontWidth
add edi,eax
pop ecx
dec ecx
jnz .LH
; cursor
mov eax,[CursorY]
inc eax
jz .NoCursor
mul [CurWidth]
imul eax,FontHeight*FontWidth
mov edx,[CursorX]
inc edx
imul edx,FontWidth
add eax,edx
add eax,[MemForImage]
mov edx,[CurWidth]
imul edx,FontWidth
neg edx
mov ecx,[CursorSize]
.CursorLoop:
push ecx
mov ecx,FontWidth
add eax,edx
push eax
@@:
xor byte [eax-1],7
sub eax,1
loop @B
pop eax
pop ecx
loop .CursorLoop
.NoCursor:
cmp [MinY],-1
jz .NoDraw
mov ecx,[CurWidth]
mov ebx,[CurHeight]
mov eax,ebx
sub ebx,[MaxY]
sub eax,[MinY]
sub eax,ebx
inc eax
imul ebp,eax,FontHeight
mov edx,ecx
sub edx,[MaxX]
imul edx,FontWidth
mov eax,edx
shl edx,16
imul dx,bx,FontHeight
imul ebx,[CurWidth]
mov ecx,[MaxX]
sub ecx,[MinX]
inc ecx
imul ecx,FontWidth*10000h
add ecx,ebp
imul ebx,FontWidth*FontHeight
add ebx,[MemForImage]
add ebx,eax
add edx,[SkinH]
add edx,5*10000h
imul esi,[CurWidth],FontWidth
mov ebp,ecx
shr ebp,16
sub esi,ebp
mov ebp,esi
push SF_PUT_IMAGE_EXT
pop eax
mov edi,ConsoleColors
push 8
pop esi
int 40h
.NoDraw:
pop ebp
ret
even 4
Redraw:
mov al,SF_THREAD_INFO
mov ebx,ProcInfo
or ecx,-1
int 40h
; test if rolled up
; height of rolled up window is [skinh]+3
mov eax,[ebx+46]
sub eax,[SkinH]
cmp eax,5
ja @F
mov al,SF_REDRAW
push SSF_BEGIN_DRAW
pop ebx
int 0x40
xor eax,eax
; ebx, ecx, edi are ignored by function 0 after first redraw
mov edx,0x53000000
int 0x40
mov al,SF_REDRAW
inc ebx
int 0x40
jmp WaitEvent
@@:
xor ecx,ecx
mov eax,[ebx+42]
mov [WndWidth],eax
sub eax,5*2-1
jae @F
xor eax,eax
@@:
cdq
mov esi,FontWidth
div esi
cmp eax,MinWidth
jae @F
mov al,MinWidth
mov ch,1
@@:
cmp eax,MaxWidth
jbe @F
mov eax,MaxWidth
mov ch,1
@@:
cmp eax,[CurWidth]
mov [CurWidth],eax
setnz cl
or cl,ch
test edx,edx
mov [FillWidth],edx
setnz ch
mov eax,[ebx+46]
mov [WndHeight],eax
sub eax,[SkinH]
sub eax,5-1
jns @F
xor eax,eax
@@:
cdq
mov esi,FontHeight
div esi
cmp eax,MinHeight
jae @F
mov al,MinHeight
mov cl,1
@@:
cmp eax,MaxHeight
jbe @F
mov eax,MaxHeight
mov cl,1
@@:
mov [FillHeight],edx
cmp eax,[CurHeight]
mov [CurHeight],eax
jnz .ReSize
test cl,cl
jnz .ReSize
test edx,edx
setnz cl
or cl,ch
jz @F
test byte [ebx+70],1
jnz @F
.ReSize:
push SF_CHANGE_WINDOW
pop eax
or ebx,-1
or ecx,-1
mov edx,[CurWidth]
imul edx,FontWidth
add edx,5*2-1
mov esi,[CurHeight]
imul esi,FontHeight
add esi,[SkinH]
add esi,5-1
int 40h
.ReSizeDraw:
mov ecx,[MemForImage]
call PGFree
and [MemForImage],0
call InitConsole
call InitCoords
jmp WaitEvent
@@: mov [DoDraw],1
call DrawWindow
jmp WaitEvent
 
even 4
Start:
xor eax,eax
mov edi,NeedZeroStart
mov ecx,(NeedZeroEnd-NeedZeroStart+3)/4
rep stosd
 
call DetectCPU
mov [CPUType],dl
call DetectFPU
mov [FPUType],al
 
cmp [CPUType],5
jb @F
xor eax,eax
cpuid
mov edi,MsgXMMX+4
mov [edi+0],ebx
mov [edi+4],edx
mov [edi+8],ecx
cmp eax,1
jl .L1
xor eax,eax
inc eax
cpuid
xchg eax,edx
jmp .L2
.L1: xor eax,eax
.L2: test eax,00800000h ; CPU have MMX?
setnz [MMXType]
test eax,02000000h ; CPU have SSE?
setnz [XMMType]
@@:
 
push SF_SYS_MISC
pop eax
push SSF_HEAP_INIT
pop ebx
int 40h
 
call InitCmdHistBuffer
call InitDefault
 
call InitCoords
call ShowImage
 
; set event mask - default events and debugging events
mcall 40,EVM_REDRAW or EVM_KEY or EVM_BUTTON or EVM_DEBUG
; set debug messages buffer
mov ecx,DbgBufSize
mov dword [ecx],256
xor ebx,ebx
mov [ecx+4],ebx
mov al,69
mcall
 
call ShowImage
 
WaitEvent:
push SF_WAIT_EVENT
pop eax
int 40h
 
cmp al,9
jz DebugMsg
dec eax
jz Redraw
dec eax
jz Key
sub eax,4
jz Mouse
; button - we have only one button, close
;-----------------------------------------------------------------------------
; Quit event
OnQuit:
or eax,-1
int 40h
Key:
mov al,SF_KEYBOARD
push SSF_GET_CONTROL_KEYS
pop ebx
int 0x40
and eax,0x3F
mov [CtrlState],al
 
mov al,SF_GET_KEY
int 40h
test al,al
jnz WaitEvent
 
shr eax,8
 
cmp ah,5Dh
ifz call DumpScreen
 
cmp [DebuggeePID],0
jz DoCommandLine
cmp [CmdLineActive],0
jnz GetCommandLine
 
jmp WinSwitch
 
F7: cmp [DebuggeePID],0
jz .No
call OnStep
.No:jmp WaitEvent
 
F8: cmp [DebuggeePID],0
jz F7.No
call OnProceed
jmp F7.No
 
even 16
Mouse:
if 0
mov eax,SF_MOUSE_GET
mov ebx,SSF_BUTTON_EXT
int 0x40
mov byte [MouseState],1
bt eax,24 ;left but. double click
jc @F
mov byte [MouseState],0
bt eax,8 ;left but. down
jc @F
jmp WaitEvent
@@:
mov eax,SF_MOUSE_GET
mov ebx,SSF_WINDOW_POSITION
int 0x40
end if
jmp WaitEvent
 
DumpScreen:
pushad
mov dword [DumpName+4],'0000'
.1:
mov [DumpBlock.Func],SSF_GET_INFO
mcall 70,DumpBlock
or eax,eax
jnz .2
inc byte [DumpName+7]
cmp byte [DumpName+7],'9'
jbe .1
mov byte [DumpName+7],'0'
inc byte [DumpName+6]
cmp byte [DumpName+6],'9'
jbe .1
mov byte [DumpName+6],'0'
popad
ret
.2: mov [DumpBlock.Func],SSF_CREATE_FILE
mcall 70,DumpBlock
or eax,eax
jnz .Err
mov ebx,[CurHeight]
mov esi,ConsoleDataPtr
mov edi,ConsoleDataOld
.3: mov ecx,[CurWidth]
.4: mov al,[rsi]
test al,al
jz .5
cmp al,0Ah
jz .5
cmp al,0Dh
jz .5
cmp al,10h
jb .X
jmp .6
.5: mov al,20h
jmp .6
.X: mov al,'.'
.6: mov [rdi],al
add esi,2
inc edi
loop .4
mov byte [rdi],13
inc edi
dec ebx
jnz .3
mov ecx,[CurWidth]
inc ecx
imul ecx,[CurHeight]
mov [DumpBlock.Size],ecx
mov [DumpBlock.Func],SSF_WRITE_FILE
mcall 70,DumpBlock
.Err: popad
ret
 
AfterGoException:
push eax
mov eax,[TempBreak]
dec eax
push esi
call EnableBreakPoint
; in any case, clear TF and RF
call GetNewContext
and [_EFL],not 10100h ; clear TF,RF
call SetContext
xor edx,edx
mov [TempBreak],edx
xchg dl,[bAfterGo]
pop esi
pop eax
cmp dl,2
jnz @F
lodsd
push esi
call GetDump
jmp Exception.Done
@@:
test eax,eax
jz .NotInt1
; if exception is result of single step, simply ignore it and continue
test dword [esi],0xF
jnz DbgMsgStart.5
lodsd
push esi
mov esi,OldContext
mov edi,Context
mov ecx,28h/4
rep movsd
call DoResume
jmp DbgMsgEnd
.NotInt1:
; in other case, work as without temp_break
lodsd
push esi
push eax
jmp Exception.4
 
.NoTour:
 
DebugMsg:
neg [DbgBufSize]
mov esi,DbgBuf
DbgMsgStart:
lodsd
add esi,4
dec eax
jz Exception
dec eax
jz Terminated
dec eax
jnz DbgNotify
 
mov [bSuspended],1
cmp [bAfterGo],0
jnz AfterGoException
push esi
call GetNewContext
and [_EFL],not 10100h ; clear TF,RF
call SetContext
pop esi
.5:
push esi
call GetDump
pop esi
lodsd
xor ecx,ecx
.6:
bt eax,ecx
jnc .7
mov ebx,[DrXBreak+ecx*4]
test ebx,ebx
jz .7
pushad
dec ebx
push ebx
mov esi,aBreakStop
call PutMessageNoDraw
popad
.7:
inc ecx
cmp cl,4
jb .6
push esi
jmp Exception.DoneDraw
 
DbgNotify:
int3
add esi,32
push esi
jmp DbgMsgEnd
 
Terminated:
push esi
mov esi,TerminatedMsg
call PutMessage
and [DebuggeePID],0
and [TempBreak],0
mov [bAfterGo],0
xor eax,eax
mov ecx,BreakPointsN*6/4+4
mov edi,BreakPoints
rep stosd
cmp [bReload],1
sbb [bReload],-1
jnz Exception.Done
call FreeSymbols
jmp Exception.Done
 
Exception:
mov [bSuspended],1
cmp [bAfterGo],0
jnz AfterGoException
lodsd
push esi
push eax
call GetNewContext
and [_EFL],not 10100h ; clear TF,RF
call SetContext
.4:
call GetDump
pop eax
; int3 command generates exception 0x0D, #GP
push eax
cmp al,0x0D
jnz .NotDbg
; check for 0xCC byte at eip
push 0
mcall 69,6,[DebuggeePID],1,[_EIP],esp
pop eax
cmp al,0xCC
je .Int3
; check for 0xCD03 word at eip
push 0
inc edx
mcall 69;,6,[DebuggeePID],2,[_EIP],esp
pop eax
cmp ax,0x03CD
jne .NotDbg
mov eax,[_EIP]
inc [_EIP]
inc [_EIP]
jmp .UserINT3
.Int3:
; this is either dbg breakpoint or int3 cmd in debuggee
mov eax,[_EIP]
call FindEnabledBreakPoint
jnz .UserINT3
; dbg breakpoint; clear if one-shot
pop ecx
push eax
mov esi,aBreakStop
test byte [edi+4],4
jz .PutMsgEAX
pop ecx
call ClearBreakPoint
jmp .Done
 
.UserINT3:
mov eax,[_EIP]
inc [_EIP]
.UserINT3_:
pop ecx
push eax
call SetContext
mov esi,aUserBreak
jmp .PutMsgEAX
 
.NotDbg:
pop eax
push eax
push eax
mov esi,aException
call PutMessageNoDraw
pop eax
 
cmp al,16
ja .Suspended
mov esi,[MsgFaultSel+eax*4]
.ShowMess:
call PutMessageNoDraw
.Suspended:
mov esi,aSuspended
.PutMsgEAX:
call PutMessageNoDraw
.DoneDraw:
call DrawMessages
.Done:
mcall 18,3,[DbgWnd] ; activate dbg window
call ShowImage
 
DbgMsgEnd:
pop esi
mov ecx,[DbgBufLen]
add ecx,DbgBuf
cmp esi,ecx
jnz DbgMsgStart
and [DbgBufLen],0
neg [DbgBufSize]
cmp [bReload],2
jnz @F
mov [bReload],0
call DoReLoad
@@:
jmp WaitEvent
 
;-----------------------------------------------------------------------------
; Add breakpoint
; in: EAX = address; BL = flags
; out: CF = 1 => error
; CF = 0 and EAX = breakpoint number
AddBreakPoint:
xor ecx,ecx
mov edi,BreakPoints
@@:
test byte [edi+4],1
jz .Found
add edi,6
inc ecx
cmp ecx,BreakPointsN
jb @B
stc
ret
.Found:
stosd
xchg eax,ecx
mov [edi],bl
test bl,2
jnz @F
or byte [edi],2
push eax
call EnableBreakPoint
pop eax
@@:
clc
ret
;-----------------------------------------------------------------------------
; Remove breakpoint
ClearBreakPoint:
cmp eax,BreakPointsN
jae .Ret
mov ecx,4
inc eax
.1:
cmp [DrXBreak-4+ecx*4],eax
jnz @F
and [DrXBreak-4+ecx*4],0
@@:
loop .1
dec eax
push eax
add eax,eax
lea edi,[BreakPoints+eax+eax*2+4]
test byte [edi],1
pop eax
jz .Ret
push edi
call DisableBreakPoint
pop edi
mov byte [edi],0
.Ret:
ret
;-----------------------------------------------------------------------------
; Disable breakpoint
DisableBreakPoint:
cmp eax,BreakPointsN
jae .Ret
add eax,eax
lea edi,[BreakPoints+eax+eax*2+5]
test byte [edi-1],1
jz .Ret
test byte [edi-1],2
jnz .Ret
or byte [edi-1],2
test byte [edi-1],8
jnz .DR
push esi
mcall 69,7,[DebuggeePID],1,[edi-5]
pop esi
.Ret:
ret
.DR:
mov dl,[edi]
shr dl,6
mov dh,80h
mcall 69,9,[DebuggeePID]
ret
;-----------------------------------------------------------------------------
; Enable breakpoint
EnableBreakPoint:
push esi
cmp eax,BreakPointsN
jae .Ret
add eax,eax
lea edi,[BreakPoints+eax+eax*2+5]
test byte [edi-1],1
jz .Ret
test byte [edi-1],2
jz .Ret
and byte [edi-1],not 2
test byte [edi-1],8
jnz .DR
mcall 69,6,[DebuggeePID],1,[edi-5]
dec eax
jnz .Err
push 0xCC
mov edi,esp
inc ebx
mcall 69
pop eax
.Ret:
pop esi
ret
.Err:
or byte [edi-1],2
mov esi,aBreakErr
call PutMessage
pop esi
ret
.DR:
mov esi,[edi-5]
mov dl,[edi]
shr dl,6
mov dh,[edi]
and dh,0xF
mcall 69,9,[DebuggeePID]
test eax,eax
jnz .Err
pop esi
ret
;-----------------------------------------------------------------------------
; Find breakpoint
FindBreakPoint:
xor ecx,ecx
xchg eax,ecx
mov edi,BreakPoints
@@:
test byte [edi+4],1
jz .Cont
test byte [edi+4],8
jnz .Cont
cmp [edi],ecx
jz .Found
.Cont:
add edi,6
inc eax
cmp eax,BreakPointsN
jb @B
or eax,-1
.Found:
ret
;-----------------------------------------------------------------------------
;
FindEnabledBreakPoint:
xor ecx,ecx
xchg eax,ecx
mov edi,BreakPoints
@@:
test byte [edi+4],1
jz .Cont
test byte [edi+4],2 or 8
jnz .Cont
cmp [edi],ecx
jz .Found
.Cont:
add edi,6
inc eax
cmp eax,BreakPointsN
jb @B
or eax,-1
.Found:
ret
 
GetDump:
if 0
mov edi,DumpData
mov esi,[edi-4]
mov edx,DUMP_HEIGHT*10h
mov ecx,edx
xor eax,eax
push edi
rep stosb
pop edi
mcall 69,6,[DebuggeePID]
cmp eax,-1
jnz @F
mov esi,ReadMemErr
call PutMessage
xor eax,eax
@@:
mov [edi-8],eax
; in: edi=buffer,eax=size,esi=address
RestoreFromBreaks:
mov ebx,BreakPoints
@@:
test byte [ebx+4],1
jz .Cont ; ignore invalid
test byte [ebx+4],2 or 8
jnz .Cont ; ignore disabled and memory breaks
mov ecx,[ebx]
sub ecx,esi
cmp ecx,eax
jae .Cont
mov dl,[ebx+5]
mov [edi+ecx],dl
.Cont:
add ebx,6
cmp ebx,BreakPoints+BreakPointsN*6
jb @B
end if
ret
 
; in: edi=buffer,esi=address
RestoreFromBreaksOne:
mov ebx,BreakPoints
@@:
test byte [ebx+4],1
jz .Cont ; ignore invalid
test byte [ebx+4],2 or 8
jnz .Cont ; ignore disabled and memory breaks
mov ecx,[ebx]
sub ecx,esi
cmp ecx,1
jae .Cont
mov dl,[ebx+5]
mov [edi+ecx],dl
jmp .Exit
.Cont:
add ebx,6
cmp ebx,BreakPoints+BreakPointsN*6
jb @B
.Exit:
ret
 
GetCommandLine:
cmp ah,0x01
jz .Esc
cmp al,8
jz .Backspace
cmp al,0xB0
jz .Left
cmp al,0xB3
jz .Right
cmp al,0x0D
jz .Enter
cmp al,0xB6
jz .Del
cmp al,0xB4
jz .Home
cmp al,0xB5
jz .End
cmp al,0xB1
jz .Dn
cmp al,0xB2
jz .Up
mov [CmdHistBuffer.TmpLineFlag],0
cmp [CmdLineLen],CMD_WIDTH
jae WaitEvent
push eax
call ClearCmdLineEnd
pop eax
mov edi,CmdLine
mov ecx,[CmdLineLen]
add edi,ecx
lea esi,[edi-1]
sub ecx,[CmdLinePos]
std
rep movsb
cld
stosb
inc [CmdLineLen]
call DrawCmdLineEnd
inc [CmdLinePos]
call DrawCursor
jmp WaitEvent
 
 
.Esc:
xor eax,eax
mov [CmdLinePos],eax
mov [CmdLineLen],eax
mov [CmdLineActive],al
call DrawCursor
jmp WaitEvent
 
.Backspace:
mov [CmdHistBuffer.TmpLineFlag],0
cmp [CmdLinePos],0
jz WaitEvent
dec [CmdLinePos]
 
.DelChar:
mov [CmdHistBuffer.TmpLineFlag],0
call ClearCmdLineEnd
mov edi,[CmdLinePos]
dec [CmdLineLen]
mov ecx,[CmdLineLen]
sub ecx,edi
add edi,CmdLine
lea esi,[edi+1]
rep movsb
call DrawCmdLineEnd
call DrawCursor
jmp WaitEvent
 
.Del:
mov eax,[CmdLinePos]
cmp eax,[CmdLineLen]
jae WaitEvent
jmp .DelChar
 
.Left:
cmp [CmdLinePos],0
jz WaitEvent
call HideCursor
dec [CmdLinePos]
call DrawCursor
jmp WaitEvent
 
.Right:
mov eax,[CmdLinePos]
cmp eax,[CmdLineLen]
jae WaitEvent
call HideCursor
inc [CmdLinePos]
call DrawCursor
jmp WaitEvent
 
.Home:
call HideCursor
and [CmdLinePos],0
call DrawCursor
jmp WaitEvent
 
.End:
call HideCursor
mov eax,[CmdLineLen]
mov [CmdLinePos],eax
call DrawCursor
jmp WaitEvent
 
.Up:
xor edx,edx
jmp .Hist
.Dn:
xor edx,edx
inc edx
.Hist:
cmp [CmdHistBuffer.TmpLineFlag],1
je @F
mov eax,CmdLine
mov ecx,[CmdLineLen]
mov byte [eax+ecx],0
call AddCmdHistTmpLine
@@:
test edx,edx
jnz .Hist.Next
cmp [CmdHistBuffer.NFlag],0
jne @F
call GetCmdHistLine
inc [CmdHistBuffer.NFlag]
jmp .Hist.CPLine
 
@@:
call PrevCmdHistLine
jc WaitEvent
call GetCmdHistLine
inc [CmdHistBuffer.NFlag]
jmp .Hist.CPLine
 
.Hist.Next:
cmp [CmdHistBuffer.NFlag],0
je WaitEvent
 
call NextCmdHistLine
call GetCmdHistLine
jnc .Hist.CPLine
call GetCmdHistTmpLine
mov [CmdHistBuffer.TmpLineFlag],0
mov [CmdHistBuffer.NFlag],0
 
.Hist.CPLine:
 
mov esi,eax
mov edi,CmdLine
xor ecx,ecx
@@:
inc ecx
lodsb
stosb
test al,al
jnz @B
 
dec ecx
mov [CmdLinePos],0
call ClearCmdLineEnd
mov [CmdLineLen],ecx
mov [CmdLinePos],ecx
call DrawCmdLine
call DrawCursor
 
jmp WaitEvent
 
; We also trying to execute previous command, if empty command_line
.Enter:
mov [CmdLineActive],0
 
mov ecx,[CmdLineLen]
test ecx,ecx
jnz .ExecCur
mov cl,byte [CmdLinePrev]
cmp cl,0
jz WaitEvent
 
.ExecPrev:
mov esi,CmdLinePrev
jmp .Exec
 
.ExecCur:
mov esi,CmdLine
 
.Exec:
mov byte [esi+ecx],0
 
mov eax,esi
call AddCmdHistLine
mov [CmdHistBuffer.NFlag],0
 
and [CmdLinePos],0
push esi
call ClearCmdLineEnd
call DrawCursor
pop esi
and [CmdLineLen],0
; skip leading spaces
call GetArg.SkipSpaces
cmp al,0
jz WaitEvent
; now esi points to command
push esi
mov esi,Prompt
call PutMessageNoDraw
pop esi
push esi
call PutMessageNoDraw
Z1:
mov esi,NewLine
call PutMessage
pop esi
push esi
call GetArg
mov [CurArg],esi
pop edi
mov esi,Commands
call FindCmd
mov eax,aUnknownCommand
jc .X11
 
; check command requirements
; flags field:
; &1: command may be called without parameters
; &2: command may be called with parameters
; &4: command may be called without loaded program
; &8: command may be called with loaded program
mov eax,[esi+8]
mov ecx,[CurArg]
cmp byte [ecx],0
jz .NoArgs
test byte [esi+16],2
jz .X11
jmp @F
 
.NoArgs:
test byte [esi+16],1
jz .X11
@@:
cmp [DebuggeePID],0
jz .NoDebuggee
mov eax,aAlreadyLoaded
test byte [esi+16],8
jz .X11
jmp .X9
 
.NoDebuggee:
mov eax,NeedDebuggee
test byte [esi+16],4
jnz .X9
.X11:
xchg esi,eax
call PutMessage
; store cmdline for repeating
.X10:
mov esi,CmdLine
mov ecx,[CmdLineLen]
@@:
or ecx,ecx
jle .We
mov al,[esi+ecx]
mov [CmdLinePrev+ecx],al
dec ecx
jmp @B
 
.We:
mov [CmdLineLen],0
jmp WaitEvent
 
.X9:
call dword [esi+4]
jmp .X10
 
PutMessage:
call PutMessageNoDraw
DrawMessages:
mov [AfterKey],1
call ShowImage
ret
 
include "cmdhist.inc"
include "parser.inc"
include "message.inc"
 
HeaderN db 'SunSys Debugger ver ',VERSION,' - No program loaded',0
HeaderY db 'SunSys Debugger ver ',VERSION,' - ',60 dup 32,0
HeaderE:
;
LoadErrMsg db 'Cannot load program. ',0
UnkErrMsg db 'Unknown error code -%4X',10,0
aCannotLoadFile db 'Cannot load file. ',0
UnkErrMsg2 db 'Unknown error code %4X.',10,0
LoadErrMsgs:
dd .1,0,.3,0,.5,.6,0,0,.9,.A,0,0,0,0,0,0
dd 0,0,0,0,0,0,0,0,0,0,0,0,0,.1E,.1F,.20
.1 db 'HD undefined.',10,0
.3 db 'Unknown FS.',10,0
.5 db 'File not found.',10,0
.6 db 'Unexpected EOF.',10,0
.9 db 'FAT table corrupted.',10,0
.A db 'Access denied.',10,0
.1E db 'No memory.',10,0
.1F db 'Not Menuet/Kolibri executable.',10,0
.20 db 'Too many processes.',10,0
LoadSuccMsg db 'Program loaded successfully! PID=%4X. Use "g" to run.',10,0
TerminatedMsg db 'Program terminated.',10,0
MsgFaultSel dd aDivide,aDebug,aNonMask,aUndefined,aOverflow
dd aBounds,aInvalid,aCoProcessorNA,aDoubleFault
dd aUndefined,aInvalidTSS,aSegment,aStack
dd aProtection,aPageFault,aUndefined,aCoProcessor
aDivide db '(Divide error)',10,0
aDebug db '(Single-step/debug exception)',10,0
aNonMask db '(Nonmaskable interrupt)',10,0
aOverflow db '(Overflow)',10,0
aBounds db '(Bounds check)',10,0
aInvalid db '(Invalid opcode)',10,0
aCoProcessorNA db '(Coprocessor not available)',10,0
aDoubleFault db '(Double fault)',10,0
aUndefined db '(Undefined fault)',10,0
aInvalidTSS db '(Invalid TSS)',10,0
aSegment db '(Segment not present)',10,0
aStack db '(Stack fault)',10,0
aProtection db '(General protection fault)',10,0
aPageFault db '(Page fault)',10,0
aCoProcessor db '(Coprocessor error)',10,0
aSuspended db 'Suspended',10,0
aContinued db 'Continuing',10,0
aRunningErr db 'Program is running',10,0
aException db 'Debugged program caused an exception %2X. ',0
aBreakErr db 'Cannot activate breakpoint, it will be disabled',10,0
aDuplicateBreakpoint db 'Duplicate breakpoint',10,0
aInvalidBreak db 'Invalid breakpoint number',10,0
aBreakNum db '%2X: at %8X',0
aMemBreak1 db '%2X: on ',0
aMemBreak2 db 'read from ',0
aMemBreak3 db 'access of ',0
aMemBreak4 db 'byte',0
aMemBreak5 db 'word',0
aMemBreak6 db 'dword',0
aMemBreak7 db ' at %8X',0
aOneShot db ', one-shot',0
aDisabled db ', disabled',0
aBreakStop db 'Breakpoint #%2X',10,0
aUserBreak db 'int3 command at %8X',10,0
ReadMemErr db 'ERROR: cannot read process memory!!!',10,0
aBreakpointLimitExceeded db 'Breakpoint limit exceeded',10,0
aUnknownCommand db 'Unknown command',10,0
NeedDebuggee db 'No program loaded. Use "load" command.',10,0
aAlreadyLoaded db 'Program is already loaded. Use "terminate" or "detach" commands',10,0
aParseError db 'Parse error',10,0
aDivByZero db 'Division by 0',10,0
CalcString db '%8X',10,0
aNoMemory db 'No memory',10,0
aSymbolsLoaded db 'Symbols loaded',10,0
aUnaligned db 'Unaligned address',10,0
aEnabledBreakErr db 'Enabled breakpoints are not allowed',10,0
aInterrupted db 'Interrupted',10,0
aUnpacked db 'Unpacked successful!',10,0
OnBeErrMsg db 'There is already enabled breakpoint on this address',10,0
 
DumpPath db '/TMP0/1/'
DumpName db 'DUMP0000.TXT',0
 
even 4
ConsoleColors dd 0x000000,0x000080,0x008000,0x008080
dd 0x800000,0x800080,0x808000,0xC0C0C0
dd 0x1D272F,0x0000FF,0x00FF00,0x00FFFF;0x808080,0x0000FF,0x00FF00,0x00FFFF
dd 0xFF0000,0xFF00FF,0xFFFF00,0xFFFFFF
 
CurWidth dd MinWidth
CurHeight dd MinHeight
FillWidth dd 0
FillHeight dd 0
 
MemForImage dd 0
 
bWasE0 db 0
CtrlState db 0
MouseState db 0
bMemForImageValidData db 0
 
bReload db 0
bAfterGo db 0
bSuspended db 0
CodeType db 32
 
DoDraw db 0
SymbolSection db 0
CmdLineActive db 0,?
 
CursorX dd -1
CursorY dd -1
CursorSize dd CursorNormSize
CurCursorPos dd -1
OldCursorPos dd -1
 
DebuggeePID dd 0
 
DumpBlock:
.Func dd 0
dd 0
dd 0
.Size dd 0
dd ConsoleDataOld
db 0
dd DumpPath
 
FN70LoadBlock: dd 7
dd 1
LoadParams dd 0
dd 0
dd 0
LoadName: db 0
rb 255
 
FN70ReadBlock: dd 0
rq 1
dd ?
dd ?
db 0
dd ?
 
FN70AttrBlock: dd 5
dd 0,0,0
dd FileAttr
db 0
dd ?
 
IncludeAllGlobals
 
DbgWnd dd ?
TempBreak dd ?
 
WndWidth dd ?
WndHeight dd ?
 
MinY dd ?
MaxY dd ?
MinX dd ?
MaxX dd ?
 
Tmp dd ?
SkinH dd ?
StdColors rd 10
 
AppPath rb 4096
ProcInfo rb 1024
 
even 16
ConsoleDataPtr rw (MaxWidth+0)*MaxHeight
even 16
ConsoleDataOld rw (MaxWidth+1)*MaxHeight
 
even 16
NeedZeroStart:
 
DbgBufSize dd ?
DbgBufLen dd ?
DbgBuf rb 256
 
FileAttr rb 40
 
even 4
Context:
_EIP dd ?
_EFL dd ?
_EAX dd ?
_ECX dd ?
_EDX dd ?
_EBX dd ?
_ESP dd ?
_EBP dd ?
_ESI dd ?
_EDI dd ?
 
_CTX_FLAGS:
dd ?
dd ?
 
_SSE_FLAGS:
 
_FCW dw ?
_FSW dw ?
_FTW db ?
db ?
_FOP dw ?
_FPU_IP dd ?
dw ?
dw ?
 
_FPU_DP dd ?
dw ?
dw ?
 
_MXCSR dd ?
_MXCSRM dd ?
 
FPU_CONTEXT:
MMX_CONTEXT:
_ST0:
_MM0: rq 2
_ST1:
_MM1: rq 2
_ST2:
_MM2: rq 2
_ST3:
_MM3: rq 2
_ST4:
_MM4: rq 2
_ST5:
_MM5: rq 2
_ST6:
_MM6: rq 2
_ST7:
_MM7: rq 2
 
SSE_CONTEXT:
_XMM0 rq 2
_XMM1 rq 2
_XMM2 rq 2
_XMM3 rq 2
_XMM4 rq 2
_XMM5 rq 2
_XMM6 rq 2
_XMM7 rq 2
CtxEnd:
 
OldContext rb (CtxEnd-Context)
 
Plus = (OldContext-Context)
 
StepNum dd ?
ProcNum dd ?
if 0
DUMP_HEIGHT = 6 ; in text lines
;
DumpRead dd ?
DumpPos dd ?
DumpData rb DUMP_HEIGHT*10h
end if
 
CmdLine rb CMD_WIDTH+1
CmdLineLen dd ?
CmdLinePos dd ?
CurArg dd ?
 
CmdLinePrev rb CMD_WIDTH+1
 
SymbolsFile rb 260
 
PrgNamePtr dd ?
PrgNameLen dd ?
 
Symbols dd ?
NumSymbols dd ?
 
CmdHistBuffer:
.Ptr dd ?
.Size dd ?
.LastNodeOffset dd ?
.NewNodeOffset dd ?
.CurNodeOffset dd ?
.TmpLineFlag db ?
.NFlag db ?
 
; breakpoint structure:
; dword +0: address
; byte +4: flags
; bit 0: 1 <=> breakpoint valid
; bit 1: 1 <=> breakpoint disabled
; bit 2: 1 <=> one-shot breakpoint
; bit 3: 1 <=> DRx breakpoint
; byte +5: overwritten byte
; for DRx breaks: flags + (index shl 6)
BreakPointsN = 256
BreakPoints rb BreakPointsN*6
DrXBreak rd 4
;-----------------------------------------------------------------------------
CurrentWindow dd ?
CPUXPos dd ? ; coordinates of cursor in windows
CPUYPos dd ?
CPUXPtr dd ?
MemXPos dd ?
MemYPos dd ?
StkXPos dd ?
StkYPos dd ?
RegXPos dd ?
RegYPos dd ?
RegLDat dd ?
RegXPtr dd ?
CPUType db ?
FPUType db ?
MMXType db ?
XMMType db ?
JumpTaken db ?
AfterKey db ?
;-----------------------------------------------------------------------------
TmpB rb 0
Temp dd ?
;-----------------------------------------------------------------------------
CodeAddr dd ? ;0 order
RegsAddr dd ? ;1
DataAddr dd ? ;2
StckAddr dd ? ;3
OriginPtr: rd 2
AddrBuffer: rd 30
;-----------------------------------------------------------------------------
NeedZeroEnd:
;-----------------------------------------------------------------------------
BufferI: rb 1024
BufferO: rb 1024
;-----------------------------------------------------------------------------
; stack
even 4
rb 32768
StackTop:
;-----------------------------------------------------------------------------
Mem:
;-----------------------------------------------------------------------------
I_END = UDataStr ;%v
;-----------------------------------------------------------------------------
/programs/develop/koldbg/kosfuncs.inc
0,0 → 1,298
 
; KolibriOS system functions:
SF_TERMINATE_PROCESS=-1
SF_CREATE_WINDOW=0 ; define and draw the window
SF_PUT_PIXEL=1 ; draw pixel to the window
SF_GET_KEY=2 ; get code of the pressed key
SF_GET_SYS_TIME=3
SF_DRAW_TEXT=4
SF_SLEEP=5 ; pause process
SF_PUT_IMAGE=7 ; draw image to the window
SF_DEFINE_BUTTON=8 ; define/delete the button
SF_THREAD_INFO=9 ; information on execution thread
SF_WAIT_EVENT=10 ; wait for event
SF_CHECK_EVENT=11 ; check for event and return
SF_REDRAW=12
SSF_BEGIN_DRAW=1
SSF_END_DRAW=2
SF_DRAW_RECT=13 ; draw rectangle to the window
SF_GET_SCREEN_SIZE=14 ; get screen resolution
SF_BACKGROUND_SET=15 ; work with desktop background graphics
SSF_SIZE_BG=1 ; set a size of the background image
SSF_PIXEL_BG=2 ; put pixel on the background image
SSF_REDRAW_BG=3 ; redraw background
SSF_MODE_BG=4 ; set drawing mode for the background
SSF_IMAGE_BG=5 ; put block of pixels on the background image
SSF_MAP_BG=6 ; map background image to the address space of the process
SSF_UNMAP_BG=7 ; close mapped background data
SSF_LAST_DRAW=8 ; get coordinates of the last draw to the background
SSF_REDRAW_RECT=9 ; redraws a rectangular part of the background
SF_RD_TO_FLOPPY=16 ; save ramdisk on the floppy
SF_GET_BUTTON=17 ; get ID of the pressed button
SF_SYSTEM=18
SSF_UNFOCUS_WINDOW=1 ; take focus from the window of the given thread
SSF_TERMINATE_THREAD=2 ; terminate process/thread by the slot number
SSF_FOCUS_WINDOW=3 ; give focus to the window of the given thread
SSF_GET_IDLE_COUNT=4 ; get counter of idle cycles per second
SSF_GET_CPU_FREQUENCY=5 ; get CPU clock rate
SSF_RD_TO_HDD=6 ; save ramdisk to the file on hard disk
SSF_GET_ACTIVE_WINDOW=7 ; get slot number of the active window
SSF_SPEAKER=8
SSSF_GET_STATE=1
SSSF_TOGGLE=2
SSF_SHUTDOWN=9 ; system shutdown/reboot
SSF_MINIMIZE_WINDOW=10 ; minimize active window
SSF_INFO_DISC_SYS=11 ; get disk subsystem information
SSF_KERNEL_VERSION=13 ; get kernel version
SSF_WAIT_RETRACE=14 ; wait for screen retrace
SSF_CURSOR_CENTER=15 ; center mouse cursor on the screen
SSF_GET_FREE_RAM=16 ; get size of free RAM
SSF_GET_TOTAL_RAM=17 ; get total amount of RAM
SSF_TERMINATE_THREAD_ID=18 ; Terminate process/thread by the ID
SSF_MOUSE_SETTINGS=19
SSSF_GET_SPEED=0
SSSF_SET_SPEED=1
SSSF_GET_SPEEDUP=2
SSSF_SET_SPEEDUP=3 ; set mouse acceleration
SSSF_SET_POS=4 ; set mouse pointer position
SSSF_SET_BUTTON=5 ; simulate state of mouse buttons
SSSF_GET_DOUBLE_CLICK_DELAY=6
SSSF_SET_DOUBLE_CLICK_DELAY=7
SSF_GET_RAM_INFO=20 ; get information on RAM
SSF_GET_THREAD_SLOT=21 ; get slot number of process/thread by the ID
SSF_FOREIGN_WINDOW=22 ; operations with window of another thread by slot/ID
SSSF_MINIMIZE=0
SSSF_MINIMIZE_ID=1
SSSF_RESTORE=2
SSSF_RESTORE_ID=3
SSF_MINIMIZE_ALL=23
SSF_SET_SCREEN_LIMITS=24
SSF_WINDOW_BEHAVIOR=25 ; window focus relation with other windows
SSSF_GET_WB=1
SSSF_SET_WB=2
SF_MIDI=20
SSF_RESET=1
SSF_OUTPUT=2
SF_SYSTEM_SET=21
SSF_MPU_MIDI_BASE=1
SSF_KEYBOARD_LAYOUT=2
SSF_SYS_LANG=5
SSF_ACCESS_HD_LBA=11 ; setting of low-level access to HD
SSF_ACCESS_PCI=12 ; setting of low-level access to PCI
SF_SET_TIME_DATE=22
SF_WAIT_EVENT_TIMEOUT=23; wait for event with timeout
SF_CD=24
SSF_EJECT_TRAY=4
SSF_INSERT_TRAY=5
SF_SCREEN_PUT_IMAGE=25 ; put image on the background layer
SF_SYSTEM_GET=26
; Same as SF_SYSTEM_SET, plus:
SSF_TIME_COUNT=9
SSF_TIME_COUNT_PRO=10 ; get value of the high precision time counter
SF_GET_SYS_DATE=29
SF_CURRENT_FOLDER=30
SSF_SET_CF=1 ; set current folder for the thread
SSF_GET_CF=2
SSF_ADD_SYS_FOLDER=3 ; install the add.system directory for the kernel
SF_GET_PIXEL_OWNER=34 ; get slot number of the screen pixel owner
SF_GET_PIXEL=35 ; read the screen pixel color
SF_GET_IMAGE=36 ; read the screen area
SF_MOUSE_GET=37
SSF_SCREEN_POSITION=0
SSF_WINDOW_POSITION=1
SSF_BUTTON=2 ; states of the mouse buttons
SSF_BUTTON_EXT=3 ; states and events of the mouse buttons
SSF_LOAD_CURSOR=4
SSF_SET_CURSOR=5
SSF_DEL_CURSOR=6
SSF_SCROLL_DATA=7
SF_DRAW_LINE=38
SF_BACKGROUND_GET=39
;SSF_SIZE_BG=1
;SSF_PIXEL_BG=2
;SSF_MODE_BG=4
SF_SET_EVENTS_MASK=40 ; turn on/off desired events
SF_PORT_IN_OUT=43 ; input/output to a port
SF_SET_PORTS=46 ; reserve/free a group of input/output ports
SF_DRAW_NUMBER=47 ; draw number to the window
SF_STYLE_SETTINGS=48
SSF_APPLY=0 ; apply screen settings
SSF_SET_BUTTON_STYLE=1
SSF_SET_COLORS=2
SSF_GET_COLORS=3 ; get standard window colors
SSF_GET_SKIN_HEIGHT=4
SSF_GET_SCREEN_AREA=5 ; get screen working area
SSF_SET_SCREEN_AREA=6
SSF_GET_SKIN_MARGINS=7
SSF_SET_SKIN=8
SSF_GET_FONT_SMOOTH=9
SSF_SET_FONT_SMOOTH=10
SSF_GET_FONT_SIZE=11
SSF_SET_FONT_SIZE=12
SF_APM=49
SF_SET_WINDOW_SHAPE=50
SF_CREATE_THREAD=51
SF_CLIPBOARD=54
SSF_GET_SLOT_COUNT=0 ; get the number of slots in the clipboard
SSF_READ_CB=1
SSF_WRITE_CB=2
SSF_DEL_SLOT=3 ; delete the last slot in the clipboard
SSF_UNLOCK_BUFFER=4 ; emergency buffer unlock
SF_SPEAKER_PLAY=55
SF_PCI_BIOS=57
SF_IPC=60 ; Inter Process Communication
SSF_SET_AREA=1 ; set area for IPC receiving
SSF_SEND_MESSAGE=2
SF_GET_GRAPHICAL_PARAMS=61
SSF_SCREEN_SIZE=1
SSF_BITS_PER_PIXEL=2
SSF_BYTES_PER_LINE=3
SF_PCI=62
SSF_GET_VERSION=0 ; get version of PCI-interface
SSF_GET_LAST_BUS=1 ; get number of the last PCI-bus
SSF_GET_ADRR_MODE=2 ; get addressing mode of the PCI configuration space
SSF_READ_BYTE=4
SSF_READ_WORD=5
SSF_READ_DWORD=6
SSF_WRITE_BYTE=8
SSF_WRITE_WORD=9
SSF_WRITE_DWORD=10
SF_BOARD=63
SSF_DEBUG_WRITE=1
SSF_DEBUG_READ=2
SF_MEMORY_RESIZE=64 ; resize total application memory
SF_PUT_IMAGE_EXT=65 ; draw image with palette to the window
SF_KEYBOARD=66
SSF_SET_INPUT_MODE=1
SSF_GET_INPUT_MODE=2
SSF_GET_CONTROL_KEYS=3; get status of control keys
SSF_SET_SYS_HOTKEY=4
SSF_DEL_SYS_HOTKEY=5
SSF_LOCK_INPUT=6 ; block normal input
SSF_UNLOCK_INPUT=7 ; restore normal input
SF_CHANGE_WINDOW=67 ; change position/sizes of the window
SF_SYS_MISC=68
SSF_GET_TASK_SWITCH_COUNT=0
SSF_SWITCH_TASK=1
SSF_PERFORMANCE=2
SSSF_ALLOW_RDPMC=0
SSSF_CACHE_STATUS=1
SSSF_CACHE_ON=2
SSSF_CACHE_OFF=3
SSF_READ_MSR=3
SSF_WRITE_MSR=4
SSF_HEAP_INIT=11
SSF_MEM_ALLOC=12
SSF_MEM_FREE=13
SSF_WAIT_SIGNAL=14 ; wait for signal from another program/driver
SSF_LOAD_DRIVER=16
SSF_CONTROL_DRIVER=17
SSF_LOAD_DLL=19
SSF_MEM_REALLOC=20
SSF_LOAD_DRIVER_PE=21
SSF_MEM_OPEN=22 ; open named memory area
SSF_MEM_CLOSE=23
SSF_SET_EXCEPTION_HANDLER=24
SSF_SET_EXCEPTION_STATE=25
SSF_MEM_FREE_EXT=26
SSF_LOAD_FILE=27
SF_DEBUG=69
SSF_SET_MESSAGE_AREA=0
SSF_GET_REGISTERS=1
SSF_SET_REGISTERS=2
SSF_DETACH=3
SSF_SUSPEND=4
SSF_RESUME=5
SSF_READ_MEMORY=6
SSF_WRITE_MEMORY=7
SSF_TERMINATE=8
SSF_DEFINE_BREAKPOINT=9
SF_FILE=70
SSF_READ_FILE=0
SSF_READ_FOLDER=1
SSF_CREATE_FILE=2
SSF_WRITE_FILE=3
SSF_SET_END=4
SSF_GET_INFO=5
SSF_SET_INFO=6
SSF_START_APP=7
SSF_DELETE=8
SSF_CREATE_FOLDER=9
SF_SET_CAPTION=71
SF_SEND_MESSAGE=72
SF_BLITTER=73
SF_NETWORK_DEVICE=74
SSF_DEVICE_COUNT=255 ; get number of active network devices
SSF_DEVICE_TYPE=0
SSF_DEVICE_NAME=1
SSF_RESET_DEVICE=2
SSF_STOP_DEVICE=3
SSF_DEVICE_POINTER=4
SSF_TX_PACKET_COUNT=6
SSF_RX_PACKET_COUNT=7
SSF_TX_BYTE_COUNT=8
SSF_RX_BYTE_COUNT=9
SSF_LINK_STATUS=10
SSF_TX_PACKET_ERROR_COUNT=11
SSF_TX_PACKET_DROP_COUNT=12
SSF_TX_PACKET_MISS_COUNT=13
SSF_RX_PACKET_ERROR_COUNT=14
SSF_RX_PACKET_DROP_COUNT=15
SSF_RX_PACKET_MISS_COUNT=16
SF_NETWORK_SOCKET=75
SSF_OPEN=0
SSF_CLOSE=1
SSF_BIND=2
SSF_LISTEN=3
SSF_CONNECT=4
SSF_ACCEPT=5
SSF_SEND=6
SSF_RECEIVE=7
SSF_SET_OPTIONS=8
SSF_GET_OPTIONS=9
SSF_SOCKET_PAIR=10
SF_NETWORK_PROTOCOL=76
SSF_ETHERNET_READ_MAC=0
SSF_IP4_PACKETS_SENT=10000h
SSF_IP4_PACKETS_RECEIVED=10001h
SSF_IP4_READ_IP=10002h
SSF_IP4_WRITE_IP=10003h
SSF_IP4_READ_DNS=10004h
SSF_IP4_WRITE_DNS=10005h
SSF_IP4_READ_SUBNET=10006h
SSF_IP4_WRITE_SUBNET=10007h
SSF_IP4_READ_GATEWAY=10008h
SSF_IP4_WRITE_GATEWAY=10009h
SSF_ICMP_PACKETS_SENT=20000h
SSF_ICMP_PACKETS_RECEIVED=20001h
SSF_ICMP_ECHO_REPLY=20003h
SSF_UDP_PACKETS_SENT=30000h
SSF_UDP_PACKETS_RECEIVED=30001h
SSF_TCP_PACKETS_SENT=40000h
SSF_TCP_PACKETS_RECEIVED=40001h
SSF_ARP_PACKETS_SENT=50000h
SSF_ARP_PACKETS_RECEIVED=50001h
SSF_ARP_GET_ENTRY_COUNT=50002h
SSF_ARP_READ_ENTRY=50003h
SSF_ARP_ADD_STATIC_ENTRY=50004h
SSF_ARP_DEL_ENTRY=50005h
SSF_ARP_SEND_ANNOUNCE=50006h
SSF_ARP_CONFLICTS_COUNT=50007h
SF_FUTEX=77
SSF_CREATE=0
SSF_DESTROY=1
SSF_WAIT=2
SSF_WAKE=3
 
; File system errors:
FSERR_SUCCESS=0
FSERR_UNSUPPORTED=2
FSERR_UNKNOWN=3
FSERR_FILE_NOT_FOUND=5
FSERR_END_OF_FILE=6
FSERR_INVALID_BUFFER=7
FSERR_DISK_FULL=8
FSERR_FAIL=9
FSERR_ACCESS_DENIED=10
FSERR_DEVICE_FAIL=11
FSERR_OUT_OF_MEMORY=12
/programs/develop/koldbg/loadmap.inc
0,0 → 1,43
uglobal
LastNames dq ?
ShowNames db ?
endg
 
FindEAX:push esi
and [LastNames],0
cmp [ShowNames],0
jnz .NoSymb
cmp eax,0x80
jl .NoSymb
lea esi,[eax-1]
test eax,esi
jz .NoSymb
call FindSymbol
jc .NoSymb
mov [LastNames],esi
cmp rdi,[TheBufferO]
jz .SetCol ;Skip starting address
push edi
@@:
lodsb
test al,al
jz @F
stosb
jmp @B
.SetCol:
mov [BufferO-1],byte 31h ;Label Color
.NoSymb:
stc
pop esi
ret
@@: mov ecx,edi
sub ecx,[esp]
cmp ecx,255
ifa mov ecx,255
pop edi
add edi,ecx
clc
pop esi
ret
 
include "symbols.inc"
/programs/develop/koldbg/make.bat
0,0 → 1,0
fasm koldbg.asm koldbg
/programs/develop/koldbg/message.inc
0,0 → 1,120
;-----------------------------------------------------------------------------
; Working with messages
; in: esi->ASCIIZ message
PutMessageNoDraw:
mov edx,[MessagesPos]
.M:
lea edi,[Messages+edx]
.L:
lodsb
cmp al,0
jz .Done
call TestScroll
cmp al,10
jz .NewLine
cmp al,'%'
jnz @F
cmp dword [esp],Z1
jnz .Format
@@:
stosb
inc edx
jmp .L
 
.NewLine:
push edx
mov ecx,MSG_WIDTH
xor eax,eax
xchg eax,edx
div ecx
xchg eax,edx
pop edx
test eax,eax
jz .M
sub edx,eax
add edx,ecx
jmp .M
 
.Done:
if 0
cmp byte [esi-2],10
jz .Exit
call TestScroll
if 1
push edx
mov ecx,MSG_WIDTH
xor eax,eax
xchg eax,edx
div ecx
xchg eax,edx
pop edx
test eax,eax
jz .Exit
sub edx,eax
add edx,ecx
end if
end if
.Exit:
mov [MessagesPos],edx
ret
 
; at this moment all format specs must be %<digit>X
.Format:
lodsb ; get <digit>
sub al,'0'
movzx ecx,al
lodsb
pop eax
pop ebp
push eax
; write number in ebp with ecx digits
dec ecx
shl ecx,2
 
.WriteNibble:
push ecx
call TestScroll
pop ecx
mov eax,ebp
shr eax,cl
and al,0xF
cmp al,10
sbb al,69h
das
stosb
inc edx
sub ecx,4
jns .WriteNibble
jmp .L
 
TestScroll:
cmp edx,MSG_WIDTH*MSG_HEIGHT
jnz .Ret
push esi
mov edi,Messages
lea esi,[edi+MSG_WIDTH]
mov ecx,(MSG_HEIGHT-1)*MSG_WIDTH/4
rep movsd
push eax
mov al,' '
push edi
push MSG_WIDTH
pop ecx
sub edx,ecx
rep stosb
pop edi
pop eax
pop esi
.Ret:
ret
 
MSG_WIDTH = DATA_WIDTH
MSG_HEIGHT = 14 ; in text lines
 
NewLine db 10,0
Prompt db '> ',0
 
uglobal
MessagesPos dd ?
Messages rb MSG_HEIGHT*MSG_WIDTH
endg
/programs/develop/koldbg/parser.inc
0,0 → 1,396
;-----------------------------------------------------------------------------
TokenEnd = 1
TokenReg = 2
TokenHex = 3
TokenOr = 4
TokenAnd = 5
TokenXor = 6
TokenAdd = 7
TokenSub = 8
TokenMul = 9
TokenDiv = 10
TokenLP = 11
TokenRP = 12
TokenErr = -1
;-----------------------------------------------------------------------------
RegTable:
db 2,'al',0
db 2,'cl',1
db 2,'dl',2
db 2,'bl',3
db 2,'ah',4
db 2,'ch',5
db 2,'dh',6
db 2,'bh',7
db 2,'ax',8
db 2,'cx',9
db 2,'dx',10
db 2,'bx',11
db 2,'sp',12
db 2,'bp',13
db 2,'si',14
db 2,'di',15
db 3,'eax',16
db 3,'ecx',17
db 3,'edx',18
db 3,'ebx',19
db 3,'esp',20
db 3,'ebp',21
db 3,'esi',22
db 3,'edi',23
db 3,'eip',24
db 0
;-----------------------------------------------------------------------------
; Check if byte is hex digit
IsHexDigit:
cmp al,'0'
jb .No
cmp al,'9'
jbe .09
cmp al,'A'
jb .No
cmp al,'F'
jbe .AF
cmp al,'a'
jb .No
cmp al,'f'
jbe .FA
.No:
stc
ret
.09:
sub al,'0'
; clc
ret
.AF:
sub al,'A'-10
; clc
ret
.FA:
sub al,'a'-10
; clc
ret
 
;-----------------------------------------------------------------------------
; Find register in the table
FindReg:
mov edi,RegTable
.FindReg:
movzx ecx,byte [edi]
stc
jecxz .RegNotFound
inc edi
push esi edi ecx
@@:
lodsb
or al,20h
scasb
loopz @B
pop ecx edi esi
lea edi,[edi+ecx+1]
jnz .FindReg
movzx edi,byte [edi-1]
add esi,ecx
.RegNotFound:
ret
 
;-----------------------------------------------------------------------------
; Tokenize expressions
ExprGetToken:
lodsb
cmp al,0
jz .EndToken
cmp al,' '
jbe ExprGetToken
cmp al,'|'
jz .Or
cmp al,'&'
jz .And
cmp al,'^'
jz .Xor
cmp al,'+'
jz .Add
cmp al,'-'
jz .Sub
cmp al,'*'
jz .Mul
cmp al,'/'
jz .Div
cmp al,'('
jz .LP
cmp al,')'
jnz .NotSign
.RP:
mov al,TokenRP
ret
.Or:
mov al,TokenOr
ret
.And:
mov al,TokenAnd
ret
.Xor:
mov al,TokenXor
ret
.Div:
mov al,TokenDiv
ret
.EndToken:
mov al,TokenEnd
ret
.Add:
mov al,TokenAdd
ret
.Sub:
mov al,TokenSub
ret
.Mul:
mov al,TokenMul
ret
.LP:
mov al,TokenLP
ret
.NotSign:
dec esi
call FindReg
jc .RegNotFound
mov al,TokenReg
ret
.RegNotFound:
; test for symbol
push esi
@@:
lodsb
cmp al,' '
ja @B
push eax
mov byte [esi],0
xchg esi,[esp+4]
call FindSymbolName
mov edi,eax
pop eax
xchg esi,[esp]
mov byte [esi],al
jc @F
add esp,4
mov al,TokenHex
ret
@@:
pop esi
; test for hex number
xor ecx,ecx
xor edi,edi
xor eax,eax
@@:
lodsb
call IsHexDigit
jc @F
shl edi,4
or edi,eax
inc ecx
jmp @B
@@:
dec esi
jecxz .Err
cmp ecx,8
ja .Err
mov al,TokenHex
ret
.Err:
mov al,TokenErr
mov esi,aParseError
ret
 
;-----------------------------------------------------------------------------
ExprRead2:
cmp al,TokenHex
jz .Hex
cmp al,TokenReg
jz .Reg
cmp al,TokenLP
jz .LP
mov al,TokenErr
mov esi,aParseError
ret
.Hex:
mov ebp,edi
.Ret:
jmp ExprGetToken
.Reg:
cmp edi,24
jz .EIP
sub edi,4
jb .8LO
sub edi,4
jb .8HI
sub edi,8
jb .16
mov ebp,[_EAX+edi*4]
jmp .Ret
.16:
movzx ebp,word [_EAX+(edi+8)*4]
jmp .Ret
.8LO:
movzx ebp,byte [_EAX+(edi+4)*4]
jmp .Ret
.8HI:
movzx ebp,byte [_EAX+(edi+4)*4+1]
jmp .Ret
.EIP:
mov ebp,[_EIP]
jmp .Ret
.LP:
call ExprGetToken
call ExprRead0
cmp al,TokenErr
jz @F
cmp al,TokenRP
jz ExprGetToken
mov al,TokenErr
mov esi,aParseError
@@:
ret
 
;-----------------------------------------------------------------------------
ExprRead1:
call ExprRead2
.1:
cmp al,TokenMul
jz .Mul
cmp al,TokenDiv
jz .Div
ret
.Mul:
push ebp
call ExprGetToken
call ExprRead2
pop edx
; ebp := edx*ebp
imul ebp,edx
jmp .1
.Div:
push ebp
call ExprGetToken
call ExprRead2
pop edx
; ebp := edx/ebp
test ebp,ebp
jz .Div0
push eax
xor eax,eax
xchg eax,edx
div ebp
xchg eax,ebp
pop eax
jmp .1
.Div0:
mov al,TokenErr
mov esi,aDivByZero
ret
 
;-----------------------------------------------------------------------------
ExprRead0:
xor ebp,ebp
cmp al,TokenOr
jz .Or
cmp al,TokenAnd
jz .And
cmp al,TokenXor
jz .Xor
cmp al,TokenAdd
jz .Add
cmp al,TokenSub
jz .Sub
call ExprRead1
.1:
cmp al,TokenOr
jz .Or
cmp al,TokenAnd
jz .And
cmp al,TokenXor
jz .Xor
cmp al,TokenAdd
jz .Add
cmp al,TokenSub
jz .Sub
ret
.Or:
push ebp
call ExprGetToken
call ExprRead1
pop edx
; ebp := edx | ebp
or ebp,edx
jmp .1
.And:
push ebp
call ExprGetToken
call ExprRead1
pop edx
; ebp := edx & ebp
and ebp,edx
jmp .1
.Xor:
push ebp
call ExprGetToken
call ExprRead1
pop edx
; ebp := edx ^ ebp
xor ebp,edx
jmp .1
.Add:
push ebp
call ExprGetToken
call ExprRead1
pop edx
; ebp := edx+ebp
add ebp,edx
jmp .1
.Sub:
push ebp
call ExprGetToken
call ExprRead1
pop edx
; ebp := edx-ebp
xchg edx,ebp
sub ebp,edx
jmp .1
 
;-----------------------------------------------------------------------------
; in: esi->expression
; out: CF=1 if error
; CF=0 and ebp=value if ok
CalcExpression:
call ExprGetToken
call ExprRead0
cmp al,TokenEnd
jz .End
cmp al,TokenErr
jz @F
mov esi,aParseError
@@:
call PutMessage
stc
ret
.End:
clc
ret
 
GetArg:
lodsb
cmp al,' '
ja GetArg
mov byte [esi-1],0
cmp al,0
jnz .SkipSpaces
dec esi
 
.SkipSpaces:
lodsb
cmp al,0
jz @F
cmp al,' '
jbe .SkipSpaces
@@:
dec esi
ret
/programs/develop/koldbg/readme.txt
0,0 → 1,119
Ââåäåíèå.
 
koldbg ïðåäñòàâëÿåò ñîáîé èíòåðàêòèâíûé îòëàä÷èê äëÿ îïåðàöèîííîé ñèñòåìû KolibriOS. Àâòîð ïðîãðàììû - Åâãåíèé Ãðå÷íèêîâ (Diamond). Äàííàÿ äîêóìåíòàöèÿ îïèñûâàåò âîçìîæíîñòè îòëàä÷èêà è ðàáîòó ñ íèì. Åñëè ó âàñ åñòü êàêèå-ëèáî âîïðîñû ïî ðàáîòå ñ ïðîãðàììîé èëè íóæíû êàêèå-òî âîçìîæíîñòè îòëàä÷èêà, êîòîðûõ åù¸ íåò, îáðàùàéòåñü íà ôîðóì board.kolibrios.org â ñîîòâåòñòâóþùóþ òåìó - http://board.kolibrios.org/viewtopic.php?f=45&t=358, èëè ïî àäðåñó àâòîðà - mailto:diamondz@land.ru.
 
Îáùåå îïèñàíèå.
 
 êàæäûé ìîìåíò âðåìåíè koldbg ìîæåò îòëàæèâàòü òîëüêî îäíó ïðîãðàììó. Íàçîâ¸ì òàêóþ ïðîãðàììó çàãðóæåííîé äëÿ îòëàäêè. Åñëè íèêàêàÿ ïðîãðàììà íå çàãðóæåíà, àáñîëþòíîå áîëüøèíñòâî äåéñòâèé ïî îòëàäêå íåäîñòóïíî.
 
koldbg óïðàâëÿåòñÿ êîìàíäíîé ñòðîêîé, ââîäèìîé ñ êëàâèàòóðû. Êîìàíäíàÿ ñòðîêà èçîáðàæàåòñÿ â íèæíåé ÷àñòè îêíà îòëàä÷èêà. Îáðàáàòûâàþòñÿ ñòàíäàðòíûå êëàâèøè ââîäà Backspace, Delete, Home, End, ñòðåëêè âëåâî/âïðàâî, ñòðåëêè ââåðõ/âíèç (ïðîêðó÷èâàíèå èñòîðèè êîìàíä). Êîìàíäû íå÷óâñòâèòåëüíû ê ðåãèñòðó ñèìâîëîâ.  êà÷åñòâå ðàçäåëèòåëÿ èñïîëüçóåòñÿ ïðîèçâîëüíîå íåíóëåâîå ÷èñëî ïðîáåëîâ.
 
 ëþáîé ìîìåíò îòëàä÷èê ìîæíî çàâåðøèòü êîìàíäîé "quit" (áåç àðãóìåíòîâ). Âïðî÷åì, ìîæíî è ïðîñòî íàæàòü íà êíîïêó çàêðûòèÿ â ïðàâîì âåðõíåì óãëó îêíà.
 
Çàïóñê îòëàä÷èêà áåç ïàðàìåòðîâ êîìàíäíîé ñòðîêè ïðèâîäèò ê òîìó, ÷òî íèêàêàÿ ïðîãðàììà íå çàãðóæåíà. Òàêæå koldbg ìîæíî çàïóñêàòü ñ êîìàíäíîé
ñòðîêîé, â ýòîì ñëó÷àå îí ïîïûòàåòñÿ çàãðóçèòü ïðîãðàììó ñ èìåíåì, óêàçàííûì êàê ïåðâûé àðãóìåíò êîìàíäíîé ñòðîêè, è ïàðàìåòðàìè, óêàçàííûìè êàê
ïîñëåäóþùèå (åñëè îíè åñòü).
 
Åñëè íèêàêàÿ ïðîãðàììà íå çàãðóæåíà, òî ìîæíî çàãðóçèòü ïðîãðàììó êîìàíäîé load:
load <ïîëíîå èìÿ èñïîëíÿåìîãî ôàéëà> [<àðãóìåíòû>]
Íàïðèìåð:
load /rd/1/example
LOAD /rd/1/aclock w200 h200
LoaD /hd0/1/menuetos/dosbox/dosbox
Âñ¸, ÷òî ñòîèò ïîñëå ïåðâîãî ïðîáåëà ïîñëå èìåíè èñïîëíÿåìîãî ôàéëà, äîñëîâíî ïåðåäà¸òñÿ ïðîãðàììå â êà÷åñòâå êîìàíäíîé ñòðîêè.
Êîìàíäà load ñîîáùàåò î ðåçóëüòàòå â îêíå ñîîáùåíèé (íåìíîãî âûøå îêíà êîìàíäíîé ñòðîêè). Åñëè ïðîãðàììó óäàëîñü çàãðóçèòü, òî îá ýòîì ïîÿâèòñÿ ñîîòâåòñòâóþùåå ñîîáùåíèå; åñëè íå óäàëîñü, òî â ñîîáùåíèè áóäåò óêàçàíà ïðè÷èíà îøèáêè. Íàèáîëåå âåðîÿòíàÿ - "file not found", åñëè íåïðàâèëüíî óêàçàíî èìÿ ôàéëà.
 
Îòëàä÷èê ìîæåò çàãðóæàòü ôàéëû ñ èíôîðìàöèåé îá èìåíàõ â ïðîãðàììå (ìåòêè, ãëîáàëüíûå ïåðåìåííûå) - òåêñòîâûå ôàéëû, êàæäàÿ ñòðîêà êîòîðûõ èìååò âèä 0x<hex_çíà÷åíèå_àäðåñà> <èìÿ> (ñòðîêè, íå èìåþùèå òàêîé âèä, èãíîðèðóþòñÿ). Òàêîé ôàéë ìîæåò áûòü ñîçäàí âðó÷íóþ èëè ñãåíåðèðîâàí àâòîìàòè÷åñêè ïðè êîìïèëÿöèè èñõîäíèêà fasm'îì.
ßâíàÿ çàãðóçêà îñóùåñòâëÿåòñÿ êîìàíäîé load-symbols:
load-symbols <ïîëíîå èìÿ ôàéëà ñèìâîëîâ>
Êðîìå òîãî, ïðè âûïîëíåíèè êîìàíäû load îòëàä÷èê ïðîâåðÿåò íàëè÷èå ôàéëà ñ òàêèì æå èìåíåì, êàê çàãðóæàåìûé áèíàðíèê, è ðàñøèðåíèåì .dbg (/rd/1/example.dbg äëÿ ïåðâîãî èç ïðèìåðîâ âûøå), è åñëè òàêîé åñòü, çàãðóæàåò åãî àâòîìàòè÷åñêè (âûäàâàÿ ñîîáùåíèå "Symbols loaded", åñëè âñ¸ â
ïîðÿäêå).
 
Ìîæåò ñëó÷èòüñÿ òàê, ÷òî çàãðóæåííàÿ ïðîãðàììà óïàêîâàíà. Îáùèé ïðèíöèï óïàêîâêè ïðîãðàìì ñëåäóþùèé: ñíà÷àëà èñõîäíûé ôàéë ïàêóåòñÿ (êàêèì-íèáóäü àëãîðèòìîì ñæàòèÿ), ïîòîì ïðèïèñûâàåòñÿ íåáîëüøîé ïî ðàçìåðó êîä, êîòîðûé ïîëó÷àåò óïðàâëåíèå ïðè çàïóñêå ïðîãðàììû, ðàñïàêîâûâàåò â ïàìÿòè èñõîäíûé êîä, ïîñëå ÷åãî ïåðåäà¸ò åìó óïðàâëåíèå. Åñëè ïðîãðàììà óïàêîâàíà, òî å¸ "íàñòîÿùèé" êîä íå âèäåí è äëÿ îòëàäêè íóæíî ïðåäâàðèòåëüíî ïðîéòè êîä ðàñïàêîâùèêà. koldbg îïðåäåëÿåò áîëüøèíñòâî ñóùåñòâóþùèõ óïàêîâùèêîâ (mxp, mxp_lzo, mxp_nrv, mtappack) è â ýòîì ñëó÷àå ïðåäëàãàåò àâòîìàòè÷åñêè ïðîéòè äî "íàñòîÿùåãî" êîäà. Ðåêîìåíäóåòñÿ ñîãëàñèòüñÿ (íàæàòü 'y' èëè <Enter>), íî ìîæíî è îòêàçàòüñÿ. Ïðè îòêàçå è â ñëó÷àå, êîãäà ïðîãðàììà óïàêîâàíà ÷åì-òî íåèçâåñòíûì, ìîæíî èñïîëüçîâàòü êîìàíäó "unpack" (áåç àðãóìåíòîâ). Âûçûâàéòå å¸ òîëüêî â ñëó÷àå,
êîãäà âû óâåðåíû, ÷òî ïðîãðàììà óïàêîâàíà è ÷òî óïðàâëåíèå åù¸ íå äîøëî äî îñíîâíîãî êîäà! [Íà÷èíàÿ ñ âåðñèè Kolibri 0.6.5.0, âåñü ýòîò àáçàö óæå íåàêòóàëåí, ïîñêîëüêó ïðèëîæåíèÿ ìîæíî óïàêîâûâàòü êàê è ëþáûå äâîè÷íûå ôàéëû kpack'îì è ïðè ýòîì êîä ðàñïàêîâùèêà íàõîäèòñÿ â ÿäðå è ðàñïàêîâêà ïðîçðà÷íà äëÿ îòëàäêè.]
 
Çàãðóæåííóþ ïðîãðàììó ìîæíî ïðèáèòü êîìàíäîé "terminate" (áåç àðãóìåíòîâ). Êîìàíäà "detach" (áåç àðãóìåíòîâ) îòêëþ÷àåòñÿ îò ïðîãðàììû, ïîñëå ÷åãî ïðîãðàììà ïðîäîëæàåò âûïîëíÿòüñÿ íîðìàëüíî, êàê åñëè áû îòëàä÷èêà íå áûëî. Ïîñëå îáåèõ ýòèõ êîìàíä ïðîãðàììà ïåðåñòà¸ò áûòü îòëàæèâàåìîé.
 
Ìîæíî çàíîâî çàãðóçèòü ïðîãðàììó äëÿ îòëàäêè êîìàíäîé "reload" (áåç àðãóìåíòîâ). Åñëè óæå åñòü çàãðóæåííàÿ ïðîãðàììà, òî îíà ïðèáèâàåòñÿ è
çàïóñêàåòñÿ (ñ ñàìîãî íà÷àëà) íîâûé ýêçåìïëÿð (ñ òîé æå êîìàíäíîé ñòðîêîé), â ýòîì ñëó÷àå êîìàíäà àíàëîãè÷íà êîìàíäàì:
terminate
load <last program name> <last program arguments>
 ïðîòèâíîì ñëó÷àå çàíîâî çàãðóæàåòñÿ ïðîãðàììà, êîòîðóþ îòëàæèâàëè ïîñëåäíåé (â òåêóùåì ñåàíñå ðàáîòû ñ koldbg) (ñ òîé æå êîìàíäíîé ñòðîêîé), ò.å. ïî÷òè òî æå ñàìîå, ÷òî è load <last program name> <last program arguments>, íî êîìàíäà reload â îáîèõ ñëó÷àÿõ êîðî÷å è óäîáíåå; êðîìå òîãî, load ñ÷èòàåò, ÷òî çàãðóæàåòñÿ íîâàÿ ïðîãðàììà, è ïåðåâîäèò îêíî äàííûõ (ñì. íèæå) íà íóëåâîé àäðåñ, à reload ñîõðàíÿåò òåêóùèé àäðåñ.
 
Âñåãäà äîñòóïíà êîìàíäà "help", êîòîðóþ ìîæíî ñîêðàùàòü äî "h".
Âñå êîìàíäû ðàçáèòû íà ãðóïïû.
help áåç àðãóìåíòîâ ïîêàçûâàåò ñïèñîê ãðóïï êîìàíä.
help ñ óêàçàíèåì ãðóïïû âûâîäèò ñïèñîê êîìàíä ýòîé ãðóïïû ñ êðàòêèìè
êîììåíòàðèÿìè.
help ñ óêàçàíèåì êîìàíäû âûâîäèò èíôîðìàöèþ î çàäàííîé êîìàíäå.
Íàïðèìåð:
help
help control
h LoaD
 
Îêíî îòëàä÷èêà ñîñòîèò èç ñëåäóþùèõ ýëåìåíòîâ, ïåðå÷èñëÿåìûõ ñâåðõó âíèç:
- ñòðîêà ñîñòîÿíèÿ. Ïðè íàëè÷èè çàãðóæåííîé ïðîãðàììû ïîêàçûâàåò åå èìÿ è ñîñòîÿíèå ("Running"/"Paused"), ïðè îòñóòñòâèè ñîîáùàåò "No program loaded".
- îêíî ðåãèñòðîâ - ïîêàçûâàåò çíà÷åíèÿ ðåãèñòðîâ îáùåãî íàçíà÷åíèÿ, ðåãèñòðà eip, ðåãèñòðà ôëàãîâ è ðåãèñòðîâ FPU/MMX. Ðåãèñòð ôëàãîâ îòîáðàæàåòñÿ äâóìÿ ñïîñîáàìè: ïîëíîå hex-çíà÷åíèå è ñîñòîÿíèÿ îòäåëüíûõ ôëàãîâ: CF,PF,AF,ZF,SF,DF,OF: åñëè ôëàã ñáðîøåí, òî èçîáðàæàåòñÿ ìàëåíüêàÿ áóêâà, åñëè óñòàíîâëåí, òî çàãëàâíàÿ. Ðåãèñòðû, èçìåíèâøèåñÿ ñ ïðåäûäóùåãî ìîìåíòà, ïîäñâå÷èâàþòñÿ îðàíæåâûì.
- îêíî äàííûõ (îêíî äàìïà) - ïîêàçûâàåò ñîäåðæèìîå ïàìÿòè çàãðóæåííîé ïðîãðàììû
- îêíî êîäà (îêíî äèçàññåìáëåðà) - ïîêàçûâàåò êîä ïðîãðàììû â âèäå äèçàññåìáëèðîâàííûõ èíñòðóêöèé
- îêíî ñîîáùåíèé
- îêíî êîìàíäíîé ñòðîêè
 
 îêíå äàìïà ìîæíî ïðîñìàòðèâàòü äàííûå, íà÷èíàÿ ñ ëþáîãî àäðåñà, äëÿ ýòîãî åñòü êîìàíäà:
d <âûðàæåíèå>
Êîìàíäà d áåç àðãóìåíòîâ ïðîëèñòûâàåò îêíî äàìïà âíèç. Òî æå ñàìîå îòíîñèòñÿ ê îêíó êîäà è êîìàíäå u <âûðàæåíèå> èëè ïðîñòî u.
Íàïðèìåð:
d esi - ïîêàçûâàåò äàííûå, íàõîäÿùèåñÿ ïî àäðåñó esi (íàïðèìåð, ïîëåçíà ïåðåä âûïîëíåíèåì èíñòðóêöèè rep movsb)
d esp - ïîêàçûâàåò ñòåê
u eip - äèçàññåìáëèðóåò èíñòðóêöèè, íà÷èíàÿ ñ òåêóùåé
 
Âûðàæåíèÿ â koldbg ìîãóò âêëþ÷àòü
- øåñòíàäöàòåðè÷íûå êîíñòàíòû
- èìåíà âñåõ ðåãèñòðîâ îáùåãî íàçíà÷åíèÿ (8 32-áèòíûõ, 8 16-áèòíûõ è 8 8-áèòíûõ) è ðåãèñòðà eip; çíà÷åíèÿ 16- è 8-áèòíûõ ðåãèñòðîâ ðàñøèðÿþòñÿ
íóëÿìè äî 32 áèò
- ÷åòûðå àðèôìåòè÷åñêèå îïåðàöèè +,-,*,/ (ñî ñòàíäàðòíûìè ïðèîðèòåòàìè) è ñêîáêè
- [åñëè åñòü èíôîðìàöèÿ î ñèìâîëàõ] èìåíà, çàãðóæåííûå èç dbg-ôàéëà
Âñå âû÷èñëåíèÿ ïðîèçâîäÿòñÿ ïî ìîäóëþ 2^32.
Ïðèìåðû âûðàæåíèé:
eax
eip+2
ecx-esi-1F
al+AH*bl
ax + 2* bH*(eip+a73)
3*esi*di/EAX
Êîìàíäà
? <âûðàæåíèå> âû÷èñëÿåò çíà÷åíèå óêàçàííîãî âûðàæåíèÿ.
 
Çíà÷åíèÿ ðåãèñòðîâ çàãðóæåííîé ïðîãðàììû ìîæíî èçìåíÿòü êîìàíäîé r, èìåþùåé äâå àáñîëþòíî ýêâèâàëåíòíûå ôîðìû:
r <ðåãèñòð> <âûðàæåíèå>
r <ðåãèñòð>=<âûðàæåíèå>
(â îáîèõ ñëó÷àÿõ ìîæíî ðàññòàâëÿòü ïðîáåëû ïî âêóñó).  êà÷åñòâå ðåãèñòðà ìîæíî óêàçûâàòü ëþáîé èç âûøåóïîìÿíóòûõ - 24 ðåãèñòðà îáùåãî íàçíà÷åíèÿ è eip.
 
 
Äîïóñòèì, êîìàíäà load óñïåøíî çàãðóçèëà ïðîãðàììó äëÿ îòëàäêè. Ñðàçó ïîñëå çàãðóçêè ïðîãðàììà ïðèîñòàíîâëåíà è íå âûïîëíÿåòñÿ.
Íàæàòèå F7 (àíàëîã êîìàíäíîé ñòðîêè - êîìàíäà "s") äåëàåò îäèí øàã â çàãðóæåííîé ïðîãðàììå, ïîñëå ÷åãî óïðàâëåíèå âîçâðàùàåòñÿ îòëàä÷èêó, êîòîðûé ïîêàçûâàåò íîâîå ñîäåðæèìîå ðåãèñòðîâ è ïàìÿòè. Ñèñòåìíûé âûçîâ int 40h (à òàêæå èíñòðóêöèè sysenter è syscall) ïðè ýòîì ñ÷èòàåòñÿ îäíèì øàãîì.
Íàæàòèå F8 (àíàëîã êîìàíäíîé ñòðîêè - êîìàíäà "p") òàêæå äåëàåò øàã â çàãðóæåííîé ïðîãðàììå, íî ïðè ýòîì âûçîâû ïðîöåäóð, ñòðîêîâûå îïåðàöèè ñ
ïðåôèêñîì rep/repz/repnz è öèêëû loop âûïîëíÿþòñÿ êàê îäèí øàã.
Êîìàíäû ïîøàãîâîãî âûïîëíåíèÿ èñïîëüçóþòñÿ, êàê ïðàâèëî, íà îòäåëüíûõ ó÷àñòêàõ ïðîãðàììû, êîãäà íóæíî, íàïðèìåð, ðåãóëÿðíî îòñëåæèâàòü çíà÷åíèÿ ðåãèñòðîâ è/èëè êàêèõ-òî ïåðåìåííûõ â ïàìÿòè.
Êîìàíäà g <âûðàæåíèå> âîçîáíîâëÿåò âûïîëíåíèå ïðîãðàììû è æä¸ò, ïîêà óïðàâëåíèå äîéä¸ò äî eip=ñîîòâåòñòâóþùåìó àäðåñó, è â ýòîò ìîìåíò ïðèîñòàíàâëèâàåò ïðîãðàììó. Êîìàíäà "g" áåç àðãóìåíòîâ ïðîñòî âîçîáíîâëÿåò âûïîëíåíèå ïðîãðàììû.
 
Ïðèîñòàíîâèòü âûïîëíåíèå ïðîãðàììû ìîæíî êîìàíäîé "stop" (áåç àðãóìåíòîâ).
 
Îáû÷íî òðåáóåòñÿ, ÷òîáû ïðîãðàììà íîðìàëüíî âûïîëíÿëàñü, íî ïðè íàñòóïëåíèè îïðåäåë¸ííûõ óñëîâèé ïðîãðàììà ïðèîñòàíàâàëàñü è óïðàâëåíèå ïîëó÷àë îòëàä÷èê. Ñîîòâåòñòâóþùèå óñëîâèÿ íàçûâàþòñÿ òî÷êàìè îñòàíîâà, breakpoint(s), â ïðîñòîðå÷èè - áðÿêàìè. Ïðîñòåéøèé òèï òî÷åê îñòàíîâà - íà êîíêðåòíûé àäðåñ, ò.å. ïðåðûâàòü âûïîëíåíèå ïðè eip=<çàäàííîå çíà÷åíèå>. Òàêèå òî÷êè îñòàíîâà óñòàíàâëèâàþòñÿ êîìàíäîé:
bp <âûðàæåíèå>
Çàìå÷àíèå. Åñëè åñòü òîëüêî îäíà òàêàÿ òî÷êà îñòàíîâà, óäîáíåå âìåñòî íå¸ èñïîëüçîâàòü êîìàíäó "g" ñ àðãóìåíòîì.
 
Äðóãîé òèï òî÷åê îñòàíîâà - ïî îáðàùåíèþ ê çàäàííîìó ó÷àñòêó ïàìÿòè. Òàêèõ òî÷åê îñòàíîâà ìîæåò áûòü íå áîëüøå ÷åòûð¸õ (ïîñêîëüêó èñïîëüçóþòñÿ
àïïàðàòíûå âîçìîæíîñòè ïðîöåññîðîâ x86, ãäå äîïóñêàþòñÿ òîëüêî 4 òàêèõ òî÷êè).
bpm <âûðàæåíèå> - áðÿêàåòñÿ íà ëþáîé äîñòóï ê áàéòó ïî óêàçàííîìó àäðåñó
bpm w <âûðàæåíèå> - áðÿêàåòñÿ íà çàïèñü áàéòà ïî óêàçàííîìó àäðåñó
bpmb/bpmw/bpmd <âûðàæåíèå> - áðÿêàþòñÿ íà äîñòóï ê ñîîòâåòñòâåííî áàéòó, ñëîâó è äâîéíîìó ñëîâó ïî óêàçàííîìó àäðåñó. bpm è bpmb - ñèíîíèìû. Ïðè èñïîëüçîâàíèè bpmw/bpmd àäðåñ äîëæåí áûòü âûðîâíåí ñîîòâåòñòâåííî íà ãðàíèöó ñëîâà (ò.å. áûòü ÷¸òíûì) èëè íà ãðàíèöó äâîéíîãî ñëîâà (ò.å. äåëèòüñÿ íà 4).
bpmb,bpmw,bpmd w <âûðàæåíèå> - àíàëîãè÷íî äëÿ áðÿêà íà çàïèñü.
 
Ñïèñîê óñòàíîâëåííûõ òî÷åê îñòàíîâà ìîæíî ïðîñìîòðåòü êîìàíäîé "bl", èíôîðìàöèþ î êîíêðåòíîé òî÷êå îñòàíîâà ìîæíî ïîëó÷èòü ñ ïîìîùüþ "bl <íîìåð>". Íåíóæíûå òî÷êè îñòàíîâà óäàëÿþòñÿ êîìàíäîé "bc <íîìåð>", âðåìåííî íåíóæíûå ìîæíî çàïðåòèòü êîìàíäîé "bd <íîìåð>", êîãäà îíè ñòàíóò ñíîâà íóæíû, èñïîëüçóéòå êîìàíäó "be <íîìåð>".
 
Çàìå÷àíèÿ.
 
1. Ïðè îòëàäêå ñîáñòâåííûõ ïðîãðàìì ìîæíî âñòàâëÿòü â êîä èíñòðóêöèè int3 (îáðàòèòå âíèìàíèå íà îòñóòñòâèå ïðîáåëà!). Òàêàÿ èíñòðóêöèÿ âûçûâàåò èñêëþ÷åíèå ïðè íîðìàëüíîì çàïóñêå, ÷òî ïðèâåä¸ò ê çàâåðøåíèþ ïðîöåññà, íî ïðè ðàáîòå ïîä îòëàä÷èêîì ïðîñòî àêòèâèçèðóåòñÿ îòëàä÷èê (ñ ñîîáùåíèåì "int3 command at xxx"). Ýòî ïîçâîëÿåò íå äóìàòü î òîì, êàêèå àäðåñà èñïîëüçîâàòü â êîìàíäàõ g è/èëè bp. Ìîæíî òàêæå ãåíåðèðîâàòü ôàéë ñ èíôîðìàöèåé î ñèìâîëàõ è çàãðóæàòü åãî, òîãäà íå òîëüêî íåò íóæäû ñàìîñòîÿòåëüíî âû÷èñëÿòü àäðåñà äëÿ "g" è "bp", íî è "u","d","?" áóäóò ïîíèìàòü óêàçàíèå èìåíè ìåòêè/ïåðåìåííîé.
2. Âåñü âûâîä è âåñü ââîä îðèåíòèðîâàí íà 16-ðè÷íóþ ñèñòåìó ñ÷èñëåíèÿ.
3. Êîãäà ïðîãðàììà âûïîëíÿåòñÿ, îêíà ðåãèñòðîâ è äàííûõ ïîêàçûâàþò èíôîðìàöèþ, îòíîñÿùóþñÿ ê ìîìåíòó äî âîçîáíîâëåíèÿ; óñòàíîâêà çíà÷åíèé ðåãèñòðîâ â ýòîì ðåæèìå íåâîçìîæíà. Âïðî÷åì, êîìàíäà "d" â ýòîì ðåæèìå ïîêàçûâàåò èíôîðìàöèþ, âåðíóþ â ìîìåíò âûäà÷è êîìàíäû.
/programs/develop/koldbg/sort.inc
0,0 → 1,68
; Sorting bunch of dwords, count = ecx, locating at address = edx,
; comparison function at ebx
; Destroy content of eax, ecx, esi, edi
Sort:
jecxz .Done
mov eax,ecx
@@:
push eax
call .Restore
pop eax
dec eax
jnz @B
@@:
cmp ecx,1
jz .Done
mov esi,1
mov edi,ecx
call .Exchange
dec ecx
mov eax,1
call .Restore
jmp @B
.Done:
ret
 
.Exchange:
push eax ecx
mov eax,[edx+esi*4-4]
mov ecx,[edx+edi*4-4]
mov [edx+esi*4-4],ecx
mov [edx+edi*4-4],eax
pop ecx eax
ret
 
.Restore:
lea esi,[eax+eax]
cmp esi,ecx
ja .DonErr
push esi
mov esi,[edx+esi*4-4]
mov edi,[edx+eax*4-4]
call ebx
pop esi
ja .NeedXchg
cmp esi,ecx
jae .DonErr
push esi
mov esi,[edx+esi*4]
mov edi,[edx+eax*4-4]
call ebx
pop esi
jbe .DonErr
.NeedXchg:
cmp esi,ecx
jz .DoXchg
push esi
mov edi,[edx+esi*4-4]
mov esi,[edx+esi*4]
call ebx
pop esi
sbb esi,-1
.DoXchg:
mov edi,eax
call .Exchange
mov eax,esi
jmp .Restore
.DonErr:
ret
/programs/develop/koldbg/symbols.inc
0,0 → 1,415
 
include 'sort.inc'
 
; compare proc for sorter
Compare:
cmpsd
jnz @F
cmp esi,edi
@@:
ret
 
; compare proc for sorter 2
Compare2:
cmpsd
@@:
cmpsb
jnz @F
cmp byte [esi-1],0
jnz @B
cmp esi,edi
@@:
ret
 
FreeSymbols:
mov ecx,[Symbols]
jecxz @F
mcall 68,13
and [Symbols],0
and [NumSymbols],0
@@:
ret
 
;-----------------------------------------------------------------------------
; Load symbols event
 
OnLoadSymbols.FileErr:
test ebp,ebp
jz @f
mcall 68,13,edi
ret
@@:
push eax
mcall 68,13,edi
mov esi,aCannotLoadFile
call PutMessageNoDraw
pop eax
cmp eax,0x20
jae .Unk
mov esi,[LoadErrMsgs+eax*4]
test esi,esi
jnz PutMessage
.Unk:
mov esi,UnkErrMsg2
jmp PutMessage
 
OnLoadSymbols:
xor ebp,ebp
; load input file
mov esi,[CurArg]
call FreeSymbols
.Silent:
; esi = ptr to symbols filename
xor edi,edi
cmp [NumSymbols],edi ; Any previously loaded symbols?
je .LoadFile
call FreeSymbols ; Yep, free them
.LoadFile:
mov ebx,FN70AttrBlock ; Get file attributes
mov [ebx+21],esi
mcall 70
test eax,eax
jnz .FileErr
cmp dword [FileAttr+36],edi ; Is upper dword of filesize larger then 0?
jnz .MemErr
mov ecx,dword [FileAttr+32] ; Lower dword of filesize
mcall 68,12 ; allocate the memory
test eax,eax
jz .MemErr
mov edi,eax
mov ebx,FN70ReadBlock
mov [ebx+12],ecx
mov [ebx+16],edi
mov [ebx+21],esi
mcall 70 ; Read the file into the allocated buffer
test eax,eax
jnz .FileErr
 
; calculate memory requirements to load debug symbols
 
lea edx,[ecx+edi-1] ; edx = EOF-1
mov esi,edi
xor ecx,ecx
 
mov [SymbolSection],1 ;;;;;
.CalcLoop:
cmp esi,edx
jae .CalcDone
cmp byte [esi],' ' ; skip spaces at the beginning of a line
jne .NotSpace
inc esi
jmp .CalcLoop
.NotSpace:
cmp byte [esi],'.'
jne .NotSection
inc esi
mov [SymbolSection],0
cmp dword [esi],'text'
je .SectionOK
cmp dword [esi],'data'
je .SectionOK
cmp dword [esi],'bss '
jne .SkipLine
.SectionOK:
inc [SymbolSection]
jmp .SkipLine
.NotSection:
cmp [SymbolSection],0
je .SkipLine
 
cmp word [esi],'0x'
jne .SkipLine
inc esi
inc esi
@@:
cmp esi,edx
jae .CalcDone
lodsb
or al,20h
sub al,'0'
cmp al,9
jbe @B
sub al,'a'-'0'-10
cmp al,15
jbe @B
dec esi
@@:
cmp esi,edx
ja .CalcDone
lodsb
cmp al,20h
je @B
jb .CalcLoop
cmp al,9
jz @B
add ecx,12+1
inc [NumSymbols]
@@:
inc ecx
cmp esi,edx
ja .CalcDone
lodsb
cmp al,0xD
jz .CalcLoop
cmp al,0xA
jz .CalcLoop
jmp @B
 
.SkipLine:
cmp esi,edx
jae .CalcDone
lodsb
cmp al,0xD
jz .CalcLoop
cmp al,0xA
jz .CalcLoop
jmp .SkipLine
 
.CalcDone:
 
; Allocate memory to place the debug symbols in
mcall 68,12
test eax,eax
jnz .MemOK
inc ebx
mov ecx,edi
mov al,68
mcall
.MemErr:
mov esi,aNoMemory
jmp PutMessage
.MemOK:
mov [Symbols],eax
mov ebx,eax
push edi
mov esi,edi
mov edi,[NumSymbols]
lea ebp,[eax+edi*4]
lea edi,[eax+edi*8]
 
; Actual loading of the debug symbols
; esi->input, edx->EOF, ebx->ptrs, edi->names
 
mov [SymbolSection],1 ;;;;;
.ReadLoop:
cmp esi,edx
jae .ReadDone
cmp byte [esi],' '
jne .NotSpace2
inc esi
jmp .ReadLoop
.NotSpace2:
cmp byte [esi],'.'
jne .NotSection2
inc esi
mov [SymbolSection],0
cmp dword [esi],'text'
je .SectionOK2
cmp dword [esi],'data'
je .SectionOK2
cmp dword [esi],'bss '
jne .ReadLine
.SectionOK2:
inc [SymbolSection]
jmp .ReadLine
.NotSection2:
cmp [SymbolSection],0
je .ReadLine
 
cmp word [esi],'0x'
jnz .ReadLine
inc esi
inc esi
xor eax,eax
xor ecx,ecx
@@:
shl ecx,4
add ecx,eax
cmp esi,edx
jae .ReadDone
lodsb
or al,20h
sub al,'0'
cmp al,9
jbe @B
sub al,'a'-'0'-10
cmp al,15
jbe @B
dec esi
@@:
cmp esi,edx
ja .ReadDone
lodsb
cmp al,20h
jz @B
jb .ReadLoop
cmp al,9
jz @B
mov dword [ebx],edi
add ebx,4
mov dword [ebp],edi
add ebp,4
mov dword [edi],ecx
add edi,4
stosb
@@:
xor eax,eax
stosb
cmp esi,edx
ja .ReadDone
lodsb
cmp al,0xD
jz .ReadLoop
cmp al,0xA
jz .ReadLoop
mov byte [edi-1],al
jmp @B
 
.ReadLine:
cmp esi,edx
jae .ReadDone
lodsb
cmp al,0xD
jz .ReadLoop
cmp al,0xA
jz .ReadLoop
jmp .ReadLine
 
.ReadDone:
pop ecx
mcall 68,13
mov ecx,[NumSymbols]
mov edx,[Symbols]
mov ebx,Compare
call Sort
mov ecx,[NumSymbols]
lea edx,[edx+ecx*4]
mov ebx,Compare2
call Sort
mov esi,aSymbolsLoaded
call PutMessage
jmp DrawMessages;DrawDisAsm
 
;
; in: EAX = address
; out: ESI, CF
FindSymbol:
cmp [NumSymbols],0
jnz @F
.Ret0:
xor esi,esi
stc
ret
@@:
push ebx ecx edx
xor edx,edx
mov esi,[Symbols]
mov ecx,[NumSymbols]
mov ebx,[esi]
cmp [ebx],eax
jz .DoneZ
jb @F
pop edx ecx ebx
jmp .Ret0
@@:
; invariant: symbols_addr[edx] < eax < symbols_addr[ecx]
; TODO: add meaningful label names
.0:
push edx
.1:
add edx,ecx
sar edx,1
cmp edx,[esp]
jz .Done2
mov ebx,[esi+edx*4]
cmp [ebx],eax
jz .Done
ja .2
mov [esp],edx
jmp .1
.2:
mov ecx,edx
pop edx
jmp .0
 
.DoneCont:
dec edx
.Done:
test edx,edx
jz @F
mov ebx,[esi+edx*4-4]
cmp [ebx],eax
jz .DoneCont
@@:
pop ecx
.DoneZ:
mov esi,[esi+edx*4]
add esi,4
pop edx ecx ebx
clc
ret
.Done2:
lea esi,[esi+edx*4]
pop ecx edx ecx ebx
stc
ret
 
;-----------------------------------------------------------------------------
; in: esi->name
; out: if found: CF = 0, EAX = value
; otherwise CF = 1
FindSymbolName:
cmp [NumSymbols],0
jnz @F
.StcRet:
stc
ret
@@:
push ebx ecx edx edi
push -1
pop edx
mov ebx,[Symbols]
mov ecx,[NumSymbols]
lea ebx,[ebx+ecx*4]
; invariant: symbols_name[edx] < name < symbols_name[ecx]
.0:
push edx
.1:
add edx,ecx
sar edx,1
cmp edx,[esp]
jz .Done2
call .Cmp
jz .Done
jb .2
mov [esp],edx
jmp .1
.2:
mov ecx,edx
pop edx
jmp .0
.Done:
pop ecx
.DoneZ:
mov eax,[ebx+edx*4]
mov eax,[eax]
pop edi edx ecx ebx
clc
ret
 
.Done2:
pop edx edi edx ecx ebx
stc
ret
.Cmp:
mov edi,[ebx+edx*4]
push esi
add edi,4
@@:
cmpsb
jnz @F
cmp byte [esi-1],0
jnz @B
@@:
pop esi
ret
/programs/develop/koldbg/tools.inc
0,0 → 1,22
PGAlloc:
; in: ecx=size
; out: eax=pointer or NULL
push ebx
push 68
pop eax
push 12
pop ebx
int 40h
pop ebx
ret
PGFree:
; in: ecx=pointer
; destroys eax
push ebx
push 68
pop eax
push 13
pop ebx
int 40h
pop ebx
ret