fork download
  1. #!/usr/bin/env python
  2. # -*- coding: UTF-8 -*-
  3.  
  4. table = [
  5. 0x80, 0x84, 0x80, 0x84, 0x80, 0x84, 0x80, 0x84,
  6. 0x80, 0x88, 0x80, 0x88, 0x80, 0x88, 0x80, 0x88,
  7. 0x8c, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b,
  8. 0x90, 0x94, 0x98, 0x8b, 0x9c, 0x9c, 0x9c, 0x9c,
  9. 0xa0, 0x80, 0x80, 0x80, 0x8b, 0x8b, 0xa4, 0x8b,
  10. 0xa8, 0x8b, 0x84, 0x8b, 0xac, 0xac, 0xa8, 0xa8,
  11. 0xb0, 0xb4, 0xb8, 0xbc, 0x80, 0xc0, 0x80, 0x80,
  12. 0x9c, 0xac, 0xc4, 0x8b, 0xc8, 0x90, 0x8b, 0x90,
  13. 0x80, 0x8b, 0x8b, 0xcc, 0x80, 0x80, 0xd0, 0x8b,
  14. 0x80, 0xd4, 0x80, 0x80, 0x8b, 0x8b, 0x8b, 0x8b,
  15. 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80,
  16. 0x80, 0x80, 0x80, 0x80, 0xd8, 0xdc, 0x8b, 0x80,
  17. 0xe0, 0xe0, 0xe0, 0xe0, 0x80, 0x80, 0x80, 0x80,
  18. 0x8f, 0xcf, 0x8f, 0xdb, 0x80, 0x80, 0xe4, 0x80,
  19. 0xe8, 0xd9, 0x8b, 0x8b, 0x80, 0x80, 0x80, 0x80,
  20. 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0xdc,
  21. 0x08, 0x08, 0x08, 0x08, 0x01, 0x10, 0x00, 0x00,
  22. 0x01, 0x10, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00,
  23. 0x00, 0x00, 0x08, 0x08, 0x20, 0x20, 0x20, 0x20,
  24. 0x10, 0x18, 0x01, 0x09, 0x81, 0x81, 0x81, 0x81,
  25. 0x09, 0x18, 0x09, 0x09, 0x00, 0x00, 0x12, 0x00,
  26. 0x10, 0x10, 0x10, 0x10, 0x01, 0x01, 0x01, 0x01,
  27. 0x09, 0x09, 0x02, 0x00, 0x08, 0x08, 0x09, 0x18,
  28. 0x03, 0x00, 0x02, 0x00, 0x00, 0x01, 0x00, 0x00,
  29. 0x01, 0x01, 0x00, 0x00, 0x50, 0x50, 0x12, 0x81,
  30. 0x20, 0x00, 0x20, 0x20, 0x00, 0x08, 0x00, 0x09,
  31. 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x08, 0x00,
  32. 0x09, 0x09, 0x09, 0x09, 0x08, 0x08, 0x08, 0x00,
  33. 0x50, 0x50, 0x50, 0x50, 0x00, 0x00, 0x09, 0x08,
  34. 0x08, 0x08, 0x09, 0x08,
  35. ]
  36.  
  37. def print_unpacked_table(t):
  38. feature_names = ['imm8', 'imm16', 'imm32', 'modrm', '66-67', 'is_prefix', 'rel32', 'rel8']
  39. for opcode, flags in enumerate(t):
  40. print('Opcode {}{:02x}: '.format('0f ' if opcode >= 0x100 else '', opcode & 0xff), end='')
  41. features = [name for i, name in enumerate(feature_names) if flags & (1 << i)]
  42. print(', '.join(features) if len(features) else '<none>')
  43.  
  44. full_table = []
  45.  
  46. for opcode in range(0x200):
  47. index = table[opcode >> 2] + (opcode & 3)
  48. flags = table[index]
  49. full_table.append(flags)
  50.  
  51. print_unpacked_table(full_table)
  52.  
  53. print('Repacking table...')
  54.  
  55. indices = []
  56. flagdata = bytearray()
  57.  
  58. for index, group in enumerate(zip(*([iter(full_table)] * 4))):
  59. group = bytes(group)
  60. pos = flagdata.find(group)
  61. if pos == -1:
  62. pos = len(flagdata)
  63. flagdata.extend(group)
  64. indices.append(pos)
  65.  
  66. # Fix indices and concat flags.
  67. result = bytes(map(lambda x: x + len(indices), indices)) + bytes(flagdata)
  68.  
  69. print('Built the same table? {}'.format(bytes(table) == result))
  70.  
Success #stdin #stdout 0.02s 27728KB
stdin
Standard input is empty
stdout
Opcode 00: modrm
Opcode 01: modrm
Opcode 02: modrm
Opcode 03: modrm
Opcode 04: imm8
Opcode 05: 66-67
Opcode 06: <none>
Opcode 07: <none>
Opcode 08: modrm
Opcode 09: modrm
Opcode 0a: modrm
Opcode 0b: modrm
Opcode 0c: imm8
Opcode 0d: 66-67
Opcode 0e: <none>
Opcode 0f: <none>
Opcode 10: modrm
Opcode 11: modrm
Opcode 12: modrm
Opcode 13: modrm
Opcode 14: imm8
Opcode 15: 66-67
Opcode 16: <none>
Opcode 17: <none>
Opcode 18: modrm
Opcode 19: modrm
Opcode 1a: modrm
Opcode 1b: modrm
Opcode 1c: imm8
Opcode 1d: 66-67
Opcode 1e: <none>
Opcode 1f: <none>
Opcode 20: modrm
Opcode 21: modrm
Opcode 22: modrm
Opcode 23: modrm
Opcode 24: imm8
Opcode 25: 66-67
Opcode 26: is_prefix
Opcode 27: <none>
Opcode 28: modrm
Opcode 29: modrm
Opcode 2a: modrm
Opcode 2b: modrm
Opcode 2c: imm8
Opcode 2d: 66-67
Opcode 2e: is_prefix
Opcode 2f: <none>
Opcode 30: modrm
Opcode 31: modrm
Opcode 32: modrm
Opcode 33: modrm
Opcode 34: imm8
Opcode 35: 66-67
Opcode 36: is_prefix
Opcode 37: <none>
Opcode 38: modrm
Opcode 39: modrm
Opcode 3a: modrm
Opcode 3b: modrm
Opcode 3c: imm8
Opcode 3d: 66-67
Opcode 3e: is_prefix
Opcode 3f: <none>
Opcode 40: <none>
Opcode 41: <none>
Opcode 42: <none>
Opcode 43: <none>
Opcode 44: <none>
Opcode 45: <none>
Opcode 46: <none>
Opcode 47: <none>
Opcode 48: <none>
Opcode 49: <none>
Opcode 4a: <none>
Opcode 4b: <none>
Opcode 4c: <none>
Opcode 4d: <none>
Opcode 4e: <none>
Opcode 4f: <none>
Opcode 50: <none>
Opcode 51: <none>
Opcode 52: <none>
Opcode 53: <none>
Opcode 54: <none>
Opcode 55: <none>
Opcode 56: <none>
Opcode 57: <none>
Opcode 58: <none>
Opcode 59: <none>
Opcode 5a: <none>
Opcode 5b: <none>
Opcode 5c: <none>
Opcode 5d: <none>
Opcode 5e: <none>
Opcode 5f: <none>
Opcode 60: <none>
Opcode 61: <none>
Opcode 62: modrm
Opcode 63: modrm
Opcode 64: is_prefix
Opcode 65: is_prefix
Opcode 66: is_prefix
Opcode 67: is_prefix
Opcode 68: 66-67
Opcode 69: modrm, 66-67
Opcode 6a: imm8
Opcode 6b: imm8, modrm
Opcode 6c: <none>
Opcode 6d: <none>
Opcode 6e: <none>
Opcode 6f: <none>
Opcode 70: imm8, rel8
Opcode 71: imm8, rel8
Opcode 72: imm8, rel8
Opcode 73: imm8, rel8
Opcode 74: imm8, rel8
Opcode 75: imm8, rel8
Opcode 76: imm8, rel8
Opcode 77: imm8, rel8
Opcode 78: imm8, rel8
Opcode 79: imm8, rel8
Opcode 7a: imm8, rel8
Opcode 7b: imm8, rel8
Opcode 7c: imm8, rel8
Opcode 7d: imm8, rel8
Opcode 7e: imm8, rel8
Opcode 7f: imm8, rel8
Opcode 80: imm8, modrm
Opcode 81: modrm, 66-67
Opcode 82: imm8, modrm
Opcode 83: imm8, modrm
Opcode 84: modrm
Opcode 85: modrm
Opcode 86: modrm
Opcode 87: modrm
Opcode 88: modrm
Opcode 89: modrm
Opcode 8a: modrm
Opcode 8b: modrm
Opcode 8c: modrm
Opcode 8d: modrm
Opcode 8e: modrm
Opcode 8f: modrm
Opcode 90: <none>
Opcode 91: <none>
Opcode 92: <none>
Opcode 93: <none>
Opcode 94: <none>
Opcode 95: <none>
Opcode 96: <none>
Opcode 97: <none>
Opcode 98: <none>
Opcode 99: <none>
Opcode 9a: imm16, 66-67
Opcode 9b: <none>
Opcode 9c: <none>
Opcode 9d: <none>
Opcode 9e: <none>
Opcode 9f: <none>
Opcode a0: 66-67
Opcode a1: 66-67
Opcode a2: 66-67
Opcode a3: 66-67
Opcode a4: <none>
Opcode a5: <none>
Opcode a6: <none>
Opcode a7: <none>
Opcode a8: imm8
Opcode a9: 66-67
Opcode aa: <none>
Opcode ab: <none>
Opcode ac: <none>
Opcode ad: <none>
Opcode ae: <none>
Opcode af: <none>
Opcode b0: imm8
Opcode b1: imm8
Opcode b2: imm8
Opcode b3: imm8
Opcode b4: imm8
Opcode b5: imm8
Opcode b6: imm8
Opcode b7: imm8
Opcode b8: 66-67
Opcode b9: 66-67
Opcode ba: 66-67
Opcode bb: 66-67
Opcode bc: 66-67
Opcode bd: 66-67
Opcode be: 66-67
Opcode bf: 66-67
Opcode c0: imm8, modrm
Opcode c1: imm8, modrm
Opcode c2: imm16
Opcode c3: <none>
Opcode c4: modrm
Opcode c5: modrm
Opcode c6: imm8, modrm
Opcode c7: modrm, 66-67
Opcode c8: imm8, imm16
Opcode c9: <none>
Opcode ca: imm16
Opcode cb: <none>
Opcode cc: <none>
Opcode cd: imm8
Opcode ce: <none>
Opcode cf: <none>
Opcode d0: modrm
Opcode d1: modrm
Opcode d2: modrm
Opcode d3: modrm
Opcode d4: imm8
Opcode d5: imm8
Opcode d6: <none>
Opcode d7: <none>
Opcode d8: modrm
Opcode d9: modrm
Opcode da: modrm
Opcode db: modrm
Opcode dc: modrm
Opcode dd: modrm
Opcode de: modrm
Opcode df: modrm
Opcode e0: imm8, rel8
Opcode e1: imm8, rel8
Opcode e2: imm8, rel8
Opcode e3: imm8, rel8
Opcode e4: imm8
Opcode e5: imm8
Opcode e6: imm8
Opcode e7: imm8
Opcode e8: 66-67, rel32
Opcode e9: 66-67, rel32
Opcode ea: imm16, 66-67
Opcode eb: imm8, rel8
Opcode ec: <none>
Opcode ed: <none>
Opcode ee: <none>
Opcode ef: <none>
Opcode f0: is_prefix
Opcode f1: <none>
Opcode f2: is_prefix
Opcode f3: is_prefix
Opcode f4: <none>
Opcode f5: <none>
Opcode f6: modrm
Opcode f7: modrm
Opcode f8: <none>
Opcode f9: <none>
Opcode fa: <none>
Opcode fb: <none>
Opcode fc: <none>
Opcode fd: <none>
Opcode fe: modrm
Opcode ff: modrm
Opcode 0f 00: modrm
Opcode 0f 01: modrm
Opcode 0f 02: modrm
Opcode 0f 03: modrm
Opcode 0f 04: <none>
Opcode 0f 05: <none>
Opcode 0f 06: <none>
Opcode 0f 07: <none>
Opcode 0f 08: <none>
Opcode 0f 09: <none>
Opcode 0f 0a: <none>
Opcode 0f 0b: <none>
Opcode 0f 0c: <none>
Opcode 0f 0d: modrm
Opcode 0f 0e: <none>
Opcode 0f 0f: imm8, modrm
Opcode 0f 10: modrm
Opcode 0f 11: modrm
Opcode 0f 12: modrm
Opcode 0f 13: modrm
Opcode 0f 14: modrm
Opcode 0f 15: modrm
Opcode 0f 16: modrm
Opcode 0f 17: modrm
Opcode 0f 18: modrm
Opcode 0f 19: <none>
Opcode 0f 1a: <none>
Opcode 0f 1b: <none>
Opcode 0f 1c: <none>
Opcode 0f 1d: <none>
Opcode 0f 1e: <none>
Opcode 0f 1f: <none>
Opcode 0f 20: modrm
Opcode 0f 21: modrm
Opcode 0f 22: modrm
Opcode 0f 23: modrm
Opcode 0f 24: modrm
Opcode 0f 25: <none>
Opcode 0f 26: modrm
Opcode 0f 27: <none>
Opcode 0f 28: modrm
Opcode 0f 29: modrm
Opcode 0f 2a: modrm
Opcode 0f 2b: modrm
Opcode 0f 2c: modrm
Opcode 0f 2d: modrm
Opcode 0f 2e: modrm
Opcode 0f 2f: modrm
Opcode 0f 30: <none>
Opcode 0f 31: <none>
Opcode 0f 32: <none>
Opcode 0f 33: <none>
Opcode 0f 34: <none>
Opcode 0f 35: <none>
Opcode 0f 36: <none>
Opcode 0f 37: <none>
Opcode 0f 38: <none>
Opcode 0f 39: <none>
Opcode 0f 3a: <none>
Opcode 0f 3b: <none>
Opcode 0f 3c: <none>
Opcode 0f 3d: <none>
Opcode 0f 3e: <none>
Opcode 0f 3f: <none>
Opcode 0f 40: modrm
Opcode 0f 41: modrm
Opcode 0f 42: modrm
Opcode 0f 43: modrm
Opcode 0f 44: modrm
Opcode 0f 45: modrm
Opcode 0f 46: modrm
Opcode 0f 47: modrm
Opcode 0f 48: modrm
Opcode 0f 49: modrm
Opcode 0f 4a: modrm
Opcode 0f 4b: modrm
Opcode 0f 4c: modrm
Opcode 0f 4d: modrm
Opcode 0f 4e: modrm
Opcode 0f 4f: modrm
Opcode 0f 50: modrm
Opcode 0f 51: modrm
Opcode 0f 52: modrm
Opcode 0f 53: modrm
Opcode 0f 54: modrm
Opcode 0f 55: modrm
Opcode 0f 56: modrm
Opcode 0f 57: modrm
Opcode 0f 58: modrm
Opcode 0f 59: modrm
Opcode 0f 5a: modrm
Opcode 0f 5b: modrm
Opcode 0f 5c: modrm
Opcode 0f 5d: modrm
Opcode 0f 5e: modrm
Opcode 0f 5f: modrm
Opcode 0f 60: modrm
Opcode 0f 61: modrm
Opcode 0f 62: modrm
Opcode 0f 63: modrm
Opcode 0f 64: modrm
Opcode 0f 65: modrm
Opcode 0f 66: modrm
Opcode 0f 67: modrm
Opcode 0f 68: modrm
Opcode 0f 69: modrm
Opcode 0f 6a: modrm
Opcode 0f 6b: modrm
Opcode 0f 6c: modrm
Opcode 0f 6d: modrm
Opcode 0f 6e: modrm
Opcode 0f 6f: modrm
Opcode 0f 70: imm8, modrm
Opcode 0f 71: imm8, modrm
Opcode 0f 72: imm8, modrm
Opcode 0f 73: imm8, modrm
Opcode 0f 74: modrm
Opcode 0f 75: modrm
Opcode 0f 76: modrm
Opcode 0f 77: <none>
Opcode 0f 78: <none>
Opcode 0f 79: <none>
Opcode 0f 7a: <none>
Opcode 0f 7b: <none>
Opcode 0f 7c: modrm
Opcode 0f 7d: modrm
Opcode 0f 7e: modrm
Opcode 0f 7f: modrm
Opcode 0f 80: 66-67, rel32
Opcode 0f 81: 66-67, rel32
Opcode 0f 82: 66-67, rel32
Opcode 0f 83: 66-67, rel32
Opcode 0f 84: 66-67, rel32
Opcode 0f 85: 66-67, rel32
Opcode 0f 86: 66-67, rel32
Opcode 0f 87: 66-67, rel32
Opcode 0f 88: 66-67, rel32
Opcode 0f 89: 66-67, rel32
Opcode 0f 8a: 66-67, rel32
Opcode 0f 8b: 66-67, rel32
Opcode 0f 8c: 66-67, rel32
Opcode 0f 8d: 66-67, rel32
Opcode 0f 8e: 66-67, rel32
Opcode 0f 8f: 66-67, rel32
Opcode 0f 90: modrm
Opcode 0f 91: modrm
Opcode 0f 92: modrm
Opcode 0f 93: modrm
Opcode 0f 94: modrm
Opcode 0f 95: modrm
Opcode 0f 96: modrm
Opcode 0f 97: modrm
Opcode 0f 98: modrm
Opcode 0f 99: modrm
Opcode 0f 9a: modrm
Opcode 0f 9b: modrm
Opcode 0f 9c: modrm
Opcode 0f 9d: modrm
Opcode 0f 9e: modrm
Opcode 0f 9f: modrm
Opcode 0f a0: <none>
Opcode 0f a1: <none>
Opcode 0f a2: <none>
Opcode 0f a3: modrm
Opcode 0f a4: imm8, modrm
Opcode 0f a5: modrm
Opcode 0f a6: <none>
Opcode 0f a7: <none>
Opcode 0f a8: <none>
Opcode 0f a9: <none>
Opcode 0f aa: <none>
Opcode 0f ab: modrm
Opcode 0f ac: imm8, modrm
Opcode 0f ad: modrm
Opcode 0f ae: modrm
Opcode 0f af: modrm
Opcode 0f b0: modrm
Opcode 0f b1: modrm
Opcode 0f b2: modrm
Opcode 0f b3: modrm
Opcode 0f b4: modrm
Opcode 0f b5: modrm
Opcode 0f b6: modrm
Opcode 0f b7: modrm
Opcode 0f b8: <none>
Opcode 0f b9: <none>
Opcode 0f ba: imm8, modrm
Opcode 0f bb: modrm
Opcode 0f bc: modrm
Opcode 0f bd: modrm
Opcode 0f be: modrm
Opcode 0f bf: modrm
Opcode 0f c0: modrm
Opcode 0f c1: modrm
Opcode 0f c2: imm8, modrm
Opcode 0f c3: modrm
Opcode 0f c4: imm8, modrm
Opcode 0f c5: imm8, modrm
Opcode 0f c6: imm8, modrm
Opcode 0f c7: modrm
Opcode 0f c8: <none>
Opcode 0f c9: <none>
Opcode 0f ca: <none>
Opcode 0f cb: <none>
Opcode 0f cc: <none>
Opcode 0f cd: <none>
Opcode 0f ce: <none>
Opcode 0f cf: <none>
Opcode 0f d0: modrm
Opcode 0f d1: modrm
Opcode 0f d2: modrm
Opcode 0f d3: modrm
Opcode 0f d4: modrm
Opcode 0f d5: modrm
Opcode 0f d6: modrm
Opcode 0f d7: modrm
Opcode 0f d8: modrm
Opcode 0f d9: modrm
Opcode 0f da: modrm
Opcode 0f db: modrm
Opcode 0f dc: modrm
Opcode 0f dd: modrm
Opcode 0f de: modrm
Opcode 0f df: modrm
Opcode 0f e0: modrm
Opcode 0f e1: modrm
Opcode 0f e2: modrm
Opcode 0f e3: modrm
Opcode 0f e4: modrm
Opcode 0f e5: modrm
Opcode 0f e6: modrm
Opcode 0f e7: modrm
Opcode 0f e8: modrm
Opcode 0f e9: modrm
Opcode 0f ea: modrm
Opcode 0f eb: modrm
Opcode 0f ec: modrm
Opcode 0f ed: modrm
Opcode 0f ee: modrm
Opcode 0f ef: modrm
Opcode 0f f0: modrm
Opcode 0f f1: modrm
Opcode 0f f2: modrm
Opcode 0f f3: modrm
Opcode 0f f4: modrm
Opcode 0f f5: modrm
Opcode 0f f6: modrm
Opcode 0f f7: modrm
Opcode 0f f8: modrm
Opcode 0f f9: modrm
Opcode 0f fa: modrm
Opcode 0f fb: modrm
Opcode 0f fc: modrm
Opcode 0f fd: modrm
Opcode 0f fe: modrm
Opcode 0f ff: <none>
Repacking table...
Built the same table? True