Zydis  master
FormatterIntel.h
Go to the documentation of this file.
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 
32 #ifndef ZYDIS_FORMATTER_INTEL_H
33 #define ZYDIS_FORMATTER_INTEL_H
34 
35 #include <Zydis/Formatter.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 
53 
56 
59 
62 
63 ZyanStatus ZydisFormatterIntelPrintDISP(const ZydisFormatter* formatter,
65 
68 
69 /* ---------------------------------------------------------------------------------------------- */
70 /* MASM */
71 /* ---------------------------------------------------------------------------------------------- */
72 
75 
78 
79 /* ---------------------------------------------------------------------------------------------- */
80 
81 /* ============================================================================================== */
82 /* Fomatter presets */
83 /* ============================================================================================== */
84 
85 /* ---------------------------------------------------------------------------------------------- */
86 /* INTEL */
87 /* ---------------------------------------------------------------------------------------------- */
88 
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[
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  /* deco_apx_nf_use_suffix */ ZYAN_FALSE,
154  /* deco_apx_dfv_use_immediate */ ZYAN_FALSE,
155  /* func_pre_instruction */ ZYAN_NULL,
156  /* func_post_instruction */ ZYAN_NULL,
157  /* func_format_instruction */ &ZydisFormatterIntelFormatInstruction,
158  /* func_pre_operand */ ZYAN_NULL,
159  /* func_post_operand */ ZYAN_NULL,
160  /* func_format_operand_reg */ &ZydisFormatterBaseFormatOperandREG,
161  /* func_format_operand_mem */ &ZydisFormatterIntelFormatOperandMEM,
162  /* func_format_operand_ptr */ &ZydisFormatterBaseFormatOperandPTR,
163  /* func_format_operand_imm */ &ZydisFormatterBaseFormatOperandIMM,
164  /* func_print_mnemonic */ &ZydisFormatterIntelPrintMnemonic,
165  /* func_print_register */ &ZydisFormatterIntelPrintRegister,
166  /* func_print_address_abs */ &ZydisFormatterBasePrintAddressABS,
167  /* func_print_address_rel */ &ZydisFormatterBasePrintAddressREL,
168  /* func_print_disp */ &ZydisFormatterIntelPrintDISP,
169  /* func_print_imm */ &ZydisFormatterBasePrintIMM,
170  /* func_print_typecast */ &ZydisFormatterIntelPrintTypecast,
171  /* func_print_segment */ &ZydisFormatterBasePrintSegment,
172  /* func_print_prefixes */ &ZydisFormatterBasePrintPrefixes,
173  /* func_print_decorator */ &ZydisFormatterBasePrintDecorator
174 };
175 
176 /* ---------------------------------------------------------------------------------------------- */
177 /* MASM */
178 /* ---------------------------------------------------------------------------------------------- */
179 
183 static const ZydisFormatter FORMATTER_INTEL_MASM =
184 {
186  /* force_memory_size */ ZYAN_TRUE,
187  /* force_memory_seg */ ZYAN_FALSE,
188  /* force_memory_scale */ ZYAN_TRUE,
189  /* force_relative_branches */ ZYAN_FALSE,
190  /* force_relative_riprel */ ZYAN_FALSE,
191  /* print_branch_size */ ZYAN_FALSE,
192  /* detailed_prefixes */ ZYAN_FALSE,
193  /* addr_base */ ZYDIS_NUMERIC_BASE_HEX,
194  /* addr_signedness */ ZYDIS_SIGNEDNESS_SIGNED,
195  /* addr_padding_absolute */ ZYDIS_PADDING_DISABLED,
196  /* addr_padding_relative */ ZYDIS_PADDING_DISABLED,
197  /* disp_base */ ZYDIS_NUMERIC_BASE_HEX,
198  /* disp_signedness */ ZYDIS_SIGNEDNESS_SIGNED,
199  /* disp_padding */ ZYDIS_PADDING_DISABLED,
200  /* imm_base */ ZYDIS_NUMERIC_BASE_HEX,
201  /* imm_signedness */ ZYDIS_SIGNEDNESS_AUTO,
202  /* imm_padding */ ZYDIS_PADDING_DISABLED,
203  /* case_prefixes */ ZYDIS_LETTER_CASE_DEFAULT,
204  /* case_mnemonic */ ZYDIS_LETTER_CASE_DEFAULT,
205  /* case_registers */ ZYDIS_LETTER_CASE_DEFAULT,
206  /* case_typecasts */ ZYDIS_LETTER_CASE_DEFAULT,
207  /* case_decorators */ ZYDIS_LETTER_CASE_DEFAULT,
208  /* hex_uppercase */ ZYAN_TRUE,
209  /* hex_force_leading_number */ ZYAN_TRUE,
210  /* number_format */
211  {
212  // ZYDIS_NUMERIC_BASE_DEC
213  {
214  // Prefix
215  {
216  /* string */ ZYAN_NULL,
217  /* string_data */ ZYAN_DEFINE_STRING_VIEW(""),
218  /* buffer */ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
219  },
220  // Suffix
221  {
222  /* string */ ZYAN_NULL,
223  /* string_data */ ZYAN_DEFINE_STRING_VIEW(""),
224  /* buffer */ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
225  }
226  },
227  // ZYDIS_NUMERIC_BASE_HEX
228  {
229  // Prefix
230  {
231  /* string */ ZYAN_NULL,
232  /* string_data */ ZYAN_DEFINE_STRING_VIEW(""),
233  /* buffer */ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
234  },
235  // Suffix
236  {
237  /* string */ &FORMATTER_INTEL_MASM.number_format[
239  /* string_data */ ZYAN_DEFINE_STRING_VIEW("h"),
240  /* buffer */ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
241  }
242  }
243  },
244  /* deco_apx_nf_use_suffix */ ZYAN_FALSE,
245  /* deco_apx_dfv_use_immediate */ ZYAN_FALSE,
246  /* func_pre_instruction */ ZYAN_NULL,
247  /* func_post_instruction */ ZYAN_NULL,
248  /* func_format_instruction */ &ZydisFormatterIntelFormatInstructionMASM,
249  /* func_pre_operand */ ZYAN_NULL,
250  /* func_post_operand */ ZYAN_NULL,
251  /* func_format_operand_reg */ &ZydisFormatterBaseFormatOperandREG,
252  /* func_format_operand_mem */ &ZydisFormatterIntelFormatOperandMEM,
253  /* func_format_operand_ptr */ &ZydisFormatterBaseFormatOperandPTR,
254  /* func_format_operand_imm */ &ZydisFormatterBaseFormatOperandIMM,
255  /* func_print_mnemonic */ &ZydisFormatterIntelPrintMnemonic,
256  /* func_print_register */ &ZydisFormatterIntelPrintRegister,
257  /* func_print_address_abs */ &ZydisFormatterIntelPrintAddressMASM,
258  /* func_print_address_rel */ &ZydisFormatterIntelPrintAddressMASM,
259  /* func_print_disp */ &ZydisFormatterIntelPrintDISP,
260  /* func_print_imm */ &ZydisFormatterBasePrintIMM,
261  /* func_print_typecast */ &ZydisFormatterIntelPrintTypecast,
262  /* func_print_segment */ &ZydisFormatterBasePrintSegment,
263  /* func_print_prefixes */ &ZydisFormatterBasePrintPrefixes,
264  /* func_print_decorator */ &ZydisFormatterBasePrintDecorator
265 };
266 
267 /* ---------------------------------------------------------------------------------------------- */
268 
269 /* ============================================================================================== */
270 
271 #ifdef __cplusplus
272 }
273 #endif
274 
275 #endif // ZYDIS_FORMATTER_INTEL_H
enum ZydisRegister_ ZydisRegister
Defines the ZydisRegister enum.
Provides formatter functions that are shared between the different formatters.
ZyanStatus ZydisFormatterBasePrintIMM(const ZydisFormatter *formatter, ZydisFormatterBuffer *buffer, ZydisFormatterContext *context)
ZyanStatus ZydisFormatterBasePrintAddressABS(const ZydisFormatter *formatter, ZydisFormatterBuffer *buffer, ZydisFormatterContext *context)
ZyanStatus ZydisFormatterBasePrintPrefixes(const ZydisFormatter *formatter, ZydisFormatterBuffer *buffer, ZydisFormatterContext *context)
ZyanStatus ZydisFormatterBasePrintSegment(const ZydisFormatter *formatter, ZydisFormatterBuffer *buffer, ZydisFormatterContext *context)
ZyanStatus ZydisFormatterBasePrintAddressREL(const ZydisFormatter *formatter, ZydisFormatterBuffer *buffer, ZydisFormatterContext *context)
ZyanStatus ZydisFormatterBaseFormatOperandREG(const ZydisFormatter *formatter, ZydisFormatterBuffer *buffer, ZydisFormatterContext *context)
ZyanStatus ZydisFormatterBaseFormatOperandPTR(const ZydisFormatter *formatter, ZydisFormatterBuffer *buffer, ZydisFormatterContext *context)
ZyanStatus ZydisFormatterBasePrintDecorator(const ZydisFormatter *formatter, ZydisFormatterBuffer *buffer, ZydisFormatterContext *context, ZydisDecorator decorator)
ZyanStatus ZydisFormatterBaseFormatOperandIMM(const ZydisFormatter *formatter, ZydisFormatterBuffer *buffer, ZydisFormatterContext *context)
ZyanStatus ZydisFormatterIntelPrintTypecast(const ZydisFormatter *formatter, ZydisFormatterBuffer *buffer, ZydisFormatterContext *context)
ZyanStatus ZydisFormatterIntelPrintDISP(const ZydisFormatter *formatter, ZydisFormatterBuffer *buffer, ZydisFormatterContext *context)
ZyanStatus ZydisFormatterIntelPrintRegister(const ZydisFormatter *formatter, ZydisFormatterBuffer *buffer, ZydisFormatterContext *context, ZydisRegister reg)
ZyanStatus ZydisFormatterIntelPrintMnemonic(const ZydisFormatter *formatter, ZydisFormatterBuffer *buffer, ZydisFormatterContext *context)
ZyanStatus ZydisFormatterIntelPrintAddressMASM(const ZydisFormatter *formatter, ZydisFormatterBuffer *buffer, ZydisFormatterContext *context)
ZyanStatus ZydisFormatterIntelFormatOperandMEM(const ZydisFormatter *formatter, ZydisFormatterBuffer *buffer, ZydisFormatterContext *context)
ZyanStatus ZydisFormatterIntelFormatInstruction(const ZydisFormatter *formatter, ZydisFormatterBuffer *buffer, ZydisFormatterContext *context)
ZyanStatus ZydisFormatterIntelFormatInstructionMASM(const ZydisFormatter *formatter, ZydisFormatterBuffer *buffer, ZydisFormatterContext *context)
Functions for formatting instructions to human-readable text.
@ ZYDIS_FORMATTER_STYLE_INTEL_MASM
Generates MASM-style disassembly that is directly accepted as input for the MASM assembler.
Definition: Formatter.h:82
@ ZYDIS_FORMATTER_STYLE_INTEL
Generates Intel-style disassembly.
Definition: Formatter.h:75
@ ZYDIS_SIGNEDNESS_AUTO
Automatically choose the most suitable mode based on the operands ZydisDecodedOperand....
Definition: Formatter.h:408
@ ZYDIS_SIGNEDNESS_UNSIGNED
Force unsigned values.
Definition: Formatter.h:416
@ ZYDIS_SIGNEDNESS_SIGNED
Force signed values.
Definition: Formatter.h:412
@ ZYDIS_PADDING_AUTO
Padds the value to the current stack-width for addresses, or to the operand-width for immediate value...
Definition: Formatter.h:444
@ ZYDIS_PADDING_DISABLED
Disables padding.
Definition: Formatter.h:439
@ ZYDIS_NUMERIC_BASE_HEX
Hexadecimal system.
Definition: Formatter.h:385
Provides some internal, more performant, but unsafe helper functions for the ZyanString data-type.
@ ZYDIS_LETTER_CASE_DEFAULT
Uses the given text "as is".
Definition: String.h:72
Defines the ZydisFormatterBuffer struct.
Definition: FormatterBuffer.h:168
Context structure that that is passed to all formatter.
Definition: Formatter.h:687
Context structure keeping track of internal state of the formatter.
Definition: Formatter.h:808
struct ZydisFormatter_::@8 number_format[ZYDIS_NUMERIC_BASE_MAX_VALUE+1][2]
The number formats for all numeric bases.
ZyanStringView string_data
The ZyanStringView to use as prefix/suffix.
Definition: Formatter.h:924