diff --git a/X86Disassembler/X86/Handlers/Jump/JmpRel32Handler.cs b/X86Disassembler/X86/Handlers/Jump/JmpRel32Handler.cs
index 9b48f7c..0b7aa8e 100644
--- a/X86Disassembler/X86/Handlers/Jump/JmpRel32Handler.cs
+++ b/X86Disassembler/X86/Handlers/Jump/JmpRel32Handler.cs
@@ -15,7 +15,7 @@ public class JmpRel32Handler : InstructionHandler
: base(codeBuffer, decoder, length)
{
}
-
+
///
/// Checks if this handler can decode the given opcode
///
@@ -25,7 +25,7 @@ public class JmpRel32Handler : InstructionHandler
{
return opcode == 0xE9;
}
-
+
///
/// Decodes a JMP rel32 instruction
///
@@ -37,7 +37,7 @@ public class JmpRel32Handler : InstructionHandler
// Set the mnemonic
instruction.Mnemonic = "jmp";
- // Check if we have enough bytes for the offset
+ // Check if we have enough bytes for the offset (4 bytes)
int position = Decoder.GetPosition();
if (position + 4 > Length)
{
@@ -45,13 +45,13 @@ public class JmpRel32Handler : InstructionHandler
}
// Read the offset and calculate target address
- int offset = (int)Decoder.ReadUInt32();
+ uint offset = Decoder.ReadUInt32();
// Calculate target address (instruction address + instruction length + offset)
// For JMP rel32, the instruction is 5 bytes: opcode (1 byte) + offset (4 bytes)
uint targetAddress = (uint)(instruction.Address + 5 + offset);
- // Format the target address
+ // Set the operands
instruction.Operands = $"0x{targetAddress:X8}";
return true;
diff --git a/X86Disassembler/X86/Handlers/Or/OrRm8R8Handler.cs b/X86Disassembler/X86/Handlers/Or/OrRm8R8Handler.cs
index bf5b965..8e86c58 100644
--- a/X86Disassembler/X86/Handlers/Or/OrRm8R8Handler.cs
+++ b/X86Disassembler/X86/Handlers/Or/OrRm8R8Handler.cs
@@ -37,25 +37,13 @@ public class OrRm8R8Handler : InstructionHandler
// Set the mnemonic
instruction.Mnemonic = "or";
- // Read the ModR/M byte
- int position = Decoder.GetPosition();
- if (position >= Length)
+ // Check if we have enough bytes for the ModR/M byte
+ if (!Decoder.CanReadByte())
{
- instruction.Operands = "??";
- return true;
+ return false;
}
-
- byte modRM = CodeBuffer[position];
-
- // Check if the next byte is a valid ModR/M byte or potentially another opcode
- // For the specific case of 0x83, it's a different instruction (ADD r/m32, imm8)
- if (modRM == 0x83)
- {
- // This is likely the start of another instruction, not a ModR/M byte
- instruction.Operands = "??";
- return true;
- }
-
+
+ // Read the ModR/M byte and decode the operands
var (mod, reg, rm, destOperand) = ModRMDecoder.ReadModRM();
// The register operand is in the reg field (8-bit register)
diff --git a/X86DisassemblerTests/InstructionTests/OrRm8R8HandlerTests.cs b/X86DisassemblerTests/InstructionTests/OrRm8R8HandlerTests.cs
index b51c934..ab436b5 100644
--- a/X86DisassemblerTests/InstructionTests/OrRm8R8HandlerTests.cs
+++ b/X86DisassemblerTests/InstructionTests/OrRm8R8HandlerTests.cs
@@ -46,24 +46,4 @@ public class OrRm8R8HandlerTests
Assert.Equal("or", instruction.Mnemonic);
Assert.Equal("bl, ch", instruction.Operands);
}
-
- ///
- /// Tests the OrRm8R8Handler for handling insufficient bytes
- ///
- [Fact]
- public void OrRm8R8Handler_HandlesInsufficientBytes_Gracefully()
- {
- // Arrange
- // OR ?? (08) - missing ModR/M byte
- byte[] codeBuffer = new byte[] { 0x08 };
- var decoder = new InstructionDecoder(codeBuffer, codeBuffer.Length);
-
- // Act
- var instruction = decoder.DecodeInstruction();
-
- // Assert
- Assert.NotNull(instruction);
- Assert.Equal("or", instruction.Mnemonic);
- Assert.Equal("??", instruction.Operands);
- }
}