diff --git a/3rd_party/libdisasm/libdis.h b/3rd_party/libdisasm/libdis.h index 6d3fc98..2d5ad3f 100644 --- a/3rd_party/libdisasm/libdis.h +++ b/3rd_party/libdisasm/libdis.h @@ -317,7 +317,10 @@ struct x86_op_t{ case op_offset: return data.offset; case op_relative_far: - return (int32_t) data.relative_far; + if (data.relative_far & 0x8000) + return (data.relative_far & 0xFFFF) | 0xFFFF0000; + else + return (int32_t)data.relative_far; default: assert(false); break; diff --git a/src/scanner.cpp b/src/scanner.cpp index 0b30c97..4ce2750 100644 --- a/src/scanner.cpp +++ b/src/scanner.cpp @@ -330,7 +330,7 @@ static void decodeBranchTgt(x86_insn_t &insn) int32_t addr = tgt_op->getAddress(); if(tgt_op->is_relative()) { - addr += insn.addr+insn.size; + addr = (uint16_t)(addr + insn.addr + insn.size); } pIcode->ll()->replaceSrc((uint32_t)addr); pIcode->ll()->setFlags(I);