kolibrios-fun/programs/develop/koldbg/disasm/far-code.inc

694 lines
16 KiB
PHP
Raw Normal View History

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