Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
stenzek
GitHub Repository: stenzek/duckstation
Path: blob/master/dep/zydis/include/Zydis/Internal/FormatterATT.h
4219 views
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
185