From d1d52af5118685bacb2b68c56b13aafa3c7bbc2f Mon Sep 17 00:00:00 2001 From: bird_egop Date: Sun, 13 Apr 2025 17:17:28 +0300 Subject: [PATCH] Added CSV test files for various instruction types and enabled comments in CSV files --- .../RawFromFileDisassemblyTests.cs | 10 +- X86DisassemblerTests/TestData/nop_tests.csv | 2 + .../TestData/pushimm_tests.csv | 3 + .../TestData/segment_override_tests.csv | 7 + X86DisassemblerTests/TestData/sub_tests.csv | 25 ++ X86DisassemblerTests/TestData/xchg_tests.csv | 8 + .../X86DisassemblerTests.csproj | 8 +- X86DisassemblerTests/instruction_test.json | 253 ------------------ 8 files changed, 59 insertions(+), 257 deletions(-) create mode 100644 X86DisassemblerTests/TestData/nop_tests.csv create mode 100644 X86DisassemblerTests/TestData/pushimm_tests.csv create mode 100644 X86DisassemblerTests/TestData/segment_override_tests.csv create mode 100644 X86DisassemblerTests/TestData/sub_tests.csv create mode 100644 X86DisassemblerTests/TestData/xchg_tests.csv delete mode 100644 X86DisassemblerTests/instruction_test.json diff --git a/X86DisassemblerTests/RawFromFileDisassemblyTests.cs b/X86DisassemblerTests/RawFromFileDisassemblyTests.cs index 5104a2a..06bc20c 100644 --- a/X86DisassemblerTests/RawFromFileDisassemblyTests.cs +++ b/X86DisassemblerTests/RawFromFileDisassemblyTests.cs @@ -12,6 +12,11 @@ public class RawFromFileDisassemblyTests(ITestOutputHelper output) [Theory] [InlineData("pushreg_tests.csv")] [InlineData("popreg_tests.csv")] + [InlineData("pushimm_tests.csv")] + [InlineData("nop_tests.csv")] + [InlineData("xchg_tests.csv")] + [InlineData("sub_tests.csv")] + [InlineData("segment_override_tests.csv")] public void RunTests(string file) { // Load the CSV test file from embedded resources @@ -28,7 +33,10 @@ public class RawFromFileDisassemblyTests(ITestOutputHelper output) { HasHeaderRecord = true, Delimiter = ";", - BadDataFound = null // Ignore bad data + BadDataFound = null, // Ignore bad data + AllowComments = true, // Enable comments in CSV files + Comment = '#', // Use # as the comment character + IgnoreBlankLines = true // Skip empty lines }; using var streamReader = new StreamReader(stream); diff --git a/X86DisassemblerTests/TestData/nop_tests.csv b/X86DisassemblerTests/TestData/nop_tests.csv new file mode 100644 index 0000000..2a57f98 --- /dev/null +++ b/X86DisassemblerTests/TestData/nop_tests.csv @@ -0,0 +1,2 @@ +RawBytes;Instructions +90;[{ "Mnemonic": "nop", "Operands": "" }] diff --git a/X86DisassemblerTests/TestData/pushimm_tests.csv b/X86DisassemblerTests/TestData/pushimm_tests.csv new file mode 100644 index 0000000..7370115 --- /dev/null +++ b/X86DisassemblerTests/TestData/pushimm_tests.csv @@ -0,0 +1,3 @@ +RawBytes;Instructions +6810000000;[{ "Mnemonic": "push", "Operands": "0x00000010" }] +6A10;[{ "Mnemonic": "push", "Operands": "0x10" }] diff --git a/X86DisassemblerTests/TestData/segment_override_tests.csv b/X86DisassemblerTests/TestData/segment_override_tests.csv new file mode 100644 index 0000000..ceed94f --- /dev/null +++ b/X86DisassemblerTests/TestData/segment_override_tests.csv @@ -0,0 +1,7 @@ +RawBytes;Instructions +26FF7510;[{ "Mnemonic": "push", "Operands": "dword ptr es:[ebp+0x10]" }] +2EFF7510;[{ "Mnemonic": "push", "Operands": "dword ptr cs:[ebp+0x10]" }] +36FF7510;[{ "Mnemonic": "push", "Operands": "dword ptr ss:[ebp+0x10]" }] +3EFF7510;[{ "Mnemonic": "push", "Operands": "dword ptr ds:[ebp+0x10]" }] +64FF7510;[{ "Mnemonic": "push", "Operands": "dword ptr fs:[ebp+0x10]" }] +65FF7510;[{ "Mnemonic": "push", "Operands": "dword ptr gs:[ebp+0x10]" }] diff --git a/X86DisassemblerTests/TestData/sub_tests.csv b/X86DisassemblerTests/TestData/sub_tests.csv new file mode 100644 index 0000000..1602686 --- /dev/null +++ b/X86DisassemblerTests/TestData/sub_tests.csv @@ -0,0 +1,25 @@ +# SUB instruction tests +# Format: RawBytes;Instructions +RawBytes;Instructions + +# Register-to-register SUB +29D8;[{ "Mnemonic": "sub", "Operands": "eax, ebx" }] + +# Register-to-memory SUB +294B10;[{ "Mnemonic": "sub", "Operands": "dword ptr [ebx+0x10], ecx" }] + +# Memory-to-register SUB +2BD8;[{ "Mnemonic": "sub", "Operands": "ebx, eax" }] +2B4B10;[{ "Mnemonic": "sub", "Operands": "ecx, dword ptr [ebx+0x10]" }] + +# Immediate-to-register SUB (32-bit immediate) +81E878563412;[{ "Mnemonic": "sub", "Operands": "eax, 0x12345678" }] + +# Immediate-to-memory SUB (32-bit immediate) +816B1078563412;[{ "Mnemonic": "sub", "Operands": "dword ptr [ebx+0x10], 0x12345678" }] + +# Small immediate SUB (8-bit immediate) +83E842;[{ "Mnemonic": "sub", "Operands": "eax, 0x42" }] + +# Sign-extended immediate SUB (8-bit immediate sign-extended to 32-bit) +83E8F0;[{ "Mnemonic": "sub", "Operands": "eax, 0xFFFFFFF0" }] diff --git a/X86DisassemblerTests/TestData/xchg_tests.csv b/X86DisassemblerTests/TestData/xchg_tests.csv new file mode 100644 index 0000000..085b344 --- /dev/null +++ b/X86DisassemblerTests/TestData/xchg_tests.csv @@ -0,0 +1,8 @@ +RawBytes;Instructions +91;[{ "Mnemonic": "xchg", "Operands": "eax, ecx" }] +92;[{ "Mnemonic": "xchg", "Operands": "eax, edx" }] +93;[{ "Mnemonic": "xchg", "Operands": "eax, ebx" }] +94;[{ "Mnemonic": "xchg", "Operands": "eax, esp" }] +95;[{ "Mnemonic": "xchg", "Operands": "eax, ebp" }] +96;[{ "Mnemonic": "xchg", "Operands": "eax, esi" }] +97;[{ "Mnemonic": "xchg", "Operands": "eax, edi" }] diff --git a/X86DisassemblerTests/X86DisassemblerTests.csproj b/X86DisassemblerTests/X86DisassemblerTests.csproj index fc805f6..27605e7 100644 --- a/X86DisassemblerTests/X86DisassemblerTests.csproj +++ b/X86DisassemblerTests/X86DisassemblerTests.csproj @@ -30,9 +30,11 @@ - - - + + + + + diff --git a/X86DisassemblerTests/instruction_test.json b/X86DisassemblerTests/instruction_test.json deleted file mode 100644 index d054e3f..0000000 --- a/X86DisassemblerTests/instruction_test.json +++ /dev/null @@ -1,253 +0,0 @@ -[ - { - "RawBytes": "6810000000", - "Disassembled": [ - { - "Mnemonic": "push", - "Operands": "0x00000010" - } - ] - }, - { - "RawBytes": "6A10", - "Disassembled": [ - { - "Mnemonic": "push", - "Operands": "0x10" - } - ] - }, - { - "RawBytes": "90", - "Disassembled": [ - { - "Mnemonic": "nop", - "Operands": "" - } - ] - }, - { - "RawBytes": "91", - "Disassembled": [ - { - "Mnemonic": "xchg", - "Operands": "eax, ecx" - } - ] - }, - { - "RawBytes": "92", - "Disassembled": [ - { - "Mnemonic": "xchg", - "Operands": "eax, edx" - } - ] - }, - { - "RawBytes": "93", - "Disassembled": [ - { - "Mnemonic": "xchg", - "Operands": "eax, ebx" - } - ] - }, - { - "RawBytes": "94", - "Disassembled": [ - { - "Mnemonic": "xchg", - "Operands": "eax, esp" - } - ] - }, - { - "RawBytes": "95", - "Disassembled": [ - { - "Mnemonic": "xchg", - "Operands": "eax, ebp" - } - ] - }, - { - "RawBytes": "96", - "Disassembled": [ - { - "Mnemonic": "xchg", - "Operands": "eax, esi" - } - ] - }, - { - "RawBytes": "97", - "Disassembled": [ - { - "Mnemonic": "xchg", - "Operands": "eax, edi" - } - ] - }, - { - "RawBytes": "29D8", - "Disassembled": [ - { - "Mnemonic": "sub", - "Operands": "eax, ebx" - } - ] - }, - { - "RawBytes": "294B10", - "Disassembled": [ - { - "Mnemonic": "sub", - "Operands": "dword ptr [ebx+0x10], ecx" - } - ] - }, - { - "RawBytes": "2BD8", - "Disassembled": [ - { - "Mnemonic": "sub", - "Operands": "ebx, eax" - } - ] - }, - { - "RawBytes": "2B4B10", - "Disassembled": [ - { - "Mnemonic": "sub", - "Operands": "ecx, dword ptr [ebx+0x10]" - } - ] - }, - { - "RawBytes": "81E878563412", - "Disassembled": [ - { - "Mnemonic": "sub", - "Operands": "eax, 0x12345678" - } - ] - }, - { - "RawBytes": "816B1078563412", - "Disassembled": [ - { - "Mnemonic": "sub", - "Operands": "dword ptr [ebx+0x10], 0x12345678" - } - ] - }, - { - "RawBytes": "83E842", - "Disassembled": [ - { - "Mnemonic": "sub", - "Operands": "eax, 0x42" - } - ] - }, - { - "RawBytes": "83E8F0", - "Disassembled": [ - { - "Mnemonic": "sub", - "Operands": "eax, 0xFFFFFFF0" - } - ] - }, - { - "RawBytes": "836B1042", - "Disassembled": [ - { - "Mnemonic": "sub", - "Operands": "dword ptr [ebx+0x10], 0x42" - } - ] - }, - { - "RawBytes": "83EC10", - "Disassembled": [ - { - "Mnemonic": "sub", - "Operands": "esp, 0x10" - } - ] - }, - { - "RawBytes": "83EC1029D82B4DFC", - "Disassembled": [ - { - "Mnemonic": "sub", - "Operands": "esp, 0x10" - }, - { - "Mnemonic": "sub", - "Operands": "eax, ebx" - }, - { - "Mnemonic": "sub", - "Operands": "ecx, dword ptr [ebp-0x04]" - } - ] - }, - { - "RawBytes": "26FF7510", - "Disassembled": [ - { - "Mnemonic": "push", - "Operands": "dword ptr es:[ebp+0x10]" - } - ] - }, - { - "RawBytes": "2EFF7510", - "Disassembled": [ - { - "Mnemonic": "push", - "Operands": "dword ptr cs:[ebp+0x10]" - } - ] - }, - { - "RawBytes": "36FF7510", - "Disassembled": [ - { - "Mnemonic": "push", - "Operands": "dword ptr ss:[ebp+0x10]" - } - ] - }, - { - "RawBytes": "3EFF7510", - "Disassembled": [ - { - "Mnemonic": "push", - "Operands": "dword ptr ds:[ebp+0x10]" - } - ] - }, - { - "RawBytes": "64FF7510", - "Disassembled": [ - { - "Mnemonic": "push", - "Operands": "dword ptr fs:[ebp+0x10]" - } - ] - }, - { - "RawBytes": "65FF7510", - "Disassembled": [ - { - "Mnemonic": "push", - "Operands": "dword ptr gs:[ebp+0x10]" - } - ] - } -] \ No newline at end of file