From 60204a51a38677824b2d7a0195e92aca988a5af4 Mon Sep 17 00:00:00 2001 From: Zoe Roux Date: Thu, 1 Jun 2023 18:50:33 +0900 Subject: [PATCH] Fix some printing issues --- src/dasm.c | 19 +++++++--- src/instructions.c | 86 +++++++++++++++++++++++----------------------- 2 files changed, 57 insertions(+), 48 deletions(-) diff --git a/src/dasm.c b/src/dasm.c index f5ff11c..5f94552 100644 --- a/src/dasm.c +++ b/src/dasm.c @@ -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; diff --git a/src/instructions.c b/src/instructions.c index ed4bc56..9cf7001 100644 --- a/src/instructions.c +++ b/src/instructions.c @@ -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}}, }, };