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