15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Copyright (c) 2007, Google Inc. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * All rights reserved. 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Redistribution and use in source and binary forms, with or without 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * modification, are permitted provided that the following conditions are 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * met: 72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * 82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * * Redistributions of source code must retain the above copyright 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * notice, this list of conditions and the following disclaimer. 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * * Redistributions in binary form must reproduce the above 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * copyright notice, this list of conditions and the following disclaimer 122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * in the documentation and/or other materials provided with the 132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * distribution. 14c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) * * Neither the name of Google Inc. nor the names of its 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * contributors may be used to endorse or promote products derived from 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * this software without specific prior written permission. 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 19c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 2090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 2690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 2790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 2890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 2990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) * 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * --- 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Author: Joi Sigurdsson 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Table of relevant information about how to decode the ModR/M byte. 34c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) * Based on information in the IA-32 Intel® Architecture 352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * Software Developer's Manual Volume 2: Instruction Set Reference. 362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) */ 372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "mini_disassembler.h" 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "mini_disassembler_types.h" 40c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 4190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)namespace sidestep { 4290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 4390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)const ModrmEntry MiniDisassembler::s_ia16_modrm_map_[] = { 4490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// mod == 00 4590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) /* r/m == 000 */ { false, false, OS_ZERO }, 4690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) /* r/m == 001 */ { false, false, OS_ZERO }, 4790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) /* r/m == 010 */ { false, false, OS_ZERO }, 4890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) /* r/m == 011 */ { false, false, OS_ZERO }, 4990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) /* r/m == 100 */ { false, false, OS_ZERO }, 5090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) /* r/m == 101 */ { false, false, OS_ZERO }, 5190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) /* r/m == 110 */ { true, false, OS_WORD }, 5290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) /* r/m == 111 */ { false, false, OS_ZERO }, 5390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// mod == 01 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* r/m == 000 */ { true, false, OS_BYTE }, 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* r/m == 001 */ { true, false, OS_BYTE }, 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* r/m == 010 */ { true, false, OS_BYTE }, 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* r/m == 011 */ { true, false, OS_BYTE }, 58c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) /* r/m == 100 */ { true, false, OS_BYTE }, 592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) /* r/m == 101 */ { true, false, OS_BYTE }, 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* r/m == 110 */ { true, false, OS_BYTE }, 61c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) /* r/m == 111 */ { true, false, OS_BYTE }, 622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// mod == 10 632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) /* r/m == 000 */ { true, false, OS_WORD }, 647d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) /* r/m == 001 */ { true, false, OS_WORD }, 657d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) /* r/m == 010 */ { true, false, OS_WORD }, 66c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) /* r/m == 011 */ { true, false, OS_WORD }, 677d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) /* r/m == 100 */ { true, false, OS_WORD }, 687d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) /* r/m == 101 */ { true, false, OS_WORD }, 69c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) /* r/m == 110 */ { true, false, OS_WORD }, 707d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) /* r/m == 111 */ { true, false, OS_WORD }, 717d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)// mod == 11 72c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) /* r/m == 000 */ { false, false, OS_ZERO }, 73c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) /* r/m == 001 */ { false, false, OS_ZERO }, 74c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) /* r/m == 010 */ { false, false, OS_ZERO }, 75c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) /* r/m == 011 */ { false, false, OS_ZERO }, 76c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) /* r/m == 100 */ { false, false, OS_ZERO }, 77c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) /* r/m == 101 */ { false, false, OS_ZERO }, 7890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) /* r/m == 110 */ { false, false, OS_ZERO }, 7990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) /* r/m == 111 */ { false, false, OS_ZERO } 80c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}; 81c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 82c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)const ModrmEntry MiniDisassembler::s_ia32_modrm_map_[] = { 83c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// mod == 00 8490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) /* r/m == 000 */ { false, false, OS_ZERO }, 8590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) /* r/m == 001 */ { false, false, OS_ZERO }, 86c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) /* r/m == 010 */ { false, false, OS_ZERO }, 87c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) /* r/m == 011 */ { false, false, OS_ZERO }, 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* r/m == 100 */ { false, true, OS_ZERO }, 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* r/m == 101 */ { true, false, OS_DOUBLE_WORD }, 90868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) /* r/m == 110 */ { false, false, OS_ZERO }, 91868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) /* r/m == 111 */ { false, false, OS_ZERO }, 92868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// mod == 01 93868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) /* r/m == 000 */ { true, false, OS_BYTE }, 94868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) /* r/m == 001 */ { true, false, OS_BYTE }, 95868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) /* r/m == 010 */ { true, false, OS_BYTE }, 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* r/m == 011 */ { true, false, OS_BYTE }, 972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) /* r/m == 100 */ { true, true, OS_BYTE }, 982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) /* r/m == 101 */ { true, false, OS_BYTE }, 99c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) /* r/m == 110 */ { true, false, OS_BYTE }, 1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) /* r/m == 111 */ { true, false, OS_BYTE }, 1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// mod == 10 102c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) /* r/m == 000 */ { true, false, OS_DOUBLE_WORD }, 1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) /* r/m == 001 */ { true, false, OS_DOUBLE_WORD }, 1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) /* r/m == 010 */ { true, false, OS_DOUBLE_WORD }, 105c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) /* r/m == 011 */ { true, false, OS_DOUBLE_WORD }, 10690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) /* r/m == 100 */ { true, true, OS_DOUBLE_WORD }, 10790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) /* r/m == 101 */ { true, false, OS_DOUBLE_WORD }, 10890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) /* r/m == 110 */ { true, false, OS_DOUBLE_WORD }, 10990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) /* r/m == 111 */ { true, false, OS_DOUBLE_WORD }, 1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// mod == 11 1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) /* r/m == 000 */ { false, false, OS_ZERO }, 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* r/m == 001 */ { false, false, OS_ZERO }, 113c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) /* r/m == 010 */ { false, false, OS_ZERO }, 114c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) /* r/m == 011 */ { false, false, OS_ZERO }, 115c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) /* r/m == 100 */ { false, false, OS_ZERO }, 116c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) /* r/m == 101 */ { false, false, OS_ZERO }, 117c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) /* r/m == 110 */ { false, false, OS_ZERO }, 118c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) /* r/m == 111 */ { false, false, OS_ZERO }, 119c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}; 120c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; // namespace sidestep 122c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)