dynasm/arch/x64/
parser.rs

1//! Common map and table definitions useful for parsers.
2use lazy_static::lazy_static;
3
4use crate::common::Size;
5use super::ast::{RegId, RegFamily};
6
7use self::RegId::*;
8use crate::common::Size::*;
9
10use std::collections::HashMap;
11
12/// A list of valid x86 prefixes
13pub const PREFIXES: [&str; 12] = [
14    "lock",
15    "rep",
16    "repe",
17    "repz",
18    "repne",
19    "repnz",
20    "ss",
21    "cs",
22    "ds",
23    "es",
24    "fs",
25    "gs",
26];
27
28/// A list of x86 sizes in string and value representation.
29pub const X86_SIZES: [(&str, Size); 9] = [
30    ("BYTE", BYTE),
31    ("WORD", WORD),
32    ("DWORD", DWORD),
33    ("AWORD", DWORD),
34    ("FWORD", FWORD),
35    ("QWORD", QWORD),
36    ("TWORD", PWORD),
37    ("OWORD", OWORD),
38    ("YWORD", HWORD)
39];
40
41/// A list of x64 sizes in string and value representation.
42pub const X64_SIZES: [(&str, Size); 9] = [
43    ("BYTE", BYTE),
44    ("WORD", WORD),
45    ("DWORD", DWORD),
46    ("FWORD", FWORD),
47    ("AWORD", QWORD),
48    ("QWORD", QWORD),
49    ("TWORD", PWORD),
50    ("OWORD", OWORD),
51    ("YWORD", HWORD)
52];
53
54pub const X64_REGISTERS: &[(&str, (RegId, Size))] = &[
55    ("rax", (RAX, QWORD)),
56    ("r0" , (RAX, QWORD)),
57    ("rcx", (RCX, QWORD)),
58    ("r1" , (RCX, QWORD)),
59    ("rdx", (RDX, QWORD)),
60    ("r2" , (RDX, QWORD)),
61    ("rbx", (RBX, QWORD)),
62    ("r3" , (RBX, QWORD)),
63    ("rsp", (RSP, QWORD)),
64    ("r4" , (RSP, QWORD)),
65    ("rbp", (RBP, QWORD)),
66    ("r5" , (RBP, QWORD)),
67    ("rsi", (RSI, QWORD)),
68    ("r6" , (RSI, QWORD)),
69    ("rdi", (RDI, QWORD)),
70    ("r7" , (RDI, QWORD)),
71    ("r8" , (R8,  QWORD)),
72    ("r9" , (R9,  QWORD)),
73    ("r10", (R10, QWORD)),
74    ("r11", (R11, QWORD)),
75    ("r12", (R12, QWORD)),
76    ("r13", (R13, QWORD)),
77    ("r14", (R14, QWORD)),
78    ("r15", (R15, QWORD)),
79
80    ("eax" , (RAX, DWORD)),
81    ("r0d" , (RAX, DWORD)),
82    ("ecx" , (RCX, DWORD)),
83    ("r1d" , (RCX, DWORD)),
84    ("edx" , (RDX, DWORD)),
85    ("r2d" , (RDX, DWORD)),
86    ("ebx" , (RBX, DWORD)),
87    ("r3d" , (RBX, DWORD)),
88    ("esp" , (RSP, DWORD)),
89    ("r4d" , (RSP, DWORD)),
90    ("ebp" , (RBP, DWORD)),
91    ("r5d" , (RBP, DWORD)),
92    ("esi" , (RSI, DWORD)),
93    ("r6d" , (RSI, DWORD)),
94    ("edi" , (RDI, DWORD)),
95    ("r7d" , (RDI, DWORD)),
96    ("r8d" , (R8,  DWORD)),
97    ("r9d" , (R9,  DWORD)),
98    ("r10d", (R10, DWORD)),
99    ("r11d", (R11, DWORD)),
100    ("r12d", (R12, DWORD)),
101    ("r13d", (R13, DWORD)),
102    ("r14d", (R14, DWORD)),
103    ("r15d", (R15, DWORD)),
104
105    ("ax"  , (RAX, WORD)),
106    ("r0w" , (RAX, WORD)),
107    ("cx"  , (RCX, WORD)),
108    ("r1w" , (RCX, WORD)),
109    ("dx"  , (RDX, WORD)),
110    ("r2w" , (RDX, WORD)),
111    ("bx"  , (RBX, WORD)),
112    ("r3w" , (RBX, WORD)),
113    ("sp"  , (RSP, WORD)),
114    ("r4w" , (RSP, WORD)),
115    ("bp"  , (RBP, WORD)),
116    ("r5w" , (RBP, WORD)),
117    ("si"  , (RSI, WORD)),
118    ("r6w" , (RSI, WORD)),
119    ("di"  , (RDI, WORD)),
120    ("r7w" , (RDI, WORD)),
121    ("r8w" , (R8,  WORD)),
122    ("r9w" , (R9,  WORD)),
123    ("r10w", (R10, WORD)),
124    ("r11w", (R11, WORD)),
125    ("r12w", (R12, WORD)),
126    ("r13w", (R13, WORD)),
127    ("r14w", (R14, WORD)),
128    ("r15w", (R15, WORD)),
129
130    ("al"  , (RAX, BYTE)),
131    ("r0b" , (RAX, BYTE)),
132    ("cl"  , (RCX, BYTE)),
133    ("r1b" , (RCX, BYTE)),
134    ("dl"  , (RDX, BYTE)),
135    ("r2b" , (RDX, BYTE)),
136    ("bl"  , (RBX, BYTE)),
137    ("r3b" , (RBX, BYTE)),
138    ("spl" , (RSP, BYTE)),
139    ("r4b" , (RSP, BYTE)),
140    ("bpl" , (RBP, BYTE)),
141    ("r5b" , (RBP, BYTE)),
142    ("sil" , (RSI, BYTE)),
143    ("r6b" , (RSI, BYTE)),
144    ("dil" , (RDI, BYTE)),
145    ("r7b" , (RDI, BYTE)),
146    ("r8b" , (R8,  BYTE)),
147    ("r9b" , (R9,  BYTE)),
148    ("r10b", (R10, BYTE)),
149    ("r11b", (R11, BYTE)),
150    ("r12b", (R12, BYTE)),
151    ("r13b", (R13, BYTE)),
152    ("r14b", (R14, BYTE)),
153    ("r15b", (R15, BYTE)),
154
155    ("rip", (RIP, QWORD)),
156    ("eip", (RIP, DWORD)),
157
158    ("ah", (AH, BYTE)),
159    ("ch", (CH, BYTE)),
160    ("dh", (DH, BYTE)),
161    ("bh", (BH, BYTE)),
162
163    ("st0", (ST0, PWORD)),
164    ("st1", (ST1, PWORD)),
165    ("st2", (ST2, PWORD)),
166    ("st3", (ST3, PWORD)),
167    ("st4", (ST4, PWORD)),
168    ("st5", (ST5, PWORD)),
169    ("st6", (ST6, PWORD)),
170    ("st7", (ST7, PWORD)),
171
172    ("mm0", (MMX0, QWORD)),
173    ("mm1", (MMX1, QWORD)),
174    ("mm2", (MMX2, QWORD)),
175    ("mm3", (MMX3, QWORD)),
176    ("mm4", (MMX4, QWORD)),
177    ("mm5", (MMX5, QWORD)),
178    ("mm6", (MMX6, QWORD)),
179    ("mm7", (MMX7, QWORD)),
180
181    ("xmm0" , (XMM0 , OWORD)),
182    ("xmm1" , (XMM1 , OWORD)),
183    ("xmm2" , (XMM2 , OWORD)),
184    ("xmm3" , (XMM3 , OWORD)),
185    ("xmm4" , (XMM4 , OWORD)),
186    ("xmm5" , (XMM5 , OWORD)),
187    ("xmm6" , (XMM6 , OWORD)),
188    ("xmm7" , (XMM7 , OWORD)),
189    ("xmm8" , (XMM8 , OWORD)),
190    ("xmm9" , (XMM9 , OWORD)),
191    ("xmm10", (XMM10, OWORD)),
192    ("xmm11", (XMM11, OWORD)),
193    ("xmm12", (XMM12, OWORD)),
194    ("xmm13", (XMM13, OWORD)),
195    ("xmm14", (XMM14, OWORD)),
196    ("xmm15", (XMM15, OWORD)),
197
198    ("ymm0" , (XMM0 , HWORD)),
199    ("ymm1" , (XMM1 , HWORD)),
200    ("ymm2" , (XMM2 , HWORD)),
201    ("ymm3" , (XMM3 , HWORD)),
202    ("ymm4" , (XMM4 , HWORD)),
203    ("ymm5" , (XMM5 , HWORD)),
204    ("ymm6" , (XMM6 , HWORD)),
205    ("ymm7" , (XMM7 , HWORD)),
206    ("ymm8" , (XMM8 , HWORD)),
207    ("ymm9" , (XMM9 , HWORD)),
208    ("ymm10", (XMM10, HWORD)),
209    ("ymm11", (XMM11, HWORD)),
210    ("ymm12", (XMM12, HWORD)),
211    ("ymm13", (XMM13, HWORD)),
212    ("ymm14", (XMM14, HWORD)),
213    ("ymm15", (XMM15, HWORD)),
214
215    ("es", (ES, WORD)),
216    ("cs", (CS, WORD)),
217    ("ss", (SS, WORD)),
218    ("ds", (DS, WORD)),
219    ("fs", (FS, WORD)),
220    ("gs", (GS, WORD)),
221
222    ("cr0" , (CR0 , QWORD)),
223    ("cr1" , (CR1 , QWORD)),
224    ("cr2" , (CR2 , QWORD)),
225    ("cr3" , (CR3 , QWORD)),
226    ("cr4" , (CR4 , QWORD)),
227    ("cr5" , (CR5 , QWORD)),
228    ("cr6" , (CR6 , QWORD)),
229    ("cr7" , (CR7 , QWORD)),
230    ("cr8" , (CR8 , QWORD)),
231    ("cr9" , (CR9 , QWORD)),
232    ("cr10", (CR10, QWORD)),
233    ("cr11", (CR11, QWORD)),
234    ("cr12", (CR12, QWORD)),
235    ("cr13", (CR13, QWORD)),
236    ("cr14", (CR14, QWORD)),
237    ("cr15", (CR15, QWORD)),
238
239    ("dr0" , (DR0 , QWORD)),
240    ("dr1" , (DR1 , QWORD)),
241    ("dr2" , (DR2 , QWORD)),
242    ("dr3" , (DR3 , QWORD)),
243    ("dr4" , (DR4 , QWORD)),
244    ("dr5" , (DR5 , QWORD)),
245    ("dr6" , (DR6 , QWORD)),
246    ("dr7" , (DR7 , QWORD)),
247    ("dr8" , (DR8 , QWORD)),
248    ("dr9" , (DR9 , QWORD)),
249    ("dr10", (DR10, QWORD)),
250    ("dr11", (DR11, QWORD)),
251    ("dr12", (DR12, QWORD)),
252    ("dr13", (DR13, QWORD)),
253    ("dr14", (DR14, QWORD)),
254    ("dr15", (DR15, QWORD)),
255
256    ("bnd0", (BND0, OWORD)),
257    ("bnd1", (BND1, OWORD)),
258    ("bnd2", (BND2, OWORD)),
259    ("bnd3", (BND3, OWORD)),
260];
261
262static X86_REGISTERS: &[(&str, (RegId, Size))] = &[
263    ("eax", (RAX, DWORD)),
264    ("ecx", (RCX, DWORD)),
265    ("edx", (RDX, DWORD)),
266    ("ebx", (RBX, DWORD)),
267    ("esp", (RSP, DWORD)),
268    ("ebp", (RBP, DWORD)),
269    ("esi", (RSI, DWORD)),
270    ("edi", (RDI, DWORD)),
271
272    ("ax", (RAX, WORD)),
273    ("cx", (RCX, WORD)),
274    ("dx", (RDX, WORD)),
275    ("bx", (RBX, WORD)),
276    ("sp", (RSP, WORD)),
277    ("bp", (RBP, WORD)),
278    ("si", (RSI, WORD)),
279    ("di", (RDI, WORD)),
280
281    ("al", (RAX, BYTE)),
282    ("cl", (RCX, BYTE)),
283    ("dl", (RDX, BYTE)),
284    ("bl", (RBX, BYTE)),
285
286    ("eip", (RIP, DWORD)),
287
288    ("ah", (AH, BYTE)),
289    ("ch", (CH, BYTE)),
290    ("dh", (DH, BYTE)),
291    ("bh", (BH, BYTE)),
292
293    ("st0", (ST0, PWORD)),
294    ("st1", (ST1, PWORD)),
295    ("st2", (ST2, PWORD)),
296    ("st3", (ST3, PWORD)),
297    ("st4", (ST4, PWORD)),
298    ("st5", (ST5, PWORD)),
299    ("st6", (ST6, PWORD)),
300    ("st7", (ST7, PWORD)),
301
302    ("mm0", (MMX0, QWORD)),
303    ("mm1", (MMX1, QWORD)),
304    ("mm2", (MMX2, QWORD)),
305    ("mm3", (MMX3, QWORD)),
306    ("mm4", (MMX4, QWORD)),
307    ("mm5", (MMX5, QWORD)),
308    ("mm6", (MMX6, QWORD)),
309    ("mm7", (MMX7, QWORD)),
310
311    ("xmm0", (XMM0, OWORD)),
312    ("xmm1", (XMM1, OWORD)),
313    ("xmm2", (XMM2, OWORD)),
314    ("xmm3", (XMM3, OWORD)),
315    ("xmm4", (XMM4, OWORD)),
316    ("xmm5", (XMM5, OWORD)),
317    ("xmm6", (XMM6, OWORD)),
318    ("xmm7", (XMM7, OWORD)),
319
320    ("ymm0", (XMM0, HWORD)),
321    ("ymm1", (XMM1, HWORD)),
322    ("ymm2", (XMM2, HWORD)),
323    ("ymm3", (XMM3, HWORD)),
324    ("ymm4", (XMM4, HWORD)),
325    ("ymm5", (XMM5, HWORD)),
326    ("ymm6", (XMM6, HWORD)),
327    ("ymm7", (XMM7, HWORD)),
328
329    ("es", (ES, WORD)),
330    ("cs", (CS, WORD)),
331    ("ss", (SS, WORD)),
332    ("ds", (DS, WORD)),
333    ("fs", (FS, WORD)),
334    ("gs", (GS, WORD)),
335
336    ("cr0", (CR0, DWORD)),
337    ("cr1", (CR1, DWORD)),
338    ("cr2", (CR2, DWORD)),
339    ("cr3", (CR3, DWORD)),
340    ("cr4", (CR4, DWORD)),
341    ("cr5", (CR5, DWORD)),
342    ("cr6", (CR6, DWORD)),
343    ("cr7", (CR7, DWORD)),
344
345    ("dr0", (DR0, DWORD)),
346    ("dr1", (DR1, DWORD)),
347    ("dr2", (DR2, DWORD)),
348    ("dr3", (DR3, DWORD)),
349    ("dr4", (DR4, DWORD)),
350    ("dr5", (DR5, DWORD)),
351    ("dr6", (DR6, DWORD)),
352    ("dr7", (DR7, DWORD)),
353
354    ("bnd0", (BND0, OWORD)),
355    ("bnd1", (BND1, OWORD)),
356    ("bnd2", (BND2, OWORD)),
357    ("bnd3", (BND3, OWORD)),
358];
359
360pub const X64_FAMILIES: &[(&str, (Size, RegFamily))] = &[
361    ("Rb", (Size::BYTE,  RegFamily::LEGACY)),
362    ("Rh", (Size::BYTE,  RegFamily::HIGHBYTE)),
363    ("Rw", (Size::WORD,  RegFamily::LEGACY)),
364    ("Rd", (Size::DWORD, RegFamily::LEGACY)),
365    ("Ra", (Size::QWORD, RegFamily::LEGACY)),
366    ("Rq", (Size::QWORD, RegFamily::LEGACY)),
367    ("Rf", (Size::PWORD, RegFamily::FP)),
368    ("Rm", (Size::QWORD, RegFamily::MMX)),
369    ("Rx", (Size::OWORD, RegFamily::XMM)),
370    ("Ry", (Size::HWORD, RegFamily::XMM)),
371    ("Rs", (Size::WORD,  RegFamily::SEGMENT)),
372    ("RC", (Size::QWORD, RegFamily::CONTROL)),
373    ("RD", (Size::QWORD, RegFamily::DEBUG)),
374    ("RB", (Size::OWORD, RegFamily::BOUND)),
375];
376
377pub const X86_FAMILIES: &[(&str, (Size, RegFamily))] = &[
378    ("Rb",(Size::BYTE,  RegFamily::LEGACY)),
379    ("Rh",(Size::BYTE,  RegFamily::HIGHBYTE)),
380    ("Rw",(Size::WORD,  RegFamily::LEGACY)),
381    ("Ra",(Size::DWORD, RegFamily::LEGACY)),
382    ("Rd",(Size::DWORD, RegFamily::LEGACY)),
383    ("Rf",(Size::PWORD, RegFamily::FP)),
384    ("Rm",(Size::QWORD, RegFamily::MMX)),
385    ("Rx",(Size::OWORD, RegFamily::XMM)),
386    ("Ry",(Size::HWORD, RegFamily::XMM)),
387    ("Rs",(Size::WORD,  RegFamily::SEGMENT)),
388    ("RC",(Size::DWORD, RegFamily::CONTROL)),
389    ("RD",(Size::DWORD, RegFamily::DEBUG)),
390    ("RB",(Size::OWORD, RegFamily::BOUND)),
391];
392
393lazy_static!{
394    pub static ref X64_REGISTER_MAP: HashMap<&'static str, (RegId, Size)> = {
395        X64_REGISTERS.iter().cloned().collect()
396    };
397    pub static ref X86_REGISTERS_MAP: HashMap<&'static str, (RegId, Size)> = {
398        X86_REGISTERS.iter().cloned().collect()
399    };
400    pub static ref X64_FAMILIES_MAP:  HashMap<&'static str, (Size, RegFamily)> = {
401        X64_FAMILIES.iter().cloned().collect()
402    };
403    pub static ref X86_FAMILIES_MAP:  HashMap<&'static str, (Size, RegFamily)> = {
404        X86_FAMILIES.iter().cloned().collect()
405    };
406}