mirror of https://github.com/x64dbg/zydis
Minor bugfixes and improvement of the encoder-table
- Fixed scale-factor of memory operands, if SIB byte is used - Fixed operand-encoding missing for some operands - Added operand-size and address-size filters to the encoder-table
This commit is contained in:
parent
5c07598a2d
commit
8fa80f0b86
|
@ -223,7 +223,7 @@ int main()
|
||||||
// vcmppd xmm1, xmm2, xmm3, 0x17
|
// vcmppd xmm1, xmm2, xmm3, 0x17
|
||||||
0xC5, 0xE9, 0xC2, 0xCB, 0x17,
|
0xC5, 0xE9, 0xC2, 0xCB, 0x17,
|
||||||
|
|
||||||
// vcmpps k2 {k7}, zmm2, zmmword ptr ds:[rax + rbx*4 + 0x100] {1to16}, 0x0F
|
// vcmpps k2 {k7}, zmm2, dword ptr ds:[rax + rbx*4 + 0x100] {1to16}, 0x0F
|
||||||
0x62, 0xF1, 0x6C, 0x5F, 0xC2, 0x54, 0x98, 0x40, 0x0F
|
0x62, 0xF1, 0x6C, 0x5F, 0xC2, 0x54, 0x98, 0x40, 0x0F
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -234,7 +234,6 @@ int main()
|
||||||
puts("");
|
puts("");
|
||||||
disassembleBuffer(&decoder, &data[0], sizeof(data), ZYDIS_TRUE);
|
disassembleBuffer(&decoder, &data[0], sizeof(data), ZYDIS_TRUE);
|
||||||
|
|
||||||
getchar();
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -303,7 +303,7 @@ enum ZydisOperandActions
|
||||||
/**
|
/**
|
||||||
* @brief The operand is written and conditionally read by the instruction (must write).
|
* @brief The operand is written and conditionally read by the instruction (must write).
|
||||||
*/
|
*/
|
||||||
ZYDIS_OPERAND_ACTION_CONDREAD_WRITE,
|
ZYDIS_OPERAND_ACTION_CONDREAD_WRITE
|
||||||
};
|
};
|
||||||
|
|
||||||
/* ---------------------------------------------------------------------------------------------- */
|
/* ---------------------------------------------------------------------------------------------- */
|
||||||
|
|
|
@ -1415,7 +1415,7 @@ static ZydisStatus ZydisDecodeOperandMemory(ZydisDecoderContext* context,
|
||||||
ZydisCalcRegisterId(context, instruction,
|
ZydisCalcRegisterId(context, instruction,
|
||||||
vidxRegisterClass ? ZYDIS_REG_ENCODING_VIDX : ZYDIS_REG_ENCODING_INDEX,
|
vidxRegisterClass ? ZYDIS_REG_ENCODING_VIDX : ZYDIS_REG_ENCODING_INDEX,
|
||||||
vidxRegisterClass ? vidxRegisterClass : ZYDIS_REGCLASS_GPR32));
|
vidxRegisterClass ? vidxRegisterClass : ZYDIS_REGCLASS_GPR32));
|
||||||
operand->mem.scale = (1 << instruction->raw.sib.scale) & ~1;
|
operand->mem.scale = (1 << instruction->raw.sib.scale);
|
||||||
if (operand->mem.index == ZYDIS_REGISTER_ESP)
|
if (operand->mem.index == ZYDIS_REGISTER_ESP)
|
||||||
{
|
{
|
||||||
operand->mem.index = ZYDIS_REGISTER_NONE;
|
operand->mem.index = ZYDIS_REGISTER_NONE;
|
||||||
|
@ -1472,7 +1472,7 @@ static ZydisStatus ZydisDecodeOperandMemory(ZydisDecoderContext* context,
|
||||||
ZydisCalcRegisterId(context, instruction,
|
ZydisCalcRegisterId(context, instruction,
|
||||||
vidxRegisterClass ? ZYDIS_REG_ENCODING_VIDX : ZYDIS_REG_ENCODING_INDEX,
|
vidxRegisterClass ? ZYDIS_REG_ENCODING_VIDX : ZYDIS_REG_ENCODING_INDEX,
|
||||||
vidxRegisterClass ? vidxRegisterClass : ZYDIS_REGCLASS_GPR64));
|
vidxRegisterClass ? vidxRegisterClass : ZYDIS_REGCLASS_GPR64));
|
||||||
operand->mem.scale = (1 << instruction->raw.sib.scale) & ~1;
|
operand->mem.scale = (1 << instruction->raw.sib.scale);;
|
||||||
if (operand->mem.index == ZYDIS_REGISTER_RSP)
|
if (operand->mem.index == ZYDIS_REGISTER_RSP)
|
||||||
{
|
{
|
||||||
operand->mem.index = ZYDIS_REGISTER_NONE;
|
operand->mem.index = ZYDIS_REGISTER_NONE;
|
||||||
|
@ -1731,6 +1731,8 @@ static ZydisStatus ZydisDecodeOperands(ZydisDecoderContext* context,
|
||||||
goto FinalizeOperand;
|
goto FinalizeOperand;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
instruction->operands[i].encoding = operand->op.encoding;
|
||||||
|
|
||||||
// Register operands
|
// Register operands
|
||||||
ZydisRegisterClass registerClass = ZYDIS_REGCLASS_INVALID;
|
ZydisRegisterClass registerClass = ZYDIS_REGCLASS_INVALID;
|
||||||
switch (operand->type)
|
switch (operand->type)
|
||||||
|
@ -1797,7 +1799,6 @@ static ZydisStatus ZydisDecodeOperands(ZydisDecoderContext* context,
|
||||||
}
|
}
|
||||||
if (registerClass)
|
if (registerClass)
|
||||||
{
|
{
|
||||||
instruction->operands[i].encoding = operand->op.encoding;
|
|
||||||
switch (operand->op.encoding)
|
switch (operand->op.encoding)
|
||||||
{
|
{
|
||||||
case ZYDIS_OPERAND_ENCODING_MODRM_REG:
|
case ZYDIS_OPERAND_ENCODING_MODRM_REG:
|
||||||
|
|
|
@ -61,6 +61,8 @@ typedef struct ZydisEncodableInstruction_
|
||||||
uint8_t opcode ZYDIS_BITFIELD( 8);
|
uint8_t opcode ZYDIS_BITFIELD( 8);
|
||||||
ZydisOpcodeMap opcodeMap ZYDIS_BITFIELD( 3);
|
ZydisOpcodeMap opcodeMap ZYDIS_BITFIELD( 3);
|
||||||
uint8_t mode ZYDIS_BITFIELD( 3);
|
uint8_t mode ZYDIS_BITFIELD( 3);
|
||||||
|
uint8_t operandSize ZYDIS_BITFIELD( 3);
|
||||||
|
uint8_t addressSize ZYDIS_BITFIELD( 3);
|
||||||
uint8_t modrmMod ZYDIS_BITFIELD( 4);
|
uint8_t modrmMod ZYDIS_BITFIELD( 4);
|
||||||
ZydisBool forceModrmReg ZYDIS_BITFIELD( 1);
|
ZydisBool forceModrmReg ZYDIS_BITFIELD( 1);
|
||||||
uint8_t modrmReg ZYDIS_BITFIELD( 8);
|
uint8_t modrmReg ZYDIS_BITFIELD( 8);
|
||||||
|
|
File diff suppressed because it is too large
Load Diff
Loading…
Reference in New Issue