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