From: nasm-bot f. H. P. A. <hp...@li...> - 2013-11-21 22:21:26
|
Commit-ID: 0bc288f8b9ec5fb30fb816008e81282081d85e82 Gitweb: http://repo.or.cz/w/nasm.git?a=commitdiff;h=0bc288f8b9ec5fb30fb816008e81282081d85e82 Author: H. Peter Anvin <hp...@li...> AuthorDate: Fri, 27 Sep 2013 16:53:51 -0700 Committer: Jin Kyu Song <jin...@in...> CommitDate: Wed, 20 Nov 2013 11:29:41 -0800 disasm: add support for emitting split EA format Add support for emitting split EA format in the disassembler, indicated by the MIB instruction flag. Signed-off-by: H. Peter Anvin <hp...@li...> Signed-off-by: Jin Kyu Song <jin...@in...> --- disasm.c | 17 +++++++++++++++-- insns.h | 1 + 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/disasm.c b/disasm.c index 9a5f9ad..f50ceb9 100644 --- a/disasm.c +++ b/disasm.c @@ -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 += diff --git a/insns.h b/insns.h index b12d4eb..61b04cc 100644 --- a/insns.h +++ b/insns.h @@ -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 */ |