michael@0: // Copyright (c) 2012 The Chromium Authors. All rights reserved. michael@0: // Use of this source code is governed by a BSD-style license that can be michael@0: // found in the LICENSE file. michael@0: michael@0: // Table of relevant information about how to decode the ModR/M byte. michael@0: // Based on information in the IA-32 Intel Architecture michael@0: // Software Developer's Manual Volume 2: Instruction Set Reference. michael@0: michael@0: #include "sandbox/win/src/sidestep/mini_disassembler.h" michael@0: #include "sandbox/win/src/sidestep/mini_disassembler_types.h" michael@0: michael@0: namespace sidestep { michael@0: michael@0: const ModrmEntry MiniDisassembler::s_ia16_modrm_map_[] = { michael@0: // mod == 00 michael@0: /* r/m == 000 */ { false, false, OS_ZERO }, michael@0: /* r/m == 001 */ { false, false, OS_ZERO }, michael@0: /* r/m == 010 */ { false, false, OS_ZERO }, michael@0: /* r/m == 011 */ { false, false, OS_ZERO }, michael@0: /* r/m == 100 */ { false, false, OS_ZERO }, michael@0: /* r/m == 101 */ { false, false, OS_ZERO }, michael@0: /* r/m == 110 */ { true, false, OS_WORD }, michael@0: /* r/m == 111 */ { false, false, OS_ZERO }, michael@0: // mod == 01 michael@0: /* r/m == 000 */ { true, false, OS_BYTE }, michael@0: /* r/m == 001 */ { true, false, OS_BYTE }, michael@0: /* r/m == 010 */ { true, false, OS_BYTE }, michael@0: /* r/m == 011 */ { true, false, OS_BYTE }, michael@0: /* r/m == 100 */ { true, false, OS_BYTE }, michael@0: /* r/m == 101 */ { true, false, OS_BYTE }, michael@0: /* r/m == 110 */ { true, false, OS_BYTE }, michael@0: /* r/m == 111 */ { true, false, OS_BYTE }, michael@0: // mod == 10 michael@0: /* r/m == 000 */ { true, false, OS_WORD }, michael@0: /* r/m == 001 */ { true, false, OS_WORD }, michael@0: /* r/m == 010 */ { true, false, OS_WORD }, michael@0: /* r/m == 011 */ { true, false, OS_WORD }, michael@0: /* r/m == 100 */ { true, false, OS_WORD }, michael@0: /* r/m == 101 */ { true, false, OS_WORD }, michael@0: /* r/m == 110 */ { true, false, OS_WORD }, michael@0: /* r/m == 111 */ { true, false, OS_WORD }, michael@0: // mod == 11 michael@0: /* r/m == 000 */ { false, false, OS_ZERO }, michael@0: /* r/m == 001 */ { false, false, OS_ZERO }, michael@0: /* r/m == 010 */ { false, false, OS_ZERO }, michael@0: /* r/m == 011 */ { false, false, OS_ZERO }, michael@0: /* r/m == 100 */ { false, false, OS_ZERO }, michael@0: /* r/m == 101 */ { false, false, OS_ZERO }, michael@0: /* r/m == 110 */ { false, false, OS_ZERO }, michael@0: /* r/m == 111 */ { false, false, OS_ZERO } michael@0: }; michael@0: michael@0: const ModrmEntry MiniDisassembler::s_ia32_modrm_map_[] = { michael@0: // mod == 00 michael@0: /* r/m == 000 */ { false, false, OS_ZERO }, michael@0: /* r/m == 001 */ { false, false, OS_ZERO }, michael@0: /* r/m == 010 */ { false, false, OS_ZERO }, michael@0: /* r/m == 011 */ { false, false, OS_ZERO }, michael@0: /* r/m == 100 */ { false, true, OS_ZERO }, michael@0: /* r/m == 101 */ { true, false, OS_DOUBLE_WORD }, michael@0: /* r/m == 110 */ { false, false, OS_ZERO }, michael@0: /* r/m == 111 */ { false, false, OS_ZERO }, michael@0: // mod == 01 michael@0: /* r/m == 000 */ { true, false, OS_BYTE }, michael@0: /* r/m == 001 */ { true, false, OS_BYTE }, michael@0: /* r/m == 010 */ { true, false, OS_BYTE }, michael@0: /* r/m == 011 */ { true, false, OS_BYTE }, michael@0: /* r/m == 100 */ { true, true, OS_BYTE }, michael@0: /* r/m == 101 */ { true, false, OS_BYTE }, michael@0: /* r/m == 110 */ { true, false, OS_BYTE }, michael@0: /* r/m == 111 */ { true, false, OS_BYTE }, michael@0: // mod == 10 michael@0: /* r/m == 000 */ { true, false, OS_DOUBLE_WORD }, michael@0: /* r/m == 001 */ { true, false, OS_DOUBLE_WORD }, michael@0: /* r/m == 010 */ { true, false, OS_DOUBLE_WORD }, michael@0: /* r/m == 011 */ { true, false, OS_DOUBLE_WORD }, michael@0: /* r/m == 100 */ { true, true, OS_DOUBLE_WORD }, michael@0: /* r/m == 101 */ { true, false, OS_DOUBLE_WORD }, michael@0: /* r/m == 110 */ { true, false, OS_DOUBLE_WORD }, michael@0: /* r/m == 111 */ { true, false, OS_DOUBLE_WORD }, michael@0: // mod == 11 michael@0: /* r/m == 000 */ { false, false, OS_ZERO }, michael@0: /* r/m == 001 */ { false, false, OS_ZERO }, michael@0: /* r/m == 010 */ { false, false, OS_ZERO }, michael@0: /* r/m == 011 */ { false, false, OS_ZERO }, michael@0: /* r/m == 100 */ { false, false, OS_ZERO }, michael@0: /* r/m == 101 */ { false, false, OS_ZERO }, michael@0: /* r/m == 110 */ { false, false, OS_ZERO }, michael@0: /* r/m == 111 */ { false, false, OS_ZERO }, michael@0: }; michael@0: michael@0: }; // namespace sidestep