From 6169d689675115c7a4b22bc357ae2e3975e23e02 Mon Sep 17 00:00:00 2001 From: bird_egop Date: Tue, 15 Apr 2025 22:32:37 +0300 Subject: [PATCH] Enhanced test coverage for CMP, BIT and CALL instructions --- X86DisassemblerTests/TestData/bit_tests.csv | 28 +++++++++++++++ X86DisassemblerTests/TestData/call_tests.csv | 7 ++++ X86DisassemblerTests/TestData/cmp_tests.csv | 38 ++++++++++++++++++-- 3 files changed, 71 insertions(+), 2 deletions(-) diff --git a/X86DisassemblerTests/TestData/bit_tests.csv b/X86DisassemblerTests/TestData/bit_tests.csv index 4b7a7fe..a6d7fc2 100644 --- a/X86DisassemblerTests/TestData/bit_tests.csv +++ b/X86DisassemblerTests/TestData/bit_tests.csv @@ -6,54 +6,82 @@ RawBytes;Instructions 0FA3C1;[{ "Type": "Bt", "Operands": ["ecx", "eax"] }] 0FA3D9;[{ "Type": "Bt", "Operands": ["ecx", "ebx"] }] 0FA3CA;[{ "Type": "Bt", "Operands": ["edx", "ecx"] }] +0FA3E2;[{ "Type": "Bt", "Operands": ["edx", "esp"] }] +0FA3F6;[{ "Type": "Bt", "Operands": ["esi", "esi"] }] 0FA30425;[{ "Type": "Bt", "Operands": ["dword ptr [eax]", "eax"] }] 0FA30C25;[{ "Type": "Bt", "Operands": ["dword ptr [eax]", "ecx"] }] 0FA31425;[{ "Type": "Bt", "Operands": ["dword ptr [eax]", "edx"] }] 0FBA2005;[{ "Type": "Bt", "Operands": ["dword ptr [eax]", "0x05"] }] 0FBA2505;[{ "Type": "Bt", "Operands": ["dword ptr [ebp]", "0x05"] }] +0FBA2305;[{ "Type": "Bt", "Operands": ["dword ptr [ebx]", "0x05"] }] +0FBA2105;[{ "Type": "Bt", "Operands": ["dword ptr [ecx]", "0x05"] }] +0FBA2205;[{ "Type": "Bt", "Operands": ["dword ptr [edx]", "0x05"] }] # BTS - Bit Test and Set 0FABC1;[{ "Type": "Bts", "Operands": ["ecx", "eax"] }] 0FABD9;[{ "Type": "Bts", "Operands": ["ecx", "ebx"] }] 0FABCA;[{ "Type": "Bts", "Operands": ["edx", "ecx"] }] +0FABE2;[{ "Type": "Bts", "Operands": ["edx", "esp"] }] +0FABF6;[{ "Type": "Bts", "Operands": ["esi", "esi"] }] 0FAB0425;[{ "Type": "Bts", "Operands": ["dword ptr [eax]", "eax"] }] 0FAB0C25;[{ "Type": "Bts", "Operands": ["dword ptr [eax]", "ecx"] }] 0FAB1425;[{ "Type": "Bts", "Operands": ["dword ptr [eax]", "edx"] }] 0FBA2805;[{ "Type": "Bts", "Operands": ["dword ptr [eax]", "0x05"] }] 0FBA2D05;[{ "Type": "Bts", "Operands": ["dword ptr [ebp]", "0x05"] }] +0FBA2B05;[{ "Type": "Bts", "Operands": ["dword ptr [ebx]", "0x05"] }] +0FBA2905;[{ "Type": "Bts", "Operands": ["dword ptr [ecx]", "0x05"] }] +0FBA2A05;[{ "Type": "Bts", "Operands": ["dword ptr [edx]", "0x05"] }] # BTR - Bit Test and Reset 0FB3C1;[{ "Type": "Btr", "Operands": ["ecx", "eax"] }] 0FB3D9;[{ "Type": "Btr", "Operands": ["ecx", "ebx"] }] 0FB3CA;[{ "Type": "Btr", "Operands": ["edx", "ecx"] }] +0FB3E2;[{ "Type": "Btr", "Operands": ["edx", "esp"] }] +0FB3F6;[{ "Type": "Btr", "Operands": ["esi", "esi"] }] 0FB30425;[{ "Type": "Btr", "Operands": ["dword ptr [eax]", "eax"] }] 0FB30C25;[{ "Type": "Btr", "Operands": ["dword ptr [eax]", "ecx"] }] 0FB31425;[{ "Type": "Btr", "Operands": ["dword ptr [eax]", "edx"] }] 0FBA3005;[{ "Type": "Btr", "Operands": ["dword ptr [eax]", "0x05"] }] 0FBA3505;[{ "Type": "Btr", "Operands": ["dword ptr [ebp]", "0x05"] }] +0FBA3305;[{ "Type": "Btr", "Operands": ["dword ptr [ebx]", "0x05"] }] +0FBA3105;[{ "Type": "Btr", "Operands": ["dword ptr [ecx]", "0x05"] }] +0FBA3205;[{ "Type": "Btr", "Operands": ["dword ptr [edx]", "0x05"] }] # BTC - Bit Test and Complement 0FBBC1;[{ "Type": "Btc", "Operands": ["ecx", "eax"] }] 0FBBD9;[{ "Type": "Btc", "Operands": ["ecx", "ebx"] }] 0FBBCA;[{ "Type": "Btc", "Operands": ["edx", "ecx"] }] +0FBBE2;[{ "Type": "Btc", "Operands": ["edx", "esp"] }] +0FBBF6;[{ "Type": "Btc", "Operands": ["esi", "esi"] }] 0FBB0425;[{ "Type": "Btc", "Operands": ["dword ptr [eax]", "eax"] }] 0FBB0C25;[{ "Type": "Btc", "Operands": ["dword ptr [eax]", "ecx"] }] 0FBB1425;[{ "Type": "Btc", "Operands": ["dword ptr [eax]", "edx"] }] 0FBA3805;[{ "Type": "Btc", "Operands": ["dword ptr [eax]", "0x05"] }] 0FBA3D05;[{ "Type": "Btc", "Operands": ["dword ptr [ebp]", "0x05"] }] +0FBA3B05;[{ "Type": "Btc", "Operands": ["dword ptr [ebx]", "0x05"] }] +0FBA3905;[{ "Type": "Btc", "Operands": ["dword ptr [ecx]", "0x05"] }] +0FBA3A05;[{ "Type": "Btc", "Operands": ["dword ptr [edx]", "0x05"] }] # BSF - Bit Scan Forward 0FBCC1;[{ "Type": "Bsf", "Operands": ["eax", "ecx"] }] 0FBCD9;[{ "Type": "Bsf", "Operands": ["ebx", "ecx"] }] 0FBCCA;[{ "Type": "Bsf", "Operands": ["ecx", "edx"] }] +0FBCE2;[{ "Type": "Bsf", "Operands": ["esp", "edx"] }] +0FBCF6;[{ "Type": "Bsf", "Operands": ["esi", "esi"] }] 0FBC0425;[{ "Type": "Bsf", "Operands": ["eax", "dword ptr [eax]"] }] 0FBC0C25;[{ "Type": "Bsf", "Operands": ["ecx", "dword ptr [eax]"] }] 0FBC1425;[{ "Type": "Bsf", "Operands": ["edx", "dword ptr [eax]"] }] +0FBC1C25;[{ "Type": "Bsf", "Operands": ["ebx", "dword ptr [eax]"] }] +0FBC2425;[{ "Type": "Bsf", "Operands": ["esp", "dword ptr [eax]"] }] # BSR - Bit Scan Reverse 0FBDC1;[{ "Type": "Bsr", "Operands": ["eax", "ecx"] }] 0FBDD9;[{ "Type": "Bsr", "Operands": ["ebx", "ecx"] }] 0FBDCA;[{ "Type": "Bsr", "Operands": ["ecx", "edx"] }] +0FBDE2;[{ "Type": "Bsr", "Operands": ["esp", "edx"] }] +0FBDF6;[{ "Type": "Bsr", "Operands": ["esi", "esi"] }] 0FBD0425;[{ "Type": "Bsr", "Operands": ["eax", "dword ptr [eax]"] }] 0FBD0C25;[{ "Type": "Bsr", "Operands": ["ecx", "dword ptr [eax]"] }] 0FBD1425;[{ "Type": "Bsr", "Operands": ["edx", "dword ptr [eax]"] }] +0FBD1C25;[{ "Type": "Bsr", "Operands": ["ebx", "dword ptr [eax]"] }] +0FBD2425;[{ "Type": "Bsr", "Operands": ["esp", "dword ptr [eax]"] }] diff --git a/X86DisassemblerTests/TestData/call_tests.csv b/X86DisassemblerTests/TestData/call_tests.csv index 7a97a45..4a5ec73 100644 --- a/X86DisassemblerTests/TestData/call_tests.csv +++ b/X86DisassemblerTests/TestData/call_tests.csv @@ -5,6 +5,8 @@ RawBytes;Instructions # CALL rel32 (opcode E8) E810000000;[{ "Type": "Call", "Operands": ["0x00000015"] }] E8FEFFFFFF;[{ "Type": "Call", "Operands": ["0x00000003"] }] +E800000000;[{ "Type": "Call", "Operands": ["0x00000005"] }] +E8FFFFFFFF;[{ "Type": "Call", "Operands": ["0x00000004"] }] # CALL r/m32 (opcode FF /2) with register operands FFD0;[{ "Type": "Call", "Operands": ["eax"] }] @@ -55,9 +57,14 @@ FF1C;[{ "Type": "Call", "Operands": ["fword ptr [esp]"] }] FF1D;[{ "Type": "Call", "Operands": ["fword ptr [ebp]"] }] FF1E;[{ "Type": "Call", "Operands": ["fword ptr [esi]"] }] FF1F;[{ "Type": "Call", "Operands": ["fword ptr [edi]"] }] +FF18;[{ "Type": "Call", "Operands": ["fword ptr [eax]"] }] +FF19;[{ "Type": "Call", "Operands": ["fword ptr [ecx]"] }] +FF1A;[{ "Type": "Call", "Operands": ["fword ptr [edx]"] }] +FF1B;[{ "Type": "Call", "Operands": ["fword ptr [ebx]"] }] # CALL m32 (opcode FF /2) with direct memory operand FF1578563412;[{ "Type": "Call", "Operands": ["dword ptr [0x12345678]"] }] +FF1534127856;[{ "Type": "Call", "Operands": ["dword ptr [0x56781234]"] }] # CALL m32 (opcode FF /2) with segment override prefixes 26FF5510;[{ "Type": "Call", "Operands": ["dword ptr es:[ebp+0x10]"] }] diff --git a/X86DisassemblerTests/TestData/cmp_tests.csv b/X86DisassemblerTests/TestData/cmp_tests.csv index ddb7162..f4ad505 100644 --- a/X86DisassemblerTests/TestData/cmp_tests.csv +++ b/X86DisassemblerTests/TestData/cmp_tests.csv @@ -4,22 +4,56 @@ RawBytes;Instructions # CMP r/m8, imm8 (opcode 80 /7) 80F842;[{ "Type": "Cmp", "Operands": ["al", "0x42"] }] +80FB42;[{ "Type": "Cmp", "Operands": ["bl", "0x42"] }] +80F942;[{ "Type": "Cmp", "Operands": ["cl", "0x42"] }] +80FA42;[{ "Type": "Cmp", "Operands": ["dl", "0x42"] }] + +# CMP AL, imm8 (opcode 3C) +3C42;[{ "Type": "Cmp", "Operands": ["al", "0x42"] }] # CMP r/m32, imm32 (opcode 81 /7) 81F878563412;[{ "Type": "Cmp", "Operands": ["eax", "0x12345678"] }] +81FB78563412;[{ "Type": "Cmp", "Operands": ["ebx", "0x12345678"] }] +81F978563412;[{ "Type": "Cmp", "Operands": ["ecx", "0x12345678"] }] +81FA78563412;[{ "Type": "Cmp", "Operands": ["edx", "0x12345678"] }] + +# CMP EAX, imm32 (opcode 3D) +3D78563412;[{ "Type": "Cmp", "Operands": ["eax", "0x12345678"] }] # CMP r/m32, imm8 (opcode 83 /7) 83F842;[{ "Type": "Cmp", "Operands": ["eax", "0x42"] }] +83FB42;[{ "Type": "Cmp", "Operands": ["ebx", "0x42"] }] +83F942;[{ "Type": "Cmp", "Operands": ["ecx", "0x42"] }] +83FA42;[{ "Type": "Cmp", "Operands": ["edx", "0x42"] }] -# CMP with memory operands -813C2578563412;[{ "Type": "Cmp", "Operands": ["dword ptr [eax]", "0x12345678"] }] +# CMP r/m8, r8 (opcode 38) +38C3;[{ "Type": "Cmp", "Operands": ["bl", "al"] }] +38D9;[{ "Type": "Cmp", "Operands": ["cl", "bl"] }] +38E2;[{ "Type": "Cmp", "Operands": ["dl", "ah"] }] + +# CMP r8, r/m8 (opcode 3A) +3AC3;[{ "Type": "Cmp", "Operands": ["al", "bl"] }] +3AD9;[{ "Type": "Cmp", "Operands": ["bl", "cl"] }] +3AE2;[{ "Type": "Cmp", "Operands": ["ah", "dl"] }] # CMP r/m32, r32 (opcode 39) 39D8;[{ "Type": "Cmp", "Operands": ["eax", "ebx"] }] 39CA;[{ "Type": "Cmp", "Operands": ["edx", "ecx"] }] +39E5;[{ "Type": "Cmp", "Operands": ["ebp", "esp"] }] 394B10;[{ "Type": "Cmp", "Operands": ["dword ptr [ebx+0x10]", "ecx"] }] # CMP r32, r/m32 (opcode 3B) 3BD8;[{ "Type": "Cmp", "Operands": ["ebx", "eax"] }] 3BCA;[{ "Type": "Cmp", "Operands": ["ecx", "edx"] }] +3BE5;[{ "Type": "Cmp", "Operands": ["esp", "ebp"] }] 3B4B10;[{ "Type": "Cmp", "Operands": ["ecx", "dword ptr [ebx+0x10]"] }] + +# CMP with memory operands +8004251000000042;[{ "Type": "Cmp", "Operands": ["byte ptr [0x10]", "0x42"] }] +813C2578563412;[{ "Type": "Cmp", "Operands": ["dword ptr [eax]", "0x12345678"] }] +8104251000000078563412;[{ "Type": "Cmp", "Operands": ["dword ptr [0x10]", "0x12345678"] }] +8304251000000042;[{ "Type": "Cmp", "Operands": ["dword ptr [0x10]", "0x42"] }] +3804251000000000;[{ "Type": "Cmp", "Operands": ["byte ptr [0x10]", "al"] }] +3A04251000000000;[{ "Type": "Cmp", "Operands": ["al", "byte ptr [0x10]"] }] +3904251000000000;[{ "Type": "Cmp", "Operands": ["dword ptr [0x10]", "eax"] }] +3B04251000000000;[{ "Type": "Cmp", "Operands": ["eax", "dword ptr [0x10]"] }]