xref: /haiku/headers/libs/zydis/Zydis/Internal/FormatterIntel.h (revision 1003e004e6c97eb60657a98928dd334e141c59ee)
1 /***************************************************************************************************
2 
3   Zyan Disassembler Library (Zydis)
4 
5   Original Author : Florian Bernd, Joel Hoener
6 
7  * Permission is hereby granted, free of charge, to any person obtaining a copy
8  * of this software and associated documentation files (the "Software"), to deal
9  * in the Software without restriction, including without limitation the rights
10  * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
11  * copies of the Software, and to permit persons to whom the Software is
12  * furnished to do so, subject to the following conditions:
13  *
14  * The above copyright notice and this permission notice shall be included in all
15  * copies or substantial portions of the Software.
16  *
17  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
18  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
20  * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
21  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
22  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
23  * SOFTWARE.
24 
25 ***************************************************************************************************/
26 
27 /**
28  * @file
29  * Implements the `INTEL` style instruction-formatter.
30  */
31 
32 #ifndef ZYDIS_FORMATTER_INTEL_H
33 #define ZYDIS_FORMATTER_INTEL_H
34 
35 #include <Zydis/Formatter.h>
36 #include <Zydis/Internal/FormatterBase.h>
37 #include <Zydis/Internal/String.h>
38 
39 #ifdef __cplusplus
40 extern "C" {
41 #endif
42 
43 /* ============================================================================================== */
44 /* Formatter functions                                                                            */
45 /* ============================================================================================== */
46 
47 /* ---------------------------------------------------------------------------------------------- */
48 /* Intel                                                                                          */
49 /* ---------------------------------------------------------------------------------------------- */
50 
51 ZyanStatus ZydisFormatterIntelFormatInstruction(const ZydisFormatter* formatter,
52     ZydisFormatterBuffer* buffer, ZydisFormatterContext* context);
53 
54 ZyanStatus ZydisFormatterIntelFormatOperandMEM(const ZydisFormatter* formatter,
55     ZydisFormatterBuffer* buffer, ZydisFormatterContext* context);
56 
57 ZyanStatus ZydisFormatterIntelPrintMnemonic(const ZydisFormatter* formatter,
58     ZydisFormatterBuffer* buffer, ZydisFormatterContext* context);
59 
60 ZyanStatus ZydisFormatterIntelPrintRegister(const ZydisFormatter* formatter,
61     ZydisFormatterBuffer* buffer, ZydisFormatterContext* context, ZydisRegister reg);
62 
63 ZyanStatus ZydisFormatterIntelPrintDISP(const ZydisFormatter* formatter,
64     ZydisFormatterBuffer* buffer, ZydisFormatterContext* context);
65 
66 ZyanStatus ZydisFormatterIntelPrintTypecast(const ZydisFormatter* formatter,
67     ZydisFormatterBuffer* buffer, ZydisFormatterContext* context);
68 
69 /* ---------------------------------------------------------------------------------------------- */
70 /* MASM                                                                                           */
71 /* ---------------------------------------------------------------------------------------------- */
72 
73 ZyanStatus ZydisFormatterIntelFormatInstructionMASM(const ZydisFormatter* formatter,
74     ZydisFormatterBuffer* buffer, ZydisFormatterContext* context);
75 
76 ZyanStatus ZydisFormatterIntelPrintAddressMASM(const ZydisFormatter* formatter,
77     ZydisFormatterBuffer* buffer, ZydisFormatterContext* context);
78 
79 /* ---------------------------------------------------------------------------------------------- */
80 
81 /* ============================================================================================== */
82 /* Fomatter presets                                                                               */
83 /* ============================================================================================== */
84 
85 /* ---------------------------------------------------------------------------------------------- */
86 /* INTEL                                                                                          */
87 /* ---------------------------------------------------------------------------------------------- */
88 
89 /**
90  * The default formatter configuration for `INTEL` style disassembly.
91  */
92 static const ZydisFormatter FORMATTER_INTEL =
93 {
94     /* style                    */ ZYDIS_FORMATTER_STYLE_INTEL,
95     /* force_memory_size        */ ZYAN_FALSE,
96     /* force_memory_seg         */ ZYAN_FALSE,
97     /* force_memory_scale       */ ZYAN_TRUE,
98     /* force_relative_branches  */ ZYAN_FALSE,
99     /* force_relative_riprel    */ ZYAN_FALSE,
100     /* print_branch_size        */ ZYAN_FALSE,
101     /* detailed_prefixes        */ ZYAN_FALSE,
102     /* addr_base                */ ZYDIS_NUMERIC_BASE_HEX,
103     /* addr_signedness          */ ZYDIS_SIGNEDNESS_SIGNED,
104     /* addr_padding_absolute    */ ZYDIS_PADDING_AUTO,
105     /* addr_padding_relative    */ 2,
106     /* disp_base                */ ZYDIS_NUMERIC_BASE_HEX,
107     /* disp_signedness          */ ZYDIS_SIGNEDNESS_SIGNED,
108     /* disp_padding             */ 2,
109     /* imm_base                 */ ZYDIS_NUMERIC_BASE_HEX,
110     /* imm_signedness           */ ZYDIS_SIGNEDNESS_UNSIGNED,
111     /* imm_padding              */ 2,
112     /* case_prefixes            */ ZYDIS_LETTER_CASE_DEFAULT,
113     /* case_mnemonic            */ ZYDIS_LETTER_CASE_DEFAULT,
114     /* case_registers           */ ZYDIS_LETTER_CASE_DEFAULT,
115     /* case_typecasts           */ ZYDIS_LETTER_CASE_DEFAULT,
116     /* case_decorators          */ ZYDIS_LETTER_CASE_DEFAULT,
117     /* hex_uppercase            */ ZYAN_TRUE,
118     /* hex_force_leading_number */ ZYAN_FALSE,
119     /* number_format            */
120     {
121         // ZYDIS_NUMERIC_BASE_DEC
122         {
123             // Prefix
124             {
125                 /* string       */ ZYAN_NULL,
126                 /* string_data  */ ZYAN_DEFINE_STRING_VIEW(""),
127                 /* buffer       */ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
128             },
129             // Suffix
130             {
131                 /* string       */ ZYAN_NULL,
132                 /* string_data  */ ZYAN_DEFINE_STRING_VIEW(""),
133                 /* buffer       */ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
134             }
135         },
136         // ZYDIS_NUMERIC_BASE_HEX
137         {
138             // Prefix
139             {
140                 /* string       */ &FORMATTER_INTEL.number_format[
141                                        ZYDIS_NUMERIC_BASE_HEX][0].string_data,
142                 /* string_data  */ ZYAN_DEFINE_STRING_VIEW("0x"),
143                 /* buffer       */ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
144             },
145             // Suffix
146             {
147                 /* string       */ ZYAN_NULL,
148                 /* string_data  */ ZYAN_DEFINE_STRING_VIEW(""),
149                 /* buffer       */ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
150             }
151         }
152     },
153     /* func_pre_instruction     */ ZYAN_NULL,
154     /* func_post_instruction    */ ZYAN_NULL,
155     /* func_format_instruction  */ &ZydisFormatterIntelFormatInstruction,
156     /* func_pre_operand         */ ZYAN_NULL,
157     /* func_post_operand        */ ZYAN_NULL,
158     /* func_format_operand_reg  */ &ZydisFormatterBaseFormatOperandREG,
159     /* func_format_operand_mem  */ &ZydisFormatterIntelFormatOperandMEM,
160     /* func_format_operand_ptr  */ &ZydisFormatterBaseFormatOperandPTR,
161     /* func_format_operand_imm  */ &ZydisFormatterBaseFormatOperandIMM,
162     /* func_print_mnemonic      */ &ZydisFormatterIntelPrintMnemonic,
163     /* func_print_register      */ &ZydisFormatterIntelPrintRegister,
164     /* func_print_address_abs   */ &ZydisFormatterBasePrintAddressABS,
165     /* func_print_address_rel   */ &ZydisFormatterBasePrintAddressREL,
166     /* func_print_disp          */ &ZydisFormatterIntelPrintDISP,
167     /* func_print_imm           */ &ZydisFormatterBasePrintIMM,
168     /* func_print_typecast      */ &ZydisFormatterIntelPrintTypecast,
169     /* func_print_segment       */ &ZydisFormatterBasePrintSegment,
170     /* func_print_prefixes      */ &ZydisFormatterBasePrintPrefixes,
171     /* func_print_decorator     */ &ZydisFormatterBasePrintDecorator
172 };
173 
174 /* ---------------------------------------------------------------------------------------------- */
175 /* MASM                                                                                           */
176 /* ---------------------------------------------------------------------------------------------- */
177 
178 /**
179  * The default formatter configuration for `MASM` style disassembly.
180  */
181 static const ZydisFormatter FORMATTER_INTEL_MASM =
182 {
183     /* style                    */ ZYDIS_FORMATTER_STYLE_INTEL_MASM,
184     /* force_memory_size        */ ZYAN_TRUE,
185     /* force_memory_seg         */ ZYAN_FALSE,
186     /* force_memory_scale       */ ZYAN_TRUE,
187     /* force_relative_branches  */ ZYAN_FALSE,
188     /* force_relative_riprel    */ ZYAN_FALSE,
189     /* print_branch_size        */ ZYAN_FALSE,
190     /* detailed_prefixes        */ ZYAN_FALSE,
191     /* addr_base                */ ZYDIS_NUMERIC_BASE_HEX,
192     /* addr_signedness          */ ZYDIS_SIGNEDNESS_SIGNED,
193     /* addr_padding_absolute    */ ZYDIS_PADDING_DISABLED,
194     /* addr_padding_relative    */ ZYDIS_PADDING_DISABLED,
195     /* disp_base                */ ZYDIS_NUMERIC_BASE_HEX,
196     /* disp_signedness          */ ZYDIS_SIGNEDNESS_SIGNED,
197     /* disp_padding             */ ZYDIS_PADDING_DISABLED,
198     /* imm_base                 */ ZYDIS_NUMERIC_BASE_HEX,
199     /* imm_signedness           */ ZYDIS_SIGNEDNESS_AUTO,
200     /* imm_padding              */ ZYDIS_PADDING_DISABLED,
201     /* case_prefixes            */ ZYDIS_LETTER_CASE_DEFAULT,
202     /* case_mnemonic            */ ZYDIS_LETTER_CASE_DEFAULT,
203     /* case_registers           */ ZYDIS_LETTER_CASE_DEFAULT,
204     /* case_typecasts           */ ZYDIS_LETTER_CASE_DEFAULT,
205     /* case_decorators          */ ZYDIS_LETTER_CASE_DEFAULT,
206     /* hex_uppercase            */ ZYAN_TRUE,
207     /* hex_force_leading_number */ ZYAN_TRUE,
208     /* number_format            */
209     {
210         // ZYDIS_NUMERIC_BASE_DEC
211         {
212             // Prefix
213             {
214                 /* string       */ ZYAN_NULL,
215                 /* string_data  */ ZYAN_DEFINE_STRING_VIEW(""),
216                 /* buffer       */ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
217             },
218             // Suffix
219             {
220                 /* string       */ ZYAN_NULL,
221                 /* string_data  */ ZYAN_DEFINE_STRING_VIEW(""),
222                 /* buffer       */ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
223             }
224         },
225         // ZYDIS_NUMERIC_BASE_HEX
226         {
227             // Prefix
228             {
229                 /* string       */ ZYAN_NULL,
230                 /* string_data  */ ZYAN_DEFINE_STRING_VIEW(""),
231                 /* buffer       */ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
232             },
233             // Suffix
234             {
235                 /* string       */ &FORMATTER_INTEL_MASM.number_format[
236                                        ZYDIS_NUMERIC_BASE_HEX][1].string_data,
237                 /* string_data  */ ZYAN_DEFINE_STRING_VIEW("h"),
238                 /* buffer       */ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
239             }
240         }
241     },
242     /* func_pre_instruction     */ ZYAN_NULL,
243     /* func_post_instruction    */ ZYAN_NULL,
244     /* func_format_instruction  */ &ZydisFormatterIntelFormatInstructionMASM,
245     /* func_pre_operand         */ ZYAN_NULL,
246     /* func_post_operand        */ ZYAN_NULL,
247     /* func_format_operand_reg  */ &ZydisFormatterBaseFormatOperandREG,
248     /* func_format_operand_mem  */ &ZydisFormatterIntelFormatOperandMEM,
249     /* func_format_operand_ptr  */ &ZydisFormatterBaseFormatOperandPTR,
250     /* func_format_operand_imm  */ &ZydisFormatterBaseFormatOperandIMM,
251     /* func_print_mnemonic      */ &ZydisFormatterIntelPrintMnemonic,
252     /* func_print_register      */ &ZydisFormatterIntelPrintRegister,
253     /* func_print_address_abs   */ &ZydisFormatterIntelPrintAddressMASM,
254     /* func_print_address_rel   */ &ZydisFormatterIntelPrintAddressMASM,
255     /* func_print_disp          */ &ZydisFormatterIntelPrintDISP,
256     /* func_print_imm           */ &ZydisFormatterBasePrintIMM,
257     /* func_print_typecast      */ &ZydisFormatterIntelPrintTypecast,
258     /* func_print_segment       */ &ZydisFormatterBasePrintSegment,
259     /* func_print_prefixes      */ &ZydisFormatterBasePrintPrefixes,
260     /* func_print_decorator     */ &ZydisFormatterBasePrintDecorator
261 };
262 
263 /* ---------------------------------------------------------------------------------------------- */
264 
265 /* ============================================================================================== */
266 
267 #ifdef __cplusplus
268 }
269 #endif
270 
271 #endif // ZYDIS_FORMATTER_INTEL_H
272