• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 // Table of relevant information about how to decode the ModR/M byte.
6 // Based on information in the IA-32 Intel Architecture
7 // Software Developer's Manual Volume 2: Instruction Set Reference.
8 
9 #include "sandbox/win/src/sidestep/mini_disassembler.h"
10 #include "sandbox/win/src/sidestep/mini_disassembler_types.h"
11 
12 namespace sidestep {
13 
14 const ModrmEntry MiniDisassembler::s_ia16_modrm_map_[] = {
15 // mod == 00
16   /* r/m == 000 */ { false, false, OS_ZERO },
17   /* r/m == 001 */ { false, false, OS_ZERO },
18   /* r/m == 010 */ { false, false, OS_ZERO },
19   /* r/m == 011 */ { false, false, OS_ZERO },
20   /* r/m == 100 */ { false, false, OS_ZERO },
21   /* r/m == 101 */ { false, false, OS_ZERO },
22   /* r/m == 110 */ { true, false, OS_WORD },
23   /* r/m == 111 */ { false, false, OS_ZERO },
24 // mod == 01
25   /* r/m == 000 */ { true, false, OS_BYTE },
26   /* r/m == 001 */ { true, false, OS_BYTE },
27   /* r/m == 010 */ { true, false, OS_BYTE },
28   /* r/m == 011 */ { true, false, OS_BYTE },
29   /* r/m == 100 */ { true, false, OS_BYTE },
30   /* r/m == 101 */ { true, false, OS_BYTE },
31   /* r/m == 110 */ { true, false, OS_BYTE },
32   /* r/m == 111 */ { true, false, OS_BYTE },
33 // mod == 10
34   /* r/m == 000 */ { true, false, OS_WORD },
35   /* r/m == 001 */ { true, false, OS_WORD },
36   /* r/m == 010 */ { true, false, OS_WORD },
37   /* r/m == 011 */ { true, false, OS_WORD },
38   /* r/m == 100 */ { true, false, OS_WORD },
39   /* r/m == 101 */ { true, false, OS_WORD },
40   /* r/m == 110 */ { true, false, OS_WORD },
41   /* r/m == 111 */ { true, false, OS_WORD },
42 // mod == 11
43   /* r/m == 000 */ { false, false, OS_ZERO },
44   /* r/m == 001 */ { false, false, OS_ZERO },
45   /* r/m == 010 */ { false, false, OS_ZERO },
46   /* r/m == 011 */ { false, false, OS_ZERO },
47   /* r/m == 100 */ { false, false, OS_ZERO },
48   /* r/m == 101 */ { false, false, OS_ZERO },
49   /* r/m == 110 */ { false, false, OS_ZERO },
50   /* r/m == 111 */ { false, false, OS_ZERO }
51 };
52 
53 const ModrmEntry MiniDisassembler::s_ia32_modrm_map_[] = {
54 // mod == 00
55   /* r/m == 000 */ { false, false, OS_ZERO },
56   /* r/m == 001 */ { false, false, OS_ZERO },
57   /* r/m == 010 */ { false, false, OS_ZERO },
58   /* r/m == 011 */ { false, false, OS_ZERO },
59   /* r/m == 100 */ { false, true, OS_ZERO },
60   /* r/m == 101 */ { true, false, OS_DOUBLE_WORD },
61   /* r/m == 110 */ { false, false, OS_ZERO },
62   /* r/m == 111 */ { false, false, OS_ZERO },
63 // mod == 01
64   /* r/m == 000 */ { true, false, OS_BYTE },
65   /* r/m == 001 */ { true, false, OS_BYTE },
66   /* r/m == 010 */ { true, false, OS_BYTE },
67   /* r/m == 011 */ { true, false, OS_BYTE },
68   /* r/m == 100 */ { true, true, OS_BYTE },
69   /* r/m == 101 */ { true, false, OS_BYTE },
70   /* r/m == 110 */ { true, false, OS_BYTE },
71   /* r/m == 111 */ { true, false, OS_BYTE },
72 // mod == 10
73   /* r/m == 000 */ { true, false, OS_DOUBLE_WORD },
74   /* r/m == 001 */ { true, false, OS_DOUBLE_WORD },
75   /* r/m == 010 */ { true, false, OS_DOUBLE_WORD },
76   /* r/m == 011 */ { true, false, OS_DOUBLE_WORD },
77   /* r/m == 100 */ { true, true, OS_DOUBLE_WORD },
78   /* r/m == 101 */ { true, false, OS_DOUBLE_WORD },
79   /* r/m == 110 */ { true, false, OS_DOUBLE_WORD },
80   /* r/m == 111 */ { true, false, OS_DOUBLE_WORD },
81 // mod == 11
82   /* r/m == 000 */ { false, false, OS_ZERO },
83   /* r/m == 001 */ { false, false, OS_ZERO },
84   /* r/m == 010 */ { false, false, OS_ZERO },
85   /* r/m == 011 */ { false, false, OS_ZERO },
86   /* r/m == 100 */ { false, false, OS_ZERO },
87   /* r/m == 101 */ { false, false, OS_ZERO },
88   /* r/m == 110 */ { false, false, OS_ZERO },
89   /* r/m == 111 */ { false, false, OS_ZERO },
90 };
91 
92 };  // namespace sidestep
93