|
|
| version 1.11, 2011/01/15 17:33:32 | version 1.12, 2012/01/08 11:32:16 |
|---|---|
| Line 652 get_opcode(disasm_context_t *ctx) | Line 652 get_opcode(disasm_context_t *ctx) |
| return rv; | return rv; |
| op[0] = (UINT8)(ctx->val & 0xff); | op[0] = (UINT8)(ctx->val & 0xff); |
| if (insttable_info[op[0]] & INST_PREFIX) { | if (!(insttable_info[op[0]] & INST_PREFIX)) |
| if (ctx->prefix == 0) | break; |
| ctx->prefix = ctx->next; | |
| if (ctx->prefix == 0) | |
| switch (op[0]) { | ctx->prefix = ctx->next; |
| case 0x26: /* ES: */ | |
| case 0x2e: /* CS: */ | switch (op[0]) { |
| case 0x36: /* SS: */ | case 0x26: /* ES: */ |
| case 0x3e: /* DS: */ | case 0x2e: /* CS: */ |
| ctx->useseg = TRUE; | case 0x36: /* SS: */ |
| ctx->seg = (op[0] >> 3) & 3; | case 0x3e: /* DS: */ |
| break; | ctx->useseg = TRUE; |
| ctx->seg = (op[0] >> 3) & 3; | |
| case 0x64: /* FS: */ | break; |
| case 0x65: /* GS: */ | |
| ctx->useseg = TRUE; | case 0x64: /* FS: */ |
| ctx->seg = (op[0] - 0x64) + 4; | case 0x65: /* GS: */ |
| break; | ctx->useseg = TRUE; |
| ctx->seg = (op[0] - 0x64) + 4; | |
| case 0x66: /* OPSize: */ | break; |
| ctx->op32 = !CPU_INST_OP32; | |
| break; | case 0x66: /* OPSize: */ |
| ctx->op32 = !CPU_STATSAVE.cpu_inst_default.op_32; | |
| case 0x67: /* AddrSize: */ | break; |
| ctx->as32 = !CPU_INST_AS32; | |
| break; | case 0x67: /* AddrSize: */ |
| } | ctx->as32 = !CPU_STATSAVE.cpu_inst_default.as_32; |
| continue; | break; |
| } | } |
| break; | |
| } | } |
| if (prefix == MAX_PREFIX) | if (prefix == MAX_PREFIX) |
| return 1; | return 1; |
| Line 793 disasm(UINT32 *eip, disasm_context_t *ct | Line 792 disasm(UINT32 *eip, disasm_context_t *ct |
| ctx->arg[2] = 0; | ctx->arg[2] = 0; |
| ctx->eip = *eip; | ctx->eip = *eip; |
| ctx->op32 = CPU_INST_OP32; | ctx->op32 = CPU_STATSAVE.cpu_inst_default.op_32; |
| ctx->as32 = CPU_INST_AS32; | ctx->as32 = CPU_STATSAVE.cpu_inst_default.as_32; |
| ctx->seg = -1; | ctx->seg = -1; |
| ctx->baseaddr = ctx->eip; | ctx->baseaddr = ctx->eip; |
| Line 809 disasm(UINT32 *eip, disasm_context_t *ct | Line 808 disasm(UINT32 *eip, disasm_context_t *ct |
| return 0; | return 0; |
| } | } |
| char * | |
| cpu_disasm2str(UINT32 eip) | |
| { | |
| static char output[2048]; | |
| disasm_context_t d; | |
| UINT32 eip2 = eip; | |
| int rv; | |
| output[0] = '\0'; | |
| rv = disasm(&eip2, &d); | |
| if (rv == 0) { | |
| char buf[256]; | |
| char tmp[32]; | |
| int len = d.nopbytes > 8 ? 8 : d.nopbytes; | |
| int i; | |
| buf[0] = '\0'; | |
| for (i = 0; i < len; i++) { | |
| snprintf(tmp, sizeof(tmp), "%02x ", d.opbyte[i]); | |
| milstr_ncat(buf, tmp, sizeof(buf)); | |
| } | |
| for (; i < 8; i++) { | |
| milstr_ncat(buf, " ", sizeof(buf)); | |
| } | |
| snprintf(output, sizeof(output), "%04x:%08x: %s%s", | |
| CPU_CS, eip, buf, d.str); | |
| if (i < d.nopbytes) { | |
| char t[256]; | |
| buf[0] = '\0'; | |
| for (; i < d.nopbytes; i++) { | |
| snprintf(tmp, sizeof(tmp), "%02x ", | |
| d.opbyte[i]); | |
| milstr_ncat(buf, tmp, sizeof(buf)); | |
| if ((i % 8) == 7) { | |
| snprintf(t, sizeof(t), | |
| "\n : %s", buf); | |
| milstr_ncat(output, t, sizeof(output)); | |
| buf[0] = '\0'; | |
| } | |
| } | |
| if ((i % 8) != 0) { | |
| snprintf(t, sizeof(t), | |
| "\n : %s", buf); | |
| milstr_ncat(output, t, sizeof(output)); | |
| } | |
| } | |
| } | |
| return output; | |
| } |