From 392c36c85f53f3e6ba5820f32aad7f5ede816f91 Mon Sep 17 00:00:00 2001 From: flobernd Date: Thu, 29 Jun 2017 21:12:22 +0200 Subject: [PATCH] Fixed decoding of MASK register (again) --- src/Decoder.c | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/src/Decoder.c b/src/Decoder.c index 0d4a710..c52f459 100644 --- a/src/Decoder.c +++ b/src/Decoder.c @@ -906,6 +906,10 @@ static uint8_t ZydisCalcRegisterId(ZydisDecoderContext* context, ZydisInstructio { ZYDIS_ASSERT(info->details.modrm.isDecoded); uint8_t value = info->details.modrm.reg; + if (registerClass != ZYDIS_REGCLASS_MASK) + { + value |= (context->cache.R << 3); + } // R' only exists for EVEX and MVEX. No encoding check needed switch (registerClass) { @@ -914,10 +918,7 @@ static uint8_t ZydisCalcRegisterId(ZydisDecoderContext* context, ZydisInstructio case ZYDIS_REGCLASS_ZMM: value |= (context->cache.R2 << 4); break; - case ZYDIS_REGCLASS_MASK: - break; default: - value |= (context->cache.R << 3); break; } return value; @@ -939,6 +940,10 @@ static uint8_t ZydisCalcRegisterId(ZydisDecoderContext* context, ZydisInstructio { ZYDIS_ASSERT(info->details.modrm.isDecoded); uint8_t value = info->details.modrm.rm; + if (registerClass != ZYDIS_REGCLASS_MASK) + { + value |= (context->cache.B << 3); + } // We have to check the instruction-encoding, because the extension by X is only valid // for EVEX and MVEX instructions if ((info->encoding == ZYDIS_INSTRUCTION_ENCODING_EVEX) || @@ -951,10 +956,7 @@ static uint8_t ZydisCalcRegisterId(ZydisDecoderContext* context, ZydisInstructio case ZYDIS_REGCLASS_ZMM: value |= (context->cache.X << 4); break; - case ZYDIS_REGCLASS_MASK: - break; default: - value |= (context->cache.B << 3); break; } }