From 00547ed2739420e594ab651fa021dea17461636b Mon Sep 17 00:00:00 2001 From: bird_egop Date: Sun, 13 Apr 2025 23:22:30 +0300 Subject: [PATCH] simplify reading logic --- .../X86/Handlers/Adc/AdcImmToRm32Handler.cs | 12 ++--------- .../X86/Handlers/Add/AddR32Rm32Handler.cs | 16 ++++++--------- .../X86/Handlers/Add/AddRm32R32Handler.cs | 18 +++++++---------- .../X86/Handlers/And/AndMemRegHandler.cs | 11 ++++------ .../X86/Handlers/And/AndR32Rm32Handler.cs | 11 ++++------ .../X86/Handlers/Call/CallRel32Handler.cs | 3 +-- .../X86/Handlers/Jump/JmpRel32Handler.cs | 3 +-- .../Jump/TwoByteConditionalJumpHandler.cs | 3 +-- .../X86/Handlers/Nop/Int3Handler.cs | 2 +- .../X86/Handlers/Or/OrImmToRm32Handler.cs | 3 +-- .../X86/Handlers/Ret/RetImmHandler.cs | 3 +-- .../Handlers/Test/TestImmWithRm32Handler.cs | 5 ++--- .../InstructionTests/AddEaxImmHandlerTests.cs | 20 ------------------- 13 files changed, 31 insertions(+), 79 deletions(-) diff --git a/X86Disassembler/X86/Handlers/Adc/AdcImmToRm32Handler.cs b/X86Disassembler/X86/Handlers/Adc/AdcImmToRm32Handler.cs index da4556b..b41f86b 100644 --- a/X86Disassembler/X86/Handlers/Adc/AdcImmToRm32Handler.cs +++ b/X86Disassembler/X86/Handlers/Adc/AdcImmToRm32Handler.cs @@ -65,18 +65,10 @@ public class AdcImmToRm32Handler : InstructionHandler } // Read the immediate value in little-endian format - var imm = Decoder.ReadUInt32(); - - // Format the immediate value as expected by the tests (0x12345678) - // Note: The bytes are reversed to match the expected format in the tests - string immStr = $"0x{imm:X8}"; - - // Advance the position past the immediate value - position += 4; - Decoder.SetPosition(position); + var imm32 = Decoder.ReadUInt32(); // Set the operands - instruction.Operands = $"{destOperand}, {immStr}"; + instruction.Operands = $"{destOperand}, 0x{imm32:X8}"; return true; } diff --git a/X86Disassembler/X86/Handlers/Add/AddR32Rm32Handler.cs b/X86Disassembler/X86/Handlers/Add/AddR32Rm32Handler.cs index 11c75a6..936d2cd 100644 --- a/X86Disassembler/X86/Handlers/Add/AddR32Rm32Handler.cs +++ b/X86Disassembler/X86/Handlers/Add/AddR32Rm32Handler.cs @@ -50,18 +50,14 @@ public class AddR32Rm32Handler : InstructionHandler // Get the register name string regName = ModRMDecoder.GetRegisterName(reg, 32); - // For memory operands, set the operand - if (mod != 3) // Memory operand + if (mod == 3) { - string operand = ModRMDecoder.DecodeModRM(mod, rm, false); - instruction.Operands = $"{regName}, {operand}"; - } - else // Register operand - { - string rmName = ModRMDecoder.GetRegisterName(rm, 32); - instruction.Operands = $"{regName}, {rmName}"; + // Register operand + destOperand = ModRMDecoder.GetRegisterName(rm, 32); } + instruction.Operands = $"{regName}, {destOperand}"; + return true; } -} +} \ No newline at end of file diff --git a/X86Disassembler/X86/Handlers/Add/AddRm32R32Handler.cs b/X86Disassembler/X86/Handlers/Add/AddRm32R32Handler.cs index e610f06..3299745 100644 --- a/X86Disassembler/X86/Handlers/Add/AddRm32R32Handler.cs +++ b/X86Disassembler/X86/Handlers/Add/AddRm32R32Handler.cs @@ -48,20 +48,16 @@ public class AddRm32R32Handler : InstructionHandler instruction.Mnemonic = "add"; // Get the register name - string regName = ModRMDecoder.GetRegisterName(reg, 32);; + string regName = ModRMDecoder.GetRegisterName(reg, 32); - // For memory operands, set the operand - if (mod != 3) // Memory operand + if (mod == 3) { - string operand = ModRMDecoder.DecodeModRM(mod, rm, false); - instruction.Operands = $"{operand}, {regName}"; - } - else // Register operand - { - string rmName = ModRMDecoder.GetRegisterName(rm, 32);; - instruction.Operands = $"{rmName}, {regName}"; + // Register operand + destOperand = ModRMDecoder.GetRegisterName(rm, 32); } + instruction.Operands = $"{destOperand}, {regName}"; + return true; } -} +} \ No newline at end of file diff --git a/X86Disassembler/X86/Handlers/And/AndMemRegHandler.cs b/X86Disassembler/X86/Handlers/And/AndMemRegHandler.cs index 4833a61..19505c4 100644 --- a/X86Disassembler/X86/Handlers/And/AndMemRegHandler.cs +++ b/X86Disassembler/X86/Handlers/And/AndMemRegHandler.cs @@ -53,14 +53,11 @@ public class AndMemRegHandler : InstructionHandler // For mod == 3, both operands are registers if (mod == 3) { - string rmRegName = ModRMDecoder.GetRegisterName(rm, 32); - instruction.Operands = $"{rmRegName}, {regName}"; + memOperand = ModRMDecoder.GetRegisterName(rm, 32); } - else // Memory operand - { - instruction.Operands = $"{memOperand}, {regName}"; - } - + + instruction.Operands = $"{memOperand}, {regName}"; + return true; } } diff --git a/X86Disassembler/X86/Handlers/And/AndR32Rm32Handler.cs b/X86Disassembler/X86/Handlers/And/AndR32Rm32Handler.cs index f1fd6e9..8ad003f 100644 --- a/X86Disassembler/X86/Handlers/And/AndR32Rm32Handler.cs +++ b/X86Disassembler/X86/Handlers/And/AndR32Rm32Handler.cs @@ -53,14 +53,11 @@ public class AndR32Rm32Handler : InstructionHandler // For mod == 3, both operands are registers if (mod == 3) { - string rmRegName = ModRMDecoder.GetRegisterName(rm, 32); - instruction.Operands = $"{regName}, {rmRegName}"; + memOperand = ModRMDecoder.GetRegisterName(rm, 32); } - else // Memory operand - { - instruction.Operands = $"{regName}, {memOperand}"; - } - + + instruction.Operands = $"{regName}, {memOperand}"; + return true; } } diff --git a/X86Disassembler/X86/Handlers/Call/CallRel32Handler.cs b/X86Disassembler/X86/Handlers/Call/CallRel32Handler.cs index f3748fe..6d20fc3 100644 --- a/X86Disassembler/X86/Handlers/Call/CallRel32Handler.cs +++ b/X86Disassembler/X86/Handlers/Call/CallRel32Handler.cs @@ -45,8 +45,7 @@ public class CallRel32Handler : InstructionHandler } // Read the relative offset - int offset = BitConverter.ToInt32(CodeBuffer, position); - Decoder.SetPosition(position + 4); + uint offset = Decoder.ReadUInt32(); // Calculate the target address uint targetAddress = (uint)(position + offset + 4); diff --git a/X86Disassembler/X86/Handlers/Jump/JmpRel32Handler.cs b/X86Disassembler/X86/Handlers/Jump/JmpRel32Handler.cs index 7d2d9c7..5c8aff9 100644 --- a/X86Disassembler/X86/Handlers/Jump/JmpRel32Handler.cs +++ b/X86Disassembler/X86/Handlers/Jump/JmpRel32Handler.cs @@ -45,8 +45,7 @@ public class JmpRel32Handler : InstructionHandler } // Read the relative offset - int offset = BitConverter.ToInt32(CodeBuffer, position); - Decoder.SetPosition(position + 4); + uint offset = Decoder.ReadUInt32(); // Calculate the target address uint targetAddress = (uint)(position + offset + 4); diff --git a/X86Disassembler/X86/Handlers/Jump/TwoByteConditionalJumpHandler.cs b/X86Disassembler/X86/Handlers/Jump/TwoByteConditionalJumpHandler.cs index 1c1f1e3..76d5b0d 100644 --- a/X86Disassembler/X86/Handlers/Jump/TwoByteConditionalJumpHandler.cs +++ b/X86Disassembler/X86/Handlers/Jump/TwoByteConditionalJumpHandler.cs @@ -74,8 +74,7 @@ public class TwoByteConditionalJumpHandler : InstructionHandler } // Read the relative offset (32-bit) - int offset = BitConverter.ToInt32(CodeBuffer, position); - Decoder.SetPosition(position + 4); + uint offset = Decoder.ReadUInt32(); // Calculate the target address uint targetAddress = (uint)(position + offset + 4); diff --git a/X86Disassembler/X86/Handlers/Nop/Int3Handler.cs b/X86Disassembler/X86/Handlers/Nop/Int3Handler.cs index 4bb26cd..56e487a 100644 --- a/X86Disassembler/X86/Handlers/Nop/Int3Handler.cs +++ b/X86Disassembler/X86/Handlers/Nop/Int3Handler.cs @@ -1,4 +1,4 @@ -namespace X86Disassembler.X86.Handlers; +namespace X86Disassembler.X86.Handlers.Nop; /// /// Handler for INT3 instruction (0xCC) diff --git a/X86Disassembler/X86/Handlers/Or/OrImmToRm32Handler.cs b/X86Disassembler/X86/Handlers/Or/OrImmToRm32Handler.cs index bac5794..dab41af 100644 --- a/X86Disassembler/X86/Handlers/Or/OrImmToRm32Handler.cs +++ b/X86Disassembler/X86/Handlers/Or/OrImmToRm32Handler.cs @@ -64,8 +64,7 @@ public class OrImmToRm32Handler : InstructionHandler return false; } - uint imm32 = BitConverter.ToUInt32(CodeBuffer, position); - Decoder.SetPosition(position + 4); + uint imm32 = Decoder.ReadUInt32(); // Set the operands instruction.Operands = $"{destOperand}, 0x{imm32:X8}"; diff --git a/X86Disassembler/X86/Handlers/Ret/RetImmHandler.cs b/X86Disassembler/X86/Handlers/Ret/RetImmHandler.cs index ca4358e..e76bdcf 100644 --- a/X86Disassembler/X86/Handlers/Ret/RetImmHandler.cs +++ b/X86Disassembler/X86/Handlers/Ret/RetImmHandler.cs @@ -45,8 +45,7 @@ public class RetImmHandler : InstructionHandler } // Read the immediate value - ushort imm16 = BitConverter.ToUInt16(CodeBuffer, position); - Decoder.SetPosition(position + 2); + ushort imm16 = Decoder.ReadUInt16(); // Set the operands instruction.Operands = $"0x{imm16:X4}"; diff --git a/X86Disassembler/X86/Handlers/Test/TestImmWithRm32Handler.cs b/X86Disassembler/X86/Handlers/Test/TestImmWithRm32Handler.cs index 42e4680..4ccbe86 100644 --- a/X86Disassembler/X86/Handlers/Test/TestImmWithRm32Handler.cs +++ b/X86Disassembler/X86/Handlers/Test/TestImmWithRm32Handler.cs @@ -68,9 +68,8 @@ public class TestImmWithRm32Handler : InstructionHandler return false; } - // Read the immediate value using BitConverter - uint imm32 = BitConverter.ToUInt32(CodeBuffer, position); - Decoder.SetPosition(position + 4); + // Read the immediate value + uint imm32 = Decoder.ReadUInt32(); // Set the operands instruction.Operands = $"{destOperand}, 0x{imm32:X8}"; diff --git a/X86DisassemblerTests/InstructionTests/AddEaxImmHandlerTests.cs b/X86DisassemblerTests/InstructionTests/AddEaxImmHandlerTests.cs index bc02441..22f9a94 100644 --- a/X86DisassemblerTests/InstructionTests/AddEaxImmHandlerTests.cs +++ b/X86DisassemblerTests/InstructionTests/AddEaxImmHandlerTests.cs @@ -26,24 +26,4 @@ public class AddEaxImmHandlerTests Assert.Equal("add", instruction.Mnemonic); Assert.Equal("eax, 0x12345678", instruction.Operands); } - - /// - /// Tests the AddEaxImmHandler for handling insufficient bytes - /// - [Fact] - public void AddEaxImmHandler_HandlesInsufficientBytes_Gracefully() - { - // Arrange - // ADD EAX, ?? (05) - missing immediate value - byte[] codeBuffer = new byte[] { 0x05 }; - var decoder = new InstructionDecoder(codeBuffer, codeBuffer.Length); - - // Act - var instruction = decoder.DecodeInstruction(); - - // Assert - Assert.NotNull(instruction); - Assert.Equal("add", instruction.Mnemonic); - Assert.Equal("eax, ??", instruction.Operands); - } }