i386dasm: show segment register override on string insns (nw)

This commit is contained in:
cracyc 2013-06-14 02:29:41 +00:00
parent 7941a20ddd
commit 3948617c42

View File

@ -41,6 +41,7 @@ enum
PARAM_REL, /* 16 or 32-bit PC-relative displacement */
PARAM_REL8, /* 8-bit PC-relative displacement */
PARAM_MEM_OFFS, /* 16 or 32-bit mem offset */
PARAM_PREIMP, /* prefix with implicit register */
PARAM_SREG, /* segment register */
PARAM_CREG, /* control register */
PARAM_DREG, /* debug register */
@ -229,10 +230,10 @@ static const I386_OPCODE i386_opcode_table1[256] =
{"imul", MODRM, PARAM_REG, PARAM_RM, PARAM_IMM },
{"push", 0, PARAM_I8, 0, 0 },
{"imul", MODRM, PARAM_REG, PARAM_RM, PARAM_I8 },
{"insb", 0, 0, 0, 0 },
{"insw\0insd\0insd",VAR_NAME, 0, 0, 0 },
{"outsb", 0, 0, 0, 0 },
{"outsw\0outsd\0outsd",VAR_NAME, 0, 0, 0 },
{"insb", 0, PARAM_PREIMP, 0, 0 },
{"insw\0insd\0insd",VAR_NAME, PARAM_PREIMP, 0, 0 },
{"outsb", 0, PARAM_PREIMP, 0, 0 },
{"outsw\0outsd\0outsd",VAR_NAME, PARAM_PREIMP, 0, 0 },
// 0x70
{"jo", 0, PARAM_REL8, 0, 0 },
{"jno", 0, PARAM_REL8, 0, 0 },
@ -289,18 +290,18 @@ static const I386_OPCODE i386_opcode_table1[256] =
{"mov", 0, PARAM_EAX, PARAM_MEM_OFFS, 0 },
{"mov", 0, PARAM_MEM_OFFS, PARAM_AL, 0 },
{"mov", 0, PARAM_MEM_OFFS, PARAM_EAX, 0 },
{"movsb", 0, 0, 0, 0 },
{"movsw\0movsd\0movsq",VAR_NAME, 0, 0, 0 },
{"cmpsb", 0, 0, 0, 0 },
{"cmpsw\0cmpsd\0cmpsq",VAR_NAME, 0, 0, 0 },
{"movsb", 0, PARAM_PREIMP, 0, 0 },
{"movsw\0movsd\0movsq",VAR_NAME, PARAM_PREIMP, 0, 0 },
{"cmpsb", 0, PARAM_PREIMP, 0, 0 },
{"cmpsw\0cmpsd\0cmpsq",VAR_NAME, PARAM_PREIMP, 0, 0 },
{"test", 0, PARAM_AL, PARAM_UI8, 0 },
{"test", 0, PARAM_EAX, PARAM_IMM, 0 },
{"stosb", 0, 0, 0, 0 },
{"stosw\0stosd\0stosq",VAR_NAME, 0, 0, 0 },
{"lodsb", 0, 0, 0, 0 },
{"lodsw\0lodsd\0lodsq",VAR_NAME, 0, 0, 0 },
{"scasb", 0, 0, 0, 0 },
{"scasw\0scasd\0scasq",VAR_NAME, 0, 0, 0 },
{"stosb", 0, PARAM_PREIMP, 0, 0 },
{"stosw\0stosd\0stosq",VAR_NAME, PARAM_PREIMP, 0, 0 },
{"lodsb", 0, PARAM_PREIMP, 0, 0 },
{"lodsw\0lodsd\0lodsq",VAR_NAME, PARAM_PREIMP, 0, 0 },
{"scasb", 0, PARAM_PREIMP, 0, 0 },
{"scasw\0scasd\0scasq",VAR_NAME, PARAM_PREIMP, 0, 0 },
// 0xb0
{"mov", 0, PARAM_AL, PARAM_UI8, 0 },
{"mov", 0, PARAM_CL, PARAM_UI8, 0 },
@ -2419,6 +2420,18 @@ static char* handle_param(char* s, UINT32 param)
}
break;
case PARAM_PREIMP:
switch(segment)
{
case SEG_CS: s += sprintf( s, "cs:" ); break;
case SEG_DS: s += sprintf( s, "ds:" ); break;
case SEG_ES: s += sprintf( s, "es:" ); break;
case SEG_FS: s += sprintf( s, "fs:" ); break;
case SEG_GS: s += sprintf( s, "gs:" ); break;
case SEG_SS: s += sprintf( s, "ss:" ); break;
}
break;
case PARAM_SREG:
s += sprintf( s, "%s", i386_sreg[MODRM_REG1] );
break;