Add some test cases for ModRM decoding

This commit is contained in:
Alexis Engelke
2019-02-24 10:10:02 +01:00
parent dfd70eef39
commit 83988828ec
3 changed files with 37 additions and 1 deletions

View File

@@ -15,6 +15,7 @@ endif
testcases = [ testcases = [
['prefixes', 'prefixes.txt'], ['prefixes', 'prefixes.txt'],
['modrm', 'modrm.txt'],
['enter', 'decode-enter.sh'], ['enter', 'decode-enter.sh'],
['imul', 'decode-imul.sh'], ['imul', 'decode-imul.sh'],

34
tests/modrm.txt Normal file
View File

@@ -0,0 +1,34 @@
# reg
decode 01c0 [ADD reg4:r0 reg4:r0]
decode 01c1 [ADD reg4:r1 reg4:r0]
decode 01d0 [ADD reg4:r0 reg4:r2]
decode 01ff [ADD reg4:r7 reg4:r7]
decode64 4101d0 [ADD reg4:r8 reg4:r2]
decode64 4501d0 [ADD reg4:r8 reg4:r10]
decode64 4501ff [ADD reg4:r15 reg4:r15]
# [reg]
decode 0100 [ADD mem4:r0 reg4:r0]
decode 0108 [ADD mem4:r0 reg4:r1]
decode 0101 [ADD mem4:r1 reg4:r0]
decode 0107 [ADD mem4:r7 reg4:r0]
decode 0138 [ADD mem4:r0 reg4:r7]
decode 010424 [ADD mem4:r4 reg4:r0]
decode64 410100 [ADD mem4:r8 reg4:r0]
decode64 440108 [ADD mem4:r0 reg4:r9]
decode64 450100 [ADD mem4:r8 reg4:r8]
decode64 410107 [ADD mem4:r15 reg4:r0]
decode64 41010424 [ADD mem4:r12 reg4:r0]
# [disp32]
decode32 010501000000 [ADD mem4:0x1 reg4:r0]
decode32 0105ffffffff [ADD mem4:-0x1 reg4:r0]
decode 01042501000000 [ADD mem4:0x1 reg4:r0]
decode64 4101042501000000 [ADD mem4:0x1 reg4:r0]
# [rip+disp32]
decode64 010501000000 [ADD mem4:r16+0x1 reg4:r0]
decode64 41010501000000 [ADD mem4:r16+0x1 reg4:r0]
# [reg+disp32]
decode 018001000000 [ADD mem4:r0+0x1 reg4:r0]
# [reg+eiz+disp32]
decode 01842501000000 [ADD mem4:r5+0x1 reg4:r0]
# [reg+s*reg+disp32]
decode64 4201842501000000 [ADD mem4:r5+1*r12+0x1 reg4:r0]

View File

@@ -41,7 +41,8 @@ if __name__ == "__main__":
test_modes = frozenset(args.test_modes if args.test_modes else [32, 64]) test_modes = frozenset(args.test_modes if args.test_modes else [32, 64])
for file in args.cases: for file in args.cases:
cases = [tuple(ln.strip().split(maxsplit=2)) for ln in file.readlines()] cases = [tuple(ln.strip().split(maxsplit=2)) for ln in file.readlines()
if ln and ln[0] != "#"]
for op, code, expected in cases: for op, code, expected in cases:
case_modes = {"decode":{32,64},"decode32":{32},"decode64":{64}}[op] case_modes = {"decode":{32,64},"decode32":{32},"decode64":{64}}[op]
if not case_modes & test_modes: continue if not case_modes & test_modes: continue