From c99e860a5e24406ee46b62c623a2b7f26347fdb7 Mon Sep 17 00:00:00 2001 From: Alexis Engelke Date: Fri, 2 Apr 2021 11:27:41 +0200 Subject: [PATCH] tests: Add few more encode/decode cases --- instrs.txt | 4 ++-- tests/test_decode.c | 4 ++++ tests/test_encode.c | 33 +++++++++++++++++++++++++++++++++ 3 files changed, 39 insertions(+), 2 deletions(-) diff --git a/instrs.txt b/instrs.txt index 963a7bd..74a3936 100644 --- a/instrs.txt +++ b/instrs.txt @@ -1363,8 +1363,8 @@ db/0m M MEM32 - - - FILD ENC_SEPSZ db/1m M MEM32 - - - FISTTP ENC_SEPSZ db/2m M MEM32 - - - FIST ENC_SEPSZ db/3m M MEM32 - - - FISTP ENC_SEPSZ -db/5m M FPU - - - FLD -db/7m M FPU - - - FSTP +db/5m M FPU - - - FLD ENC_SEPSZ +db/7m M FPU - - - FSTP ENC_SEPSZ db/0r M FPU - - - FCMOVNB db/1r M FPU - - - FCMOVNE db/2r M FPU - - - FCMOVNBE diff --git a/tests/test_decode.c b/tests/test_decode.c index 39d8e6a..7e2ec73 100644 --- a/tests/test_decode.c +++ b/tests/test_decode.c @@ -130,6 +130,7 @@ main(int argc, char** argv) TEST("\x0F\x01\xE2", "smsw edx"); TEST("\x66\x0F\x01\xE2", "smsw dx"); TEST64("\x66\x48\x0F\x01\xE2", "smsw rdx"); + TEST64("\xf2\x66\x0f\x01\x23", "smsw word ptr [rbx]"); TEST32("\x66\x0f\x20\x00", "mov eax, cr0"); // mod=0, 66h TEST64("\x66\x0f\x20\x00", "mov rax, cr0"); // mod=0, 66h TEST32("\xf3\x0f\x20\x00", "mov eax, cr0"); // REP @@ -155,6 +156,7 @@ main(int argc, char** argv) TEST64("\x41\xd8\xc1", "fadd st(0), st(1)"); // REX.B ignored TEST64("\xd9\xc9", "fxch st(1)"); TEST64("\xd9\xd0", "fnop"); + TEST("\xdf\xe0", "fstsw ax"); TEST64("\x41\xdf\xe0", "fstsw ax"); // ModRM Test cases @@ -226,6 +228,8 @@ main(int argc, char** argv) TEST("\x66\x6a\xff", "pushw 0xffff"); TEST32("\x6a\xff", "push 0xffffffff"); TEST64("\x6a\xff", "push 0xffffffffffffffff"); + TEST32("\x60", "pushad"); + TEST32("\x66\x60", "pushaw"); TEST("\xb0\xf0", "mov al, 0xf0"); TEST("\x66\xb8\xf0\xf0", "mov ax, 0xf0f0"); TEST("\xb8\xf0\xf0\xab\xff", "mov eax, 0xffabf0f0"); diff --git a/tests/test_encode.c b/tests/test_encode.c index ed29288..5baa65c 100644 --- a/tests/test_encode.c +++ b/tests/test_encode.c @@ -85,6 +85,18 @@ main(int argc, char** argv) TEST("\xff\x30", FE_PUSHm, FE_MEM(FE_AX, 0, 0, 0)); TEST("\xff\x31", FE_PUSHm, FE_MEM(FE_CX, 0, 0, 0)); TEST("\x9c", FE_PUSHF); + TEST("\x8c\xc0", FE_MOV_S2Grr, FE_AX, FE_ES); + TEST("\x8c\xc8", FE_MOV_S2Grr, FE_AX, FE_CS); + TEST("\x8c\xd0", FE_MOV_S2Grr, FE_AX, FE_SS); + TEST("\x8c\xd8", FE_MOV_S2Grr, FE_AX, FE_DS); + TEST("\x8c\xe0", FE_MOV_S2Grr, FE_AX, FE_FS); + TEST("\x8c\xe8", FE_MOV_S2Grr, FE_AX, FE_GS); + TEST("\x8e\xc0", FE_MOV_G2Srr, FE_ES, FE_AX); + // TEST("", FE_MOV_G2Srr, FE_CS, FE_AX); + TEST("\x8e\xd0", FE_MOV_G2Srr, FE_SS, FE_AX); + TEST("\x8e\xd8", FE_MOV_G2Srr, FE_DS, FE_AX); + TEST("\x8e\xe0", FE_MOV_G2Srr, FE_FS, FE_AX); + TEST("\x8e\xe8", FE_MOV_G2Srr, FE_GS, FE_AX); TEST("\xd2\xe4", FE_SHL8rr, FE_AH, FE_CX); TEST("", FE_SHL8rr, FE_AH, FE_DX); TEST("\xd0\xe0", FE_SHL8ri, FE_AX, 1); @@ -201,6 +213,27 @@ main(int argc, char** argv) TEST("", FE_MOV64ar, 0xfedcba9876543210, FE_CX); TEST("", FE_MOV64ar|FE_ADDR32, 0xfedcba98, FE_CX); + // Test FPU instructions + TEST("\xd8\x00", FE_FADDm32, FE_MEM(FE_AX, 0, 0, 0)); + TEST("\xdc\x00", FE_FADDm64, FE_MEM(FE_AX, 0, 0, 0)); + TEST("\xd8\xc0", FE_FADDrr, FE_ST0, FE_ST0); + TEST("\xd8\xc1", FE_FADDrr, FE_ST0, FE_ST1); + TEST("\xdc\xc1", FE_FADDrr, FE_ST1, FE_ST0); + TEST("", FE_FADDrr, FE_ST1, FE_ST1); + TEST("\xde\xc1", FE_FADDPrr, FE_ST1, FE_ST0); + TEST("\xda\x00", FE_FIADDm32, FE_MEM(FE_AX, 0, 0, 0)); + TEST("\xde\x00", FE_FIADDm16, FE_MEM(FE_AX, 0, 0, 0)); + TEST("\xd9\x00", FE_FLDm32, FE_MEM(FE_AX, 0, 0, 0)); + TEST("\xdd\x00", FE_FLDm64, FE_MEM(FE_AX, 0, 0, 0)); + TEST("\xdb\x28", FE_FLDm80, FE_MEM(FE_AX, 0, 0, 0)); + TEST("\xdf\x00", FE_FILDm16, FE_MEM(FE_AX, 0, 0, 0)); + TEST("\xdb\x00", FE_FILDm32, FE_MEM(FE_AX, 0, 0, 0)); + TEST("\xdf\x28", FE_FILDm64, FE_MEM(FE_AX, 0, 0, 0)); + TEST("\xd9\xc1", FE_FLDr, FE_ST1); + TEST("\xd9\xe8", FE_FLD1); + TEST("\xdf\xe0", FE_FSTSWr, FE_AX); + TEST("", FE_FSTSWr, FE_CX); + // Test VEX encoding TEST("\xc5\xfc\x77", FE_VZEROALL); TEST("\xc5\xf8\x77", FE_VZEROUPPER);