summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorladevieq <ladevie.quentin@gmail.com>2026-07-25 22:56:08 +0200
committerladevieq <ladevie.quentin@gmail.com>2026-07-25 22:56:08 +0200
commitd7583bf11c618d2e1ee4a89d9d9f394172489aa8 (patch)
tree422627aee9eafa3b2fc2d31f80c88b7afeb7e13f /src
parent87075f30cb51199690e367184cfacf2d83400435 (diff)
Fix REX prefix detection
Improve relative offset printing
Diffstat (limited to 'src')
-rw-r--r--src/disasm.c38
-rw-r--r--src/utils.c2
2 files changed, 30 insertions, 10 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("]");
}
}
}
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];