1 /////////////////////////////////////////////////////////////////////////
2 // $Id: syntax.cc,v 1.10 2006/04/27 15:11:45 sshwarts Exp $
3 /////////////////////////////////////////////////////////////////////////
11 #define BX_DISASM_SUPPORT_X86_64
13 #ifdef BX_DISASM_SUPPORT_X86_64
15 static const char *intel_general_16bit_regname
[16] = {
16 "ax", "cx", "dx", "bx", "sp", "bp", "si", "di",
17 "r8w", "r9w", "r10w", "r11w", "r12w", "r13w", "r14w", "r15w"
20 static const char *intel_general_32bit_regname
[16] = {
21 "eax", "ecx", "edx", "ebx", "esp", "ebp", "esi", "edi",
22 "r8d", "r9d", "r10d", "r11d", "r12d", "r13d", "r14d", "r15d"
25 static const char *intel_general_64bit_regname
[16] = {
26 "rax", "rcx", "rdx", "rbx", "rsp", "rbp", "rsi", "rdi",
27 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15"
30 static const char *intel_general_8bit_regname_rex
[16] = {
31 "al", "cl", "dl", "bl", "spl", "bpl", "sil", "dil",
32 "r8b", "r9b", "r10b", "r11b", "r12b", "r13b", "r14b", "r15b"
37 static const char *intel_general_16bit_regname
[8] = {
38 "ax", "cx", "dx", "bx", "sp", "bp", "si", "di"
41 static const char *intel_general_32bit_regname
[8] = {
42 "eax", "ecx", "edx", "ebx", "esp", "ebp", "esi", "edi"
47 static const char *intel_general_8bit_regname
[8] = {
48 "al", "cl", "dl", "bl", "ah", "ch", "dh", "bh"
51 static const char *intel_segment_name
[8] = {
52 "es", "cs", "ss", "ds", "fs", "gs", "??", "??"
55 static const char *intel_index16
[8] = {
71 #ifdef BX_DISASM_SUPPORT_X86_64
73 static const char *att_general_16bit_regname
[16] = {
74 "%ax", "%cx", "%dx", "%bx", "%sp", "%bp", "%si", "%di",
75 "%r8w", "%r9w", "%r10w", "%r11w", "%r12w", "%r13w", "%r14w", "%r15w"
78 static const char *att_general_32bit_regname
[16] = {
79 "%eax", "%ecx", "%edx", "%ebx", "%esp", "%ebp", "%esi", "%edi",
80 "%r8d", "%r9d", "%r10d", "%r11d", "%r12d", "%r13d", "%r14d", "%r15d"
83 static const char *att_general_64bit_regname
[16] = {
84 "%rax", "%rcx", "%rdx", "%rbx", "%rsp", "%rbp", "%rsi", "%rdi",
85 "%r8", "%r9", "%r10", "%r11", "%r12", "%r13", "%r14", "%r15"
88 static const char *att_general_8bit_regname_rex
[16] = {
89 "%al", "%cl", "%dl", "%bl", "%spl", "%bpl", "%sil", "%dil",
90 "%r8b", "%r9b", "%r10b", "%r11b", "%r12b", "%r13b", "%r14b", "%r15b"
95 static const char *att_general_16bit_regname
[8] = {
96 "%ax", "%cx", "%dx", "%bx", "%sp", "%bp", "%si", "%di"
99 static const char *att_general_32bit_regname
[8] = {
100 "%eax", "%ecx", "%edx", "%ebx", "%esp", "%ebp", "%esi", "%edi"
105 static const char *att_general_8bit_regname
[8] = {
106 "%al", "%cl", "%dl", "%bl", "%ah", "%ch", "%dh", "%bh"
109 static const char *att_segment_name
[8] = {
110 "%es", "%cs", "%ss", "%ds", "%fs", "%gs", "%??", "%??"
113 static const char *att_index16
[8] = {
124 #define NULL_SEGMENT_REGISTER 7
126 void disassembler::initialize_modrm_segregs()
128 sreg_mod00_rm16
[0] = segment_name
[DS_REG
];
129 sreg_mod00_rm16
[1] = segment_name
[DS_REG
];
130 sreg_mod00_rm16
[2] = segment_name
[SS_REG
];
131 sreg_mod00_rm16
[3] = segment_name
[SS_REG
];
132 sreg_mod00_rm16
[4] = segment_name
[DS_REG
];
133 sreg_mod00_rm16
[5] = segment_name
[DS_REG
];
134 sreg_mod00_rm16
[6] = segment_name
[DS_REG
];
135 sreg_mod00_rm16
[7] = segment_name
[DS_REG
];
137 sreg_mod01or10_rm16
[0] = segment_name
[DS_REG
];
138 sreg_mod01or10_rm16
[1] = segment_name
[DS_REG
];
139 sreg_mod01or10_rm16
[2] = segment_name
[SS_REG
];
140 sreg_mod01or10_rm16
[3] = segment_name
[SS_REG
];
141 sreg_mod01or10_rm16
[4] = segment_name
[DS_REG
];
142 sreg_mod01or10_rm16
[5] = segment_name
[DS_REG
];
143 sreg_mod01or10_rm16
[6] = segment_name
[SS_REG
];
144 sreg_mod01or10_rm16
[7] = segment_name
[DS_REG
];
146 sreg_mod01or10_rm32
[0] = segment_name
[DS_REG
];
147 sreg_mod01or10_rm32
[1] = segment_name
[DS_REG
];
148 sreg_mod01or10_rm32
[2] = segment_name
[DS_REG
];
149 sreg_mod01or10_rm32
[3] = segment_name
[DS_REG
];
150 sreg_mod01or10_rm32
[4] = segment_name
[NULL_SEGMENT_REGISTER
];
151 sreg_mod01or10_rm32
[5] = segment_name
[SS_REG
];
152 sreg_mod01or10_rm32
[6] = segment_name
[DS_REG
];
153 sreg_mod01or10_rm32
[7] = segment_name
[DS_REG
];
155 sreg_mod00_base32
[0] = segment_name
[DS_REG
];
156 sreg_mod00_base32
[1] = segment_name
[DS_REG
];
157 sreg_mod00_base32
[2] = segment_name
[DS_REG
];
158 sreg_mod00_base32
[3] = segment_name
[DS_REG
];
159 sreg_mod00_base32
[4] = segment_name
[SS_REG
];
160 sreg_mod00_base32
[5] = segment_name
[DS_REG
];
161 sreg_mod00_base32
[6] = segment_name
[DS_REG
];
162 sreg_mod00_base32
[7] = segment_name
[DS_REG
];
164 sreg_mod01or10_base32
[0] = segment_name
[DS_REG
];
165 sreg_mod01or10_base32
[1] = segment_name
[DS_REG
];
166 sreg_mod01or10_base32
[2] = segment_name
[DS_REG
];
167 sreg_mod01or10_base32
[3] = segment_name
[DS_REG
];
168 sreg_mod01or10_base32
[4] = segment_name
[SS_REG
];
169 sreg_mod01or10_base32
[5] = segment_name
[SS_REG
];
170 sreg_mod01or10_base32
[6] = segment_name
[DS_REG
];
171 sreg_mod01or10_base32
[7] = segment_name
[DS_REG
];
178 void disassembler::set_syntax_intel()
182 general_16bit_regname
= intel_general_16bit_regname
;
183 general_8bit_regname
= intel_general_8bit_regname
;
184 general_32bit_regname
= intel_general_32bit_regname
;
185 general_8bit_regname_rex
= intel_general_8bit_regname_rex
;
186 general_64bit_regname
= intel_general_64bit_regname
;
188 segment_name
= intel_segment_name
;
189 index16
= intel_index16
;
191 initialize_modrm_segregs();
194 void disassembler::print_disassembly_intel(const x86_insn
*insn
, const BxDisasmOpcodeInfo_t
*entry
)
197 dis_sprintf("%s ", entry
->IntelOpcode
);
199 if (entry
->Operand1
) {
200 (this->*entry
->Operand1
)(insn
);
202 if (entry
->Operand2
) {
204 (this->*entry
->Operand2
)(insn
);
206 if (entry
->Operand3
) {
208 (this->*entry
->Operand3
)(insn
);
216 void disassembler::set_syntax_att()
220 general_16bit_regname
= att_general_16bit_regname
;
221 general_8bit_regname
= att_general_8bit_regname
;
222 general_32bit_regname
= att_general_32bit_regname
;
223 general_8bit_regname_rex
= att_general_8bit_regname_rex
;
224 general_64bit_regname
= att_general_64bit_regname
;
226 segment_name
= att_segment_name
;
227 index16
= att_index16
;
229 initialize_modrm_segregs();
232 void disassembler::toggle_syntax_mode()
234 if (intel_mode
) set_syntax_att();
235 else set_syntax_intel();
238 void disassembler::print_disassembly_att(const x86_insn
*insn
, const BxDisasmOpcodeInfo_t
*entry
)
241 dis_sprintf("%s ", entry
->AttOpcode
);
243 if (entry
->Operand3
) {
244 (this->*entry
->Operand3
)(insn
);
247 if (entry
->Operand2
) {
248 (this->*entry
->Operand2
)(insn
);
251 if (entry
->Operand1
) {
252 (this->*entry
->Operand1
)(insn
);