Disassembler now looks up symbols for address operands.

This commit is contained in:
Daniel Beer 2010-01-06 13:24:59 +13:00
parent 597de3180f
commit d3606d810d
2 changed files with 24 additions and 9 deletions

29
dis.c
View File

@ -21,6 +21,7 @@
#include <stdio.h>
#include "dis.h"
#include "stab.h"
/**********************************************************************/
/* Disassembler
@ -516,6 +517,20 @@ static const char *const msp430_reg_names[] = {
"R12", "R13", "R14", "R15"
};
static int format_addr(char *buf, int max_len, const char *prefix,
u_int16_t addr)
{
const char *name;
if (stab_find(&addr, &name) < 0)
return snprintf(buf, max_len, "%s0x%04x", prefix, addr);
if (addr)
return snprintf(buf, max_len, "%s%s+0x%x", prefix, name, addr);
return snprintf(buf, max_len, "%s%s", prefix, name);
}
/* Given an operands addressing mode, value and associated register,
* print the canonical representation of it to stdout.
*
@ -532,23 +547,23 @@ static int format_operand(char *buf, int max_len,
return snprintf(buf, max_len, "%s", msp430_reg_names[reg]);
case MSP430_AMODE_INDEXED:
return snprintf(buf, max_len, "%d(%s)", (int16_t)addr,
return snprintf(buf, max_len, "0x%x(%s)", (u_int16_t)addr,
msp430_reg_names[reg]);
case MSP430_AMODE_SYMBOLIC:
return snprintf(buf, max_len, "0x%04x", addr);
return format_addr(buf, max_len, "", addr);
case MSP430_AMODE_ABSOLUTE:
return snprintf(buf, max_len, "&0x%04x", addr);
return format_addr(buf, max_len, "&", addr);
case MSP430_AMODE_INDIRECT:
return snprintf(buf, max_len, "@%s", msp430_reg_names[reg]);
return format_addr(buf, max_len, "@", addr);
case MSP430_AMODE_INDIRECT_INC:
return snprintf(buf, max_len, "@%s+", msp430_reg_names[reg]);
case MSP430_AMODE_IMMEDIATE:
return snprintf(buf, max_len, "#%d", (int16_t)addr);
return snprintf(buf, max_len, "#0x%x", (u_int16_t)addr);
}
return snprintf(buf, max_len, "???");
@ -586,8 +601,8 @@ int dis_format(char *buf, int max_len,
if ((insn->op == MSP430_OP_CALL ||
insn->op == MSP430_OP_BR) &&
insn->dst_mode == MSP430_AMODE_IMMEDIATE)
count += snprintf(buf + count, max_len - count,
"#0x%04x", insn->dst_addr);
count += format_addr(buf + count, max_len - count,
"#", insn->dst_addr);
else
count += format_operand(buf + count,
max_len - count,

4
main.c
View File

@ -194,7 +194,7 @@ static void disassemble(u_int16_t offset, u_int8_t *data, int length)
for (i = 0; i < count; i++)
printf(" %02x", data[i]);
while (i < 8) {
while (i < 7) {
printf(" ");
i++;
}
@ -220,7 +220,7 @@ static int cmd_dis(char **arg)
char *len_text = get_arg(arg);
int offset = 0;
int length = 0x40;
u_int8_t buf[128];
u_int8_t buf[512];
if (!off_text) {
fprintf(stderr, "md: offset must be specified\n");