diff options
-rw-r--r-- | disasm.c | 17 | ||||
-rw-r--r-- | insns.h | 1 |
2 files changed, 16 insertions, 2 deletions
@@ -955,7 +955,7 @@ int32_t disasm(uint8_t *data, char *output, int outbufsize, int segsize, uint8_t *origdata; int works; insn tmp_ins, ins; - iflags_t goodness, best; + iflags_t goodness, best, flags; int best_pref; struct prefix_info prefix; bool end_prefix; @@ -1174,6 +1174,7 @@ int32_t disasm(uint8_t *data, char *output, int outbufsize, int segsize, /* Pick the best match */ p = best_p; length = best_length; + flags = (*p)->flags; slen = 0; @@ -1331,7 +1332,7 @@ int32_t disasm(uint8_t *data, char *output, int outbufsize, int segsize, nasm_reg_names[(o->basereg-EXPR_REG_START)]); started = true; } - if (o->indexreg != -1) { + if (o->indexreg != -1 && !(flags & IF_MIB)) { if (started) output[slen++] = '+'; slen += snprintf(output + slen, outbufsize - slen, "%s", @@ -1395,6 +1396,18 @@ int32_t disasm(uint8_t *data, char *output, int outbufsize, int segsize, "%s0x%"PRIx32"", prefix, offset); } } + + if (o->indexreg != -1 && (flags & IF_MIB)) { + output[slen++] = ','; + slen += snprintf(output + slen, outbufsize - slen, "%s", + nasm_reg_names[(o->indexreg-EXPR_REG_START)]); + if (o->scale > 1) + slen += + snprintf(output + slen, outbufsize - slen, "*%d", + o->scale); + started = true; + } + output[slen++] = ']'; } else { slen += @@ -104,6 +104,7 @@ extern const uint8_t nasm_bytecodes[]; #define IF_NOLONG 0x00000800UL /* it's not available in long mode */ #define IF_LONG 0x00001000UL /* long mode instruction */ #define IF_NOHLE 0x00002000UL /* HLE prefixes forbidden */ +#define IF_MIB 0x00004000UL /* Disassemble with split EA */ /* These flags are currently not used for anything - intended for insn set */ #define IF_UNDOC 0x8000000000UL /* it's an undocumented instruction */ #define IF_HLE 0x4000000000UL /* HACK NEED TO REORGANIZE THESE BITS */ |