#!/usr/bin/env python # -*- coding: UTF-8 -*- table = [ 0x80, 0x84, 0x80, 0x84, 0x80, 0x84, 0x80, 0x84, 0x80, 0x88, 0x80, 0x88, 0x80, 0x88, 0x80, 0x88, 0x8c, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x90, 0x94, 0x98, 0x8b, 0x9c, 0x9c, 0x9c, 0x9c, 0xa0, 0x80, 0x80, 0x80, 0x8b, 0x8b, 0xa4, 0x8b, 0xa8, 0x8b, 0x84, 0x8b, 0xac, 0xac, 0xa8, 0xa8, 0xb0, 0xb4, 0xb8, 0xbc, 0x80, 0xc0, 0x80, 0x80, 0x9c, 0xac, 0xc4, 0x8b, 0xc8, 0x90, 0x8b, 0x90, 0x80, 0x8b, 0x8b, 0xcc, 0x80, 0x80, 0xd0, 0x8b, 0x80, 0xd4, 0x80, 0x80, 0x8b, 0x8b, 0x8b, 0x8b, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0xd8, 0xdc, 0x8b, 0x80, 0xe0, 0xe0, 0xe0, 0xe0, 0x80, 0x80, 0x80, 0x80, 0x8f, 0xcf, 0x8f, 0xdb, 0x80, 0x80, 0xe4, 0x80, 0xe8, 0xd9, 0x8b, 0x8b, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0xdc, 0x08, 0x08, 0x08, 0x08, 0x01, 0x10, 0x00, 0x00, 0x01, 0x10, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x08, 0x20, 0x20, 0x20, 0x20, 0x10, 0x18, 0x01, 0x09, 0x81, 0x81, 0x81, 0x81, 0x09, 0x18, 0x09, 0x09, 0x00, 0x00, 0x12, 0x00, 0x10, 0x10, 0x10, 0x10, 0x01, 0x01, 0x01, 0x01, 0x09, 0x09, 0x02, 0x00, 0x08, 0x08, 0x09, 0x18, 0x03, 0x00, 0x02, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x50, 0x50, 0x12, 0x81, 0x20, 0x00, 0x20, 0x20, 0x00, 0x08, 0x00, 0x09, 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x08, 0x00, 0x09, 0x09, 0x09, 0x09, 0x08, 0x08, 0x08, 0x00, 0x50, 0x50, 0x50, 0x50, 0x00, 0x00, 0x09, 0x08, 0x08, 0x08, 0x09, 0x08, ] def print_unpacked_table(t): feature_names = ['imm8', 'imm16', 'imm32', 'modrm', '66-67', 'is_prefix', 'rel32', 'rel8'] for opcode, flags in enumerate(t): print('Opcode {}{:02x}: '.format('0f ' if opcode >= 0x100 else '', opcode & 0xff), end='') features = [name for i, name in enumerate(feature_names) if flags & (1 << i)] print(', '.join(features) if len(features) else '<none>') full_table = [] for opcode in range(0x200): index = table[opcode >> 2] + (opcode & 3) flags = table[index] full_table.append(flags) print_unpacked_table(full_table) print('Repacking table...') indices = [] flagdata = bytearray() for index, group in enumerate(zip(*([iter(full_table)] * 4))): group = bytes(group) pos = flagdata.find(group) if pos == -1: pos = len(flagdata) flagdata.extend(group) indices.append(pos) # Fix indices and concat flags. result = bytes(map(lambda x: x + len(indices), indices)) + bytes(flagdata) print('Built the same table? {}'.format(bytes(table) == result))
Standard input is empty
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