diff options
| author | ladevieq <ladevie.quentin@gmail.com> | 2026-07-25 22:56:08 +0200 |
|---|---|---|
| committer | ladevieq <ladevie.quentin@gmail.com> | 2026-07-25 22:56:08 +0200 |
| commit | d7583bf11c618d2e1ee4a89d9d9f394172489aa8 (patch) | |
| tree | 422627aee9eafa3b2fc2d31f80c88b7afeb7e13f /src/disasm.c | |
| parent | 87075f30cb51199690e367184cfacf2d83400435 (diff) | |
Fix REX prefix detection
Improve relative offset printing
Diffstat (limited to 'src/disasm.c')
| -rw-r--r-- | src/disasm.c | 38 |
1 files changed, 29 insertions, 9 deletions
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("]"); } } } |
