From d7583bf11c618d2e1ee4a89d9d9f394172489aa8 Mon Sep 17 00:00:00 2001 From: ladevieq Date: Sat, 25 Jul 2026 22:56:08 +0200 Subject: Fix REX prefix detection Improve relative offset printing --- src/disasm.c | 38 +++++++++++++++++++++++++++++--------- src/utils.c | 2 +- 2 files changed, 30 insertions(+), 10 deletions(-) (limited to 'src') diff --git a/src/disasm.c b/src/disasm.c index 36df605..4671611 100644 --- a/src/disasm.c +++ b/src/disasm.c @@ -1041,7 +1041,7 @@ void unassemble(u8* start, u64 size) { UNUSED_VAR(ModRM_RM_extended); u8 SIB_index_extended = 0U; UNUSED_VAR(SIB_index_extended); - if ((has_REX_prefix = ((*current_byte & REX_prefix_mask) == REX_prefix_mask)) == TRUE) { + if ((has_REX_prefix = ((*current_byte & 0b11000000) == REX_prefix_mask)) == TRUE) { u8 REX = *current_byte; current_byte++; @@ -1184,7 +1184,11 @@ void unassemble(u8* start, u64 size) { if (Mod == 0b11) { // Register direct addressing mode print(" %s", get_ModRM_reg(RM, effective_operand_size, use_3DNow_reg, use_SSE_reg)); } else if (RM == 0b101) { - print(" RIP + %d", disp); + if (disp < 0) { + print(" [RIP - 0x%x]", -disp); + } else { + print(" [RIP + 0x%x]", disp); + } } else if(RM != 0b100) { // Register indirect addressing mode print(" %s", get_ModRM_reg(RM, effective_operand_size, use_3DNow_reg, use_SSE_reg)); } @@ -1197,7 +1201,11 @@ void unassemble(u8* start, u64 size) { print(" 0x%x", src_imm); break; case TYPE_J: - print(" RIP + %d", rel_offset); + if (rel_offset < 0) { + print(" [RIP - 0x%x]", -rel_offset); + } else { + print(" [RIP + 0x%x]", rel_offset); + } break; case Reg: print(" %s", registers[op->src_operand.reg]); @@ -1225,11 +1233,13 @@ void unassemble(u8* start, u64 size) { if (index != 0b100) { print(" +"); } - print(" [base(%s)]", SIB_base_registers[base]); + print(" [base(%s)", SIB_base_registers[base]); } if (disp_bytes_count) { - print(" + offset(0x%x)", disp); + print(" + offset(0x%x)]", disp); + } else { + print("]"); } } } @@ -1250,7 +1260,11 @@ void unassemble(u8* start, u64 size) { if (Mod == 0b11) { // Register direct addressing mode print(" %s", get_ModRM_reg(RM, effective_operand_size, use_3DNow_reg, use_SSE_reg)); } else if (RM == 0b101) { - print(" RIP + %d", disp); + if (disp < 0) { + print(" [RIP - 0x%x]", -disp); + } else { + print(" [RIP + 0x%x]", disp); + } } else if(RM != 0b100) { // Register indirect addressing mode print(" %s", get_ModRM_reg(RM, effective_operand_size, use_3DNow_reg, use_SSE_reg)); } @@ -1263,7 +1277,11 @@ void unassemble(u8* start, u64 size) { print(" 0x%x", dst_imm); break; case TYPE_J: - print("RIP + %d", rel_offset); + if (rel_offset < 0) { + print(" [RIP - 0x%x]", -rel_offset); + } else { + print(" [RIP + 0x%x]", rel_offset); + } break; case Reg: print(" %s", registers[op->src_operand.reg]); @@ -1291,11 +1309,13 @@ void unassemble(u8* start, u64 size) { if (index != 0b100) { print(" +"); } - print(" [base(%s)]", SIB_base_registers[base]); + print(" [base(%s)", SIB_base_registers[base]); } if (disp_bytes_count) { - print(" + offset(0x%x)", disp); + print(" + offset(0x%x)]", disp); + } else { + print("]"); } } } diff --git a/src/utils.c b/src/utils.c index b0c95a9..1de19f9 100644 --- a/src/utils.c +++ b/src/utils.c @@ -127,7 +127,7 @@ void i64toa(i64 number, char* str, u32 base) { }; u32 remainder = 0U; u32 size = 0U; - u64 u_number = ~number + 1; + u64 u_number = (number < 0) ? (~number + 1) : (number); if (number == 0) { str[0U] = codes[0U]; -- cgit v1.3