xref: /haiku/headers/libs/zydis/Zydis/Internal/FormatterATT.h (revision 909af08f4328301fbdef1ffb41f566c3b5bec0c7)
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 `AT&T` style instruction-formatter.
30  */
31 
32 #ifndef ZYDIS_FORMATTER_ATT_H
33 #define ZYDIS_FORMATTER_ATT_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 /* Instruction                                                                                    */
49 /* ---------------------------------------------------------------------------------------------- */
50 
51 ZyanStatus ZydisFormatterATTFormatInstruction(const ZydisFormatter* formatter,
52     ZydisFormatterBuffer* buffer, ZydisFormatterContext* context);
53 
54 /* ---------------------------------------------------------------------------------------------- */
55 /* Operands                                                                                       */
56 /* ---------------------------------------------------------------------------------------------- */
57 
58 ZyanStatus ZydisFormatterATTFormatOperandMEM(const ZydisFormatter* formatter,
59     ZydisFormatterBuffer* buffer, ZydisFormatterContext* context);
60 
61 /* ---------------------------------------------------------------------------------------------- */
62 /* Elemental tokens                                                                               */
63 /* ---------------------------------------------------------------------------------------------- */
64 
65 ZyanStatus ZydisFormatterATTPrintMnemonic(const ZydisFormatter* formatter,
66     ZydisFormatterBuffer* buffer, ZydisFormatterContext* context);
67 
68 ZyanStatus ZydisFormatterATTPrintRegister(const ZydisFormatter* formatter,
69     ZydisFormatterBuffer* buffer, ZydisFormatterContext* context, ZydisRegister reg);
70 
71 ZyanStatus ZydisFormatterATTPrintAddressABS(const ZydisFormatter* formatter,
72     ZydisFormatterBuffer* buffer, ZydisFormatterContext* context);
73 
74 ZyanStatus ZydisFormatterATTPrintDISP(const ZydisFormatter* formatter,
75     ZydisFormatterBuffer* buffer, ZydisFormatterContext* context);
76 
77 ZyanStatus ZydisFormatterATTPrintIMM(const ZydisFormatter* formatter,
78     ZydisFormatterBuffer* buffer, ZydisFormatterContext* context);
79 
80 /* ---------------------------------------------------------------------------------------------- */
81 
82 /* ============================================================================================== */
83 /* Fomatter presets                                                                               */
84 /* ============================================================================================== */
85 
86 /* ---------------------------------------------------------------------------------------------- */
87 /* AT&T                                                                                           */
88 /* ---------------------------------------------------------------------------------------------- */
89 
90 /**
91  * The default formatter configuration for `AT&T` style disassembly.
92  */
93 static const ZydisFormatter FORMATTER_ATT =
94 {
95     /* style                    */ ZYDIS_FORMATTER_STYLE_ATT,
96     /* force_memory_size        */ ZYAN_FALSE,
97     /* force_memory_seg         */ ZYAN_FALSE,
98     /* force_memory_scale       */ ZYAN_TRUE,
99     /* force_relative_branches  */ ZYAN_FALSE,
100     /* force_relative_riprel    */ ZYAN_FALSE,
101     /* print_branch_size        */ ZYAN_FALSE,
102     /* detailed_prefixes        */ ZYAN_FALSE,
103     /* addr_base                */ ZYDIS_NUMERIC_BASE_HEX,
104     /* addr_signedness          */ ZYDIS_SIGNEDNESS_SIGNED,
105     /* addr_padding_absolute    */ ZYDIS_PADDING_AUTO,
106     /* addr_padding_relative    */ 2,
107     /* disp_base                */ ZYDIS_NUMERIC_BASE_HEX,
108     /* disp_signedness          */ ZYDIS_SIGNEDNESS_SIGNED,
109     /* disp_padding             */ 2,
110     /* imm_base                 */ ZYDIS_NUMERIC_BASE_HEX,
111     /* imm_signedness           */ ZYDIS_SIGNEDNESS_AUTO,
112     /* imm_padding              */ 2,
113     /* case_prefixes            */ ZYDIS_LETTER_CASE_DEFAULT,
114     /* case_mnemonic            */ ZYDIS_LETTER_CASE_DEFAULT,
115     /* case_registers           */ ZYDIS_LETTER_CASE_DEFAULT,
116     /* case_typecasts           */ ZYDIS_LETTER_CASE_DEFAULT,
117     /* case_decorators          */ ZYDIS_LETTER_CASE_DEFAULT,
118     /* hex_uppercase            */ ZYAN_TRUE,
119     /* hex_force_leading_number */ ZYAN_FALSE,
120     /* number_format            */
121     {
122         // ZYDIS_NUMERIC_BASE_DEC
123         {
124             // Prefix
125             {
126                 /* string       */ ZYAN_NULL,
127                 /* string_data  */ ZYAN_DEFINE_STRING_VIEW(""),
128                 /* buffer       */ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
129             },
130             // Suffix
131             {
132                 /* string       */ ZYAN_NULL,
133                 /* string_data  */ ZYAN_DEFINE_STRING_VIEW(""),
134                 /* buffer       */ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
135             }
136         },
137         // ZYDIS_NUMERIC_BASE_HEX
138         {
139             // Prefix
140             {
141                 /* string       */ &FORMATTER_ATT.number_format[
142                                      ZYDIS_NUMERIC_BASE_HEX][0].string_data,
143                 /* string_data  */ ZYAN_DEFINE_STRING_VIEW("0x"),
144                 /* buffer       */ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
145             },
146             // Suffix
147             {
148                 /* string       */ ZYAN_NULL,
149                 /* string_data  */ ZYAN_DEFINE_STRING_VIEW(""),
150                 /* buffer       */ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
151             }
152         }
153     },
154     /* func_pre_instruction     */ ZYAN_NULL,
155     /* func_post_instruction    */ ZYAN_NULL,
156     /* func_format_instruction  */ &ZydisFormatterATTFormatInstruction,
157     /* func_pre_operand         */ ZYAN_NULL,
158     /* func_post_operand        */ ZYAN_NULL,
159     /* func_format_operand_reg  */ &ZydisFormatterBaseFormatOperandREG,
160     /* func_format_operand_mem  */ &ZydisFormatterATTFormatOperandMEM,
161     /* func_format_operand_ptr  */ &ZydisFormatterBaseFormatOperandPTR,
162     /* func_format_operand_imm  */ &ZydisFormatterBaseFormatOperandIMM,
163     /* func_print_mnemonic      */ &ZydisFormatterATTPrintMnemonic,
164     /* func_print_register      */ &ZydisFormatterATTPrintRegister,
165     /* func_print_address_abs   */ &ZydisFormatterATTPrintAddressABS,
166     /* func_print_address_rel   */ &ZydisFormatterBasePrintAddressREL,
167     /* func_print_disp          */ &ZydisFormatterATTPrintDISP,
168     /* func_print_imm           */ &ZydisFormatterATTPrintIMM,
169     /* func_print_typecast      */ ZYAN_NULL,
170     /* func_print_segment       */ &ZydisFormatterBasePrintSegment,
171     /* func_print_prefixes      */ &ZydisFormatterBasePrintPrefixes,
172     /* func_print_decorator     */ &ZydisFormatterBasePrintDecorator
173 };
174 
175 /* ---------------------------------------------------------------------------------------------- */
176 
177 /* ============================================================================================== */
178 
179 #ifdef __cplusplus
180 }
181 #endif
182 
183 #endif // ZYDIS_FORMATTER_ATT_H
184