Fix some printing issues

This commit is contained in:
2023-06-01 18:50:33 +09:00
parent 60b93f8024
commit 60204a51a3
2 changed files with 57 additions and 48 deletions
+14 -5
View File
@@ -73,10 +73,17 @@ bool has_reg(instruction_t inst)
void print_instruction(unsigned addr, instruction_t inst, unsigned inst_size, u_int8_t *binary)
{
bool need_comma = strchr(inst.name, ' ');
char *last_param = strchr(inst.name, '%');
// if the instruction has already a param in it (ex `in al`), we need to directly add a comma.
// `jmp short` is an exception as it is the only instruction with a space in it that is not a parameter.
bool need_comma = !last_param && strchr(inst.name, ' ') && inst.opcode != 0xEB;
int imm_idx = 1 + (inst.extended != -1 || has_reg(inst));
printf("%04x: %0*x%-*s %s", addr, inst_size * 2, read_size(binary, inst_size), 13 - inst_size * 2, "", inst.name);
printf("%04x: %0*x%-*s", addr, inst_size * 2, read_size(binary, inst_size), 14 - inst_size * 2, "");
if (last_param)
printf("%.*s", (int)(last_param - inst.name - 1), inst.name);
else
printf("%s", inst.name);
for (int i = 0; inst.mode[i] != END; i++) {
if (need_comma)
@@ -115,6 +122,8 @@ void print_instruction(unsigned addr, instruction_t inst, unsigned inst_size, u_
break;
}
}
if (last_param)
printf("%s", last_param + 2);
printf("\n");
}
@@ -178,7 +187,7 @@ unsigned get_inst_size(instruction_t inst, u_int8_t *binary, unsigned bin_size)
int dasm(u_int8_t *binary, unsigned long size)
{
unsigned long pc = 0;
unsigned pc = 0;
int header_size = 0;
if (binary[0] == 0xEB && binary[1] == 0x0E) {
@@ -195,8 +204,8 @@ int dasm(u_int8_t *binary, unsigned long size)
instruction_t inst = parse_inst(binary, size - pc);
unsigned inst_size = get_inst_size(inst, binary, size - pc);
if (pc + inst_size > size) {
printf("Invalid file. Missing operand for instruction: '%s'. (pc: %lx)\n", inst.name, pc);
return 1;
printf("%04x: %02x (undefined)\n", pc, inst.opcode);
return 0;
}
print_instruction(pc, inst, inst_size, binary);
pc += inst_size;
+43 -43
View File
@@ -100,12 +100,12 @@ const instruction_t instructions[] = {
{.opcode = 0x5F, .extended = -1, .name = "pop di", .mode = {END}},
{.opcode = 0x70, .extended = -1, .name = "jo", .mode = {REL8, END}},
{.opcode = 0x71, .extended = -1, .name = "jno", .mode = {REL8, END}},
{.opcode = 0x72, .extended = -1, .name = "jc", .mode = {REL8, END}},
{.opcode = 0x72, .extended = -1, .name = "jb", .mode = {REL8, END}},
{.opcode = 0x73, .extended = -1, .name = "jnb", .mode = {REL8, END}},
{.opcode = 0x74, .extended = -1, .name = "je", .mode = {REL8, END}},
{.opcode = 0x75, .extended = -1, .name = "jne", .mode = {REL8, END}},
{.opcode = 0x76, .extended = -1, .name = "jna", .mode = {REL8, END}},
{.opcode = 0x77, .extended = -1, .name = "ja", .mode = {REL8, END}},
{.opcode = 0x76, .extended = -1, .name = "jbe", .mode = {REL8, END}},
{.opcode = 0x77, .extended = -1, .name = "jnbe", .mode = {REL8, END}},
{.opcode = 0x78, .extended = -1, .name = "js", .mode = {REL8, END}},
{.opcode = 0x79, .extended = -1, .name = "jns", .mode = {REL8, END}},
{.opcode = 0x7A, .extended = -1, .name = "jpe", .mode = {REL8, END}},
@@ -130,14 +130,14 @@ const instruction_t instructions[] = {
{.opcode = 0x8D, .extended = -1, .name = "lea", .mode = {REG16, R_M16, END}},
// {.opcode = 0x8E, .extended = -1, .name = "mov", .mode = {sreg, R_M16, END}},
{.opcode = 0x8F, .extended = -1, .name = "pop", .mode = {R_M16, END}},
{.opcode = 0x90, .extended = -1, .name = "xchg ax,ax", .mode = {END}},
{.opcode = 0x91, .extended = -1, .name = "xchg cx,ax", .mode = {END}},
{.opcode = 0x92, .extended = -1, .name = "xchg dx,ax", .mode = {END}},
{.opcode = 0x93, .extended = -1, .name = "xchg bx,ax", .mode = {END}},
{.opcode = 0x94, .extended = -1, .name = "xchg sp,ax", .mode = {END}},
{.opcode = 0x95, .extended = -1, .name = "xchg bp,ax", .mode = {END}},
{.opcode = 0x96, .extended = -1, .name = "xchg si,ax", .mode = {END}},
{.opcode = 0x97, .extended = -1, .name = "xchg di,ax", .mode = {END}},
{.opcode = 0x90, .extended = -1, .name = "xchg ax, ax", .mode = {END}},
{.opcode = 0x91, .extended = -1, .name = "xchg cx, ax", .mode = {END}},
{.opcode = 0x92, .extended = -1, .name = "xchg dx, ax", .mode = {END}},
{.opcode = 0x93, .extended = -1, .name = "xchg bx, ax", .mode = {END}},
{.opcode = 0x94, .extended = -1, .name = "xchg sp, ax", .mode = {END}},
{.opcode = 0x95, .extended = -1, .name = "xchg bp, ax", .mode = {END}},
{.opcode = 0x96, .extended = -1, .name = "xchg si, ax", .mode = {END}},
{.opcode = 0x97, .extended = -1, .name = "xchg di, ax", .mode = {END}},
{.opcode = 0x98, .extended = -1, .name = "cbw", .mode = {END}},
{.opcode = 0x99, .extended = -1, .name = "cwd", .mode = {END}},
// {.opcode = 0x9A, .extended = -1, .name = "call", .mode = {CALL_INTER, END}},
@@ -148,8 +148,8 @@ const instruction_t instructions[] = {
{.opcode = 0x9F, .extended = -1, .name = "lahf", .mode = {END}},
// {.opcode = 0xA0, .extended = -1, .name = "mov al", .mode = {moffs16, END}},
// {.opcode = 0xA1, .extended = -1, .name = "mov ax", .mode = {moffs16, END}},
// {.opcode = 0xA2, .extended = -1, .name = "mov %s,al", .mode = {moffs16, END}},
// {.opcode = 0xA3, .extended = -1, .name = "mov %s,ax", .mode = {moffs16, END}},
// {.opcode = 0xA2, .extended = -1, .name = "mov %s, al", .mode = {moffs16, END}},
// {.opcode = 0xA3, .extended = -1, .name = "mov %s, ax", .mode = {moffs16, END}},
{.opcode = 0xA4, .extended = -1, .name = "movsb", .mode = {END}},
{.opcode = 0xA5, .extended = -1, .name = "movsw", .mode = {END}},
{.opcode = 0xA6, .extended = -1, .name = "cmpsb", .mode = {END}},
@@ -205,8 +205,8 @@ const instruction_t instructions[] = {
{.opcode = 0xE3, .extended = -1, .name = "jcxz", .mode = {REL8, END}},
{.opcode = 0xE4, .extended = -1, .name = "in al", .mode = {IMM8, END}},
{.opcode = 0xE5, .extended = -1, .name = "in ax", .mode = {IMM8, END}},
{.opcode = 0xE6, .extended = -1, .name = "out %s,al", .mode = {IMM8, END}},
{.opcode = 0xE7, .extended = -1, .name = "out %s,ax", .mode = {IMM8, END}},
{.opcode = 0xE6, .extended = -1, .name = "out %s, al", .mode = {IMM8, END}},
{.opcode = 0xE7, .extended = -1, .name = "out %s, ax", .mode = {IMM8, END}},
{.opcode = 0xE8, .extended = -1, .name = "call", .mode = {REL16, END}},
{.opcode = 0xE9, .extended = -1, .name = "jmp", .mode = {REL16, END}},
// {.opcode = 0xEA, .extended = -1, .name = "jmp", .mode = {CALL_INTER, END}},
@@ -314,47 +314,47 @@ const instruction_t extended[][8] = {
// 0xd0 extended
{
{.opcode = 0x00, .extended = -2, .name = "rol %s,1", .mode = {R_M8, END}},
{.opcode = 0x01, .extended = -2, .name = "ror %s,1", .mode = {R_M8, END}},
{.opcode = 0x02, .extended = -2, .name = "rcl %s,1", .mode = {R_M8, END}},
{.opcode = 0x03, .extended = -2, .name = "rcr %s,1", .mode = {R_M8, END}},
{.opcode = 0x04, .extended = -2, .name = "shl %s,1", .mode = {R_M8, END}},
{.opcode = 0x05, .extended = -2, .name = "shr %s,1", .mode = {R_M8, END}},
{.opcode = 0x00, .extended = -2, .name = "rol %s, 1", .mode = {R_M8, END}},
{.opcode = 0x01, .extended = -2, .name = "ror %s, 1", .mode = {R_M8, END}},
{.opcode = 0x02, .extended = -2, .name = "rcl %s, 1", .mode = {R_M8, END}},
{.opcode = 0x03, .extended = -2, .name = "rcr %s, 1", .mode = {R_M8, END}},
{.opcode = 0x04, .extended = -2, .name = "shl %s, 1", .mode = {R_M8, END}},
{.opcode = 0x05, .extended = -2, .name = "shr %s, 1", .mode = {R_M8, END}},
/**/{.opcode = 0x06, .extended = -2, .name = "invalid", .mode = {END}},
{.opcode = 0x07, .extended = -2, .name = "sar %s,1", .mode = {R_M8, END}},
{.opcode = 0x07, .extended = -2, .name = "sar %s, 1", .mode = {R_M8, END}},
},
// 0xd1 extended
{
{.opcode = 0x00, .extended = -2, .name = "rol %s,1", .mode = {R_M16, END}},
{.opcode = 0x01, .extended = -2, .name = "ror %s,1", .mode = {R_M16, END}},
{.opcode = 0x02, .extended = -2, .name = "rcl %s,1", .mode = {R_M16, END}},
{.opcode = 0x03, .extended = -2, .name = "rcr %s,1", .mode = {R_M16, END}},
{.opcode = 0x04, .extended = -2, .name = "shl %s,1", .mode = {R_M16, END}},
{.opcode = 0x05, .extended = -2, .name = "shr %s,1", .mode = {R_M16, END}},
{.opcode = 0x00, .extended = -2, .name = "rol %s, 1", .mode = {R_M16, END}},
{.opcode = 0x01, .extended = -2, .name = "ror %s, 1", .mode = {R_M16, END}},
{.opcode = 0x02, .extended = -2, .name = "rcl %s, 1", .mode = {R_M16, END}},
{.opcode = 0x03, .extended = -2, .name = "rcr %s, 1", .mode = {R_M16, END}},
{.opcode = 0x04, .extended = -2, .name = "shl %s, 1", .mode = {R_M16, END}},
{.opcode = 0x05, .extended = -2, .name = "shr %s, 1", .mode = {R_M16, END}},
/**/{.opcode = 0x06, .extended = -2, .name = "invalid", .mode = {END}},
{.opcode = 0x07, .extended = -2, .name = "sar %s,1", .mode = {R_M16, END}},
{.opcode = 0x07, .extended = -2, .name = "sar %s, 1", .mode = {R_M16, END}},
},
// 0xd2 extended
{
{.opcode = 0x00, .extended = -2, .name = "rol %s,cl", .mode = {R_M8, END}},
{.opcode = 0x01, .extended = -2, .name = "ror %s,cl", .mode = {R_M8, END}},
{.opcode = 0x02, .extended = -2, .name = "rcl %s,cl", .mode = {R_M8, END}},
{.opcode = 0x03, .extended = -2, .name = "rcr %s,cl", .mode = {R_M8, END}},
{.opcode = 0x04, .extended = -2, .name = "shl %s,cl", .mode = {R_M8, END}},
{.opcode = 0x05, .extended = -2, .name = "shr %s,cl", .mode = {R_M8, END}},
{.opcode = 0x00, .extended = -2, .name = "rol %s, cl", .mode = {R_M8, END}},
{.opcode = 0x01, .extended = -2, .name = "ror %s, cl", .mode = {R_M8, END}},
{.opcode = 0x02, .extended = -2, .name = "rcl %s, cl", .mode = {R_M8, END}},
{.opcode = 0x03, .extended = -2, .name = "rcr %s, cl", .mode = {R_M8, END}},
{.opcode = 0x04, .extended = -2, .name = "shl %s, cl", .mode = {R_M8, END}},
{.opcode = 0x05, .extended = -2, .name = "shr %s, cl", .mode = {R_M8, END}},
/**/{.opcode = 0x06, .extended = -2, .name = "invalid", .mode = {END}},
{.opcode = 0x07, .extended = -2, .name = "sar %s,cl", .mode = {R_M8, END}},
{.opcode = 0x07, .extended = -2, .name = "sar %s, cl", .mode = {R_M8, END}},
},
// 0xd3 extended
{
{.opcode = 0x00, .extended = -2, .name = "rol %s,cl", .mode = {R_M16, END}},
{.opcode = 0x01, .extended = -2, .name = "ror %s,cl", .mode = {R_M16, END}},
{.opcode = 0x02, .extended = -2, .name = "rcl %s,cl", .mode = {R_M16, END}},
{.opcode = 0x03, .extended = -2, .name = "rcr %s,cl", .mode = {R_M16, END}},
{.opcode = 0x04, .extended = -2, .name = "shl %s,cl", .mode = {R_M16, END}},
{.opcode = 0x05, .extended = -2, .name = "shr %s,cl", .mode = {R_M16, END}},
{.opcode = 0x00, .extended = -2, .name = "rol %s, cl", .mode = {R_M16, END}},
{.opcode = 0x01, .extended = -2, .name = "ror %s, cl", .mode = {R_M16, END}},
{.opcode = 0x02, .extended = -2, .name = "rcl %s, cl", .mode = {R_M16, END}},
{.opcode = 0x03, .extended = -2, .name = "rcr %s, cl", .mode = {R_M16, END}},
{.opcode = 0x04, .extended = -2, .name = "shl %s, cl", .mode = {R_M16, END}},
{.opcode = 0x05, .extended = -2, .name = "shr %s, cl", .mode = {R_M16, END}},
/**/{.opcode = 0x06, .extended = -2, .name = "invalid", .mode = {END}},
{.opcode = 0x07, .extended = -2, .name = "sar %s,cl", .mode = {R_M16, END}},
{.opcode = 0x07, .extended = -2, .name = "sar %s, cl", .mode = {R_M16, END}},
},
};