winedbg: Use better register names for ARM disassembling.

This commit is contained in:
André Hentschel 2012-04-15 13:14:47 +02:00 committed by Alexandre Julliard
parent abc304f309
commit 51df30b25c
1 changed files with 38 additions and 34 deletions

View File

@ -44,6 +44,11 @@ static BOOL db_display = FALSE;
#define get_cond(ins) tbl_cond[(ins >> 28) & 0x0f] #define get_cond(ins) tbl_cond[(ins >> 28) & 0x0f]
#define get_nibble(ins, num) ((ins >> (num * 4)) & 0x0f) #define get_nibble(ins, num) ((ins >> (num * 4)) & 0x0f)
static char const tbl_regs[][4] = {
"r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10",
"fp", "ip", "sp", "lr", "pc", "cpsr"
};
static char const tbl_addrmode[][3] = { static char const tbl_addrmode[][3] = {
"da", "ia", "db", "ib" "da", "ia", "db", "ib"
}; };
@ -93,7 +98,7 @@ static UINT arm_disasm_branch(UINT inst)
if (offset & 0x02000000) offset |= 0xfc000000; if (offset & 0x02000000) offset |= 0xfc000000;
offset += 8; offset += 8;
dbg_printf("\n\tb%s%s\t#%d/0x%08x", link ? "l" : "", get_cond(inst), offset, offset); dbg_printf("\n\tb%s%s\t#%d", link ? "l" : "", get_cond(inst), offset);
return 0; return 0;
} }
@ -113,22 +118,21 @@ static UINT arm_disasm_dataprocessing(UINT inst)
} }
dbg_printf("\n\t%s%s%s", tbl_dataops[opcode], condcodes ? "s" : "", get_cond(inst)); dbg_printf("\n\t%s%s%s", tbl_dataops[opcode], condcodes ? "s" : "", get_cond(inst));
dbg_printf("\t%s, ", tbl_regs[get_nibble(inst, 3)]);
if (no_op1) if (no_op1)
{ {
if (immediate) if (immediate)
dbg_printf("\tr%u, #%u", get_nibble(inst, 3), dbg_printf("#%u", ROR32(inst & 0xff, 2 * get_nibble(inst, 2)));
ROR32(inst & 0xff, 2 * get_nibble(inst, 2)));
else else
dbg_printf("\tr%u, r%u", get_nibble(inst, 3), get_nibble(inst, 0)); dbg_printf("%s", tbl_regs[get_nibble(inst, 0)]);
} }
else else
{ {
if (immediate) if (immediate)
dbg_printf("\tr%u, r%u, #%u", get_nibble(inst, 3), get_nibble(inst, 4), dbg_printf("%s, #%u", tbl_regs[get_nibble(inst, 4)],
ROR32(inst & 0xff, 2 * get_nibble(inst, 2))); ROR32(inst & 0xff, 2 * get_nibble(inst, 2)));
else else
dbg_printf("\tr%u, r%u, r%u", get_nibble(inst, 3), get_nibble(inst, 4), dbg_printf("%s, %s", tbl_regs[get_nibble(inst, 4)], tbl_regs[get_nibble(inst, 0)]);
get_nibble(inst, 0));
} }
return 0; return 0;
} }
@ -147,20 +151,20 @@ static UINT arm_disasm_singletrans(UINT inst)
dbg_printf("\n\t%s%s%s%s", load ? "ldr" : "str", byte ? "b" : "", writeback ? "t" : "", dbg_printf("\n\t%s%s%s%s", load ? "ldr" : "str", byte ? "b" : "", writeback ? "t" : "",
get_cond(inst)); get_cond(inst));
dbg_printf("\tr%u, ", get_nibble(inst, 3)); dbg_printf("\t%s, ", tbl_regs[get_nibble(inst, 3)]);
if (indexing) if (indexing)
{ {
if (immediate) if (immediate)
dbg_printf("[r%u, #%d]", get_nibble(inst, 4), offset); dbg_printf("[%s, #%d]", tbl_regs[get_nibble(inst, 4)], offset);
else else
dbg_printf("[r%u, r%u]", get_nibble(inst, 4), get_nibble(inst, 0)); dbg_printf("[%s, %s]", tbl_regs[get_nibble(inst, 4)], tbl_regs[get_nibble(inst, 0)]);
} }
else else
{ {
if (immediate) if (immediate)
dbg_printf("[r%u], #%d", get_nibble(inst, 4), offset); dbg_printf("[%s], #%d", tbl_regs[get_nibble(inst, 4)], offset);
else else
dbg_printf("[r%u], r%u", get_nibble(inst, 4), get_nibble(inst, 0)); dbg_printf("[%s], %s", tbl_regs[get_nibble(inst, 4)], tbl_regs[get_nibble(inst, 0)]);
} }
return 0; return 0;
} }
@ -180,20 +184,20 @@ static UINT arm_disasm_halfwordtrans(UINT inst)
dbg_printf("\n\t%s%s%s%s%s", load ? "ldr" : "str", sign ? "s" : "", dbg_printf("\n\t%s%s%s%s%s", load ? "ldr" : "str", sign ? "s" : "",
halfword ? "h" : (sign ? "b" : ""), writeback ? "t" : "", get_cond(inst)); halfword ? "h" : (sign ? "b" : ""), writeback ? "t" : "", get_cond(inst));
dbg_printf("\tr%u, ", get_nibble(inst, 3)); dbg_printf("\t%s, ", tbl_regs[get_nibble(inst, 3)]);
if (indexing) if (indexing)
{ {
if (immediate) if (immediate)
dbg_printf("[r%u, #%d]", get_nibble(inst, 4), offset); dbg_printf("[%s, #%d]", tbl_regs[get_nibble(inst, 4)], offset);
else else
dbg_printf("[r%u, r%u]", get_nibble(inst, 4), get_nibble(inst, 0)); dbg_printf("[%s, %s]", tbl_regs[get_nibble(inst, 4)], tbl_regs[get_nibble(inst, 0)]);
} }
else else
{ {
if (immediate) if (immediate)
dbg_printf("[r%u], #%d", get_nibble(inst, 4), offset); dbg_printf("[%s], #%d", tbl_regs[get_nibble(inst, 4)], offset);
else else
dbg_printf("[r%u], r%u", get_nibble(inst, 4), get_nibble(inst, 0)); dbg_printf("[%s], %s", tbl_regs[get_nibble(inst, 4)], tbl_regs[get_nibble(inst, 0)]);
} }
return 0; return 0;
} }
@ -213,13 +217,13 @@ static UINT arm_disasm_blocktrans(UINT inst)
break; break;
} }
dbg_printf("\n\t%s%s%s\tr%u%s, {", load ? "ldm" : "stm", tbl_addrmode[addrmode], get_cond(inst), dbg_printf("\n\t%s%s%s\t%s%s, {", load ? "ldm" : "stm", tbl_addrmode[addrmode], get_cond(inst),
get_nibble(inst, 4), writeback ? "!" : ""); tbl_regs[get_nibble(inst, 4)], writeback ? "!" : "");
for (i=0;i<=15;i++) for (i=0;i<=15;i++)
if ((inst>>i) & 1) if ((inst>>i) & 1)
{ {
if (i == last) dbg_printf("r%u", i); if (i == last) dbg_printf("%s", tbl_regs[i]);
else dbg_printf("r%u, ", i); else dbg_printf("%s, ", tbl_regs[i]);
} }
dbg_printf("}%s", psr ? "^" : ""); dbg_printf("}%s", psr ? "^" : "");
return 0; return 0;
@ -241,8 +245,8 @@ static UINT arm_disasm_coproctrans(UINT inst)
WORD load = (inst >> 20) & 0x01; WORD load = (inst >> 20) & 0x01;
WORD CP_Opc = (inst >> 21) & 0x07; WORD CP_Opc = (inst >> 21) & 0x07;
dbg_printf("\n\t%s%s\t%u, %u, r%u, cr%u, cr%u, {%u}", load ? "mrc" : "mcr", get_cond(inst), CPnum, dbg_printf("\n\t%s%s\t%u, %u, %s, cr%u, cr%u, {%u}", load ? "mrc" : "mcr", get_cond(inst), CPnum,
CP, get_nibble(inst, 3), CRn, CRm, CP_Opc); CP, tbl_regs[get_nibble(inst, 3)], CRn, CRm, CP_Opc);
return 0; return 0;
} }
@ -275,9 +279,9 @@ static UINT arm_disasm_coprocdatatrans(UINT inst)
dbg_printf("\n\t%s%s%s", load ? "ldc" : "stc", translen ? "l" : "", get_cond(inst)); dbg_printf("\n\t%s%s%s", load ? "ldc" : "stc", translen ? "l" : "", get_cond(inst));
if (indexing) if (indexing)
dbg_printf("\t%u, cr%u, [r%u, #%d]%s", CPnum, CRd, get_nibble(inst, 4), offset, writeback?"!":""); dbg_printf("\t%u, cr%u, [%s, #%d]%s", CPnum, CRd, tbl_regs[get_nibble(inst, 4)], offset, writeback?"!":"");
else else
dbg_printf("\t%u, cr%u, [r%u], #%d", CPnum, CRd, get_nibble(inst, 4), offset); dbg_printf("\t%u, cr%u, [%s], #%d", CPnum, CRd, tbl_regs[get_nibble(inst, 4)], offset);
return 0; return 0;
} }
@ -293,9 +297,9 @@ static WORD thumb_disasm_hireg(WORD inst, ADDRESS64 *addr)
if (h2) src += 8; if (h2) src += 8;
if (op == 3) if (op == 3)
dbg_printf("\n\tb%sx\tr%u", h1?"l":"", src); dbg_printf("\n\tb%sx\t%s", h1?"l":"", tbl_regs[src]);
else else
dbg_printf("\n\t%s\tr%u, r%u", tbl_hiops_t[op], dst, src); dbg_printf("\n\t%s\t%s, %s", tbl_hiops_t[op], tbl_regs[dst], tbl_regs[src]);
return 0; return 0;
} }
@ -316,8 +320,8 @@ static WORD thumb_disasm_blocktrans(WORD inst, ADDRESS64 *addr)
for (i=0;i<=7;i++) for (i=0;i<=7;i++)
if ((inst>>i) & 1) if ((inst>>i) & 1)
{ {
if (i == last) dbg_printf("r%u", i); if (i == last) dbg_printf("%s", tbl_regs[i]);
else dbg_printf("r%u, ", i); else dbg_printf("%s, ", tbl_regs[i]);
} }
if (lrpc) if (lrpc)
dbg_printf(", %s", load ? "pc" : "lr"); dbg_printf(", %s", load ? "pc" : "lr");
@ -356,29 +360,29 @@ static WORD thumb_disasm_nop(WORD inst, ADDRESS64 *addr)
static WORD thumb_disasm_ldrpcrel(WORD inst, ADDRESS64 *addr) static WORD thumb_disasm_ldrpcrel(WORD inst, ADDRESS64 *addr)
{ {
WORD offset = (inst & 0xff) << 2; WORD offset = (inst & 0xff) << 2;
dbg_printf("\n\tldr\tr%u, [pc, #%u]", (inst >> 8) & 0x07, offset); dbg_printf("\n\tldr\t%s, [pc, #%u]", tbl_regs[(inst >> 8) & 0x07], offset);
return 0; return 0;
} }
static WORD thumb_disasm_ldrsprel(WORD inst, ADDRESS64 *addr) static WORD thumb_disasm_ldrsprel(WORD inst, ADDRESS64 *addr)
{ {
WORD offset = (inst & 0xff) << 2; WORD offset = (inst & 0xff) << 2;
dbg_printf("\n\t%s\tr%u, [sp, #%u]", (inst & 0x0800)?"ldr":"str", (inst >> 8) & 0x07, offset); dbg_printf("\n\t%s\t%s, [sp, #%u]", (inst & 0x0800)?"ldr":"str", tbl_regs[(inst >> 8) & 0x07], offset);
return 0; return 0;
} }
static WORD thumb_disasm_ldrimm(WORD inst, ADDRESS64 *addr) static WORD thumb_disasm_ldrimm(WORD inst, ADDRESS64 *addr)
{ {
WORD offset = (inst & 0x07c0) >> 6; WORD offset = (inst & 0x07c0) >> 6;
dbg_printf("\n\t%s%s\tr%u, [r%u, #%u]", (inst & 0x0800)?"ldr":"str", (inst & 0x1000)?"b":"", dbg_printf("\n\t%s%s\t%s, [%s, #%u]", (inst & 0x0800)?"ldr":"str", (inst & 0x1000)?"b":"",
inst & 0x07, (inst >> 3) & 0x07, (inst & 0x1000)?offset:(offset << 2)); tbl_regs[inst & 0x07], tbl_regs[(inst >> 3) & 0x07], (inst & 0x1000)?offset:(offset << 2));
return 0; return 0;
} }
static WORD thumb_disasm_immop(WORD inst, ADDRESS64 *addr) static WORD thumb_disasm_immop(WORD inst, ADDRESS64 *addr)
{ {
WORD op = (inst >> 11) & 0x03; WORD op = (inst >> 11) & 0x03;
dbg_printf("\n\t%s\tr%u, #%u", tbl_immops_t[op], (inst >> 8) & 0x07, inst & 0xff); dbg_printf("\n\t%s\t%s, #%u", tbl_immops_t[op], tbl_regs[(inst >> 8) & 0x07], inst & 0xff);
return 0; return 0;
} }