duckstation

duckstation, but archived from the revision just before upstream changed it to a proprietary software project, this version is the libre one
git clone https://git.neptards.moe/u3shit/duckstation.git
Log | Files | Refs | README | LICENSE

FormatterIntel.h (12869B)


      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