diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/arch/x86/Makefile.am | 2 | ||||
| -rw-r--r-- | src/arch/x86/instruction.c | 10 | ||||
| -rw-r--r-- | src/arch/x86/instruction.h | 6 | ||||
| -rw-r--r-- | src/arch/x86/op_movs.c | 66 | ||||
| -rw-r--r-- | src/arch/x86/op_movsx.c | 36 | ||||
| -rw-r--r-- | src/arch/x86/op_stos.c | 66 | ||||
| -rw-r--r-- | src/arch/x86/opcodes.h | 9 | ||||
| -rw-r--r-- | src/arch/x86/operand.c | 165 | ||||
| -rw-r--r-- | src/arch/x86/operand.h | 37 | ||||
| -rw-r--r-- | src/arch/x86/processor.c | 14 | 
10 files changed, 407 insertions, 4 deletions
diff --git a/src/arch/x86/Makefile.am b/src/arch/x86/Makefile.am index 2fd5cd7..5c684e2 100644 --- a/src/arch/x86/Makefile.am +++ b/src/arch/x86/Makefile.am @@ -17,6 +17,7 @@ libarchx86_la_SOURCES =					\  	op_lea.c							\  	op_leave.c							\  	op_mov.c							\ +	op_movs.c							\  	op_movsx.c							\  	op_movzx.c							\  	op_mul.c							\ @@ -36,6 +37,7 @@ libarchx86_la_SOURCES =					\  	op_set.c							\  	op_shl.c							\  	op_shr.c							\ +	op_stos.c							\  	op_sub.c							\  	op_test.c							\  	op_xchg.c							\ diff --git a/src/arch/x86/instruction.c b/src/arch/x86/instruction.c index 72143ee..3e47d13 100644 --- a/src/arch/x86/instruction.c +++ b/src/arch/x86/instruction.c @@ -112,6 +112,7 @@ static x86_instruction _instructions[XOP_COUNT] = {      [XOP_MOVZX_R1632_RM8]           = { false, 0xb6, IDX_TO_EXT(-1), "movzx", XPX_TWO_BYTES | XPX_OPERAND_SIZE_OVERRIDE },      [XOP_MOVSX_R1632_RM8]           = { false, 0xbe, IDX_TO_EXT(-1), "movsx", XPX_TWO_BYTES | XPX_OPERAND_SIZE_OVERRIDE }, +    [XOP_MOVSX_R1632_RM1632]        = { false, 0xbf, IDX_TO_EXT(-1), "movsx", XPX_TWO_BYTES | XPX_OPERAND_SIZE_OVERRIDE },      [XOP_ADC_RM8_R8]                = { false, 0x10, IDX_TO_EXT(-1), "adc", XPX_NONE }, @@ -266,9 +267,12 @@ static x86_instruction _instructions[XOP_COUNT] = {      [XOP_MOV_MOFFS1632_E_AX]        = { false, 0xa3, IDX_TO_EXT(-1), "mov", XPX_OPERAND_SIZE_OVERRIDE }, +    [XOP_MOVS_M1632_M1632]          = { false, 0xa5, IDX_TO_EXT(-1), "movs", XPX_OPERAND_SIZE_OVERRIDE }, +      [XOP_TEST_AL_IMM8]              = { false, 0xa8, IDX_TO_EXT(-1), "test", XPX_NONE },      [XOP_TEST_E_AX_IMM1632]         = { false, 0xa9, IDX_TO_EXT(-1), "test", XPX_OPERAND_SIZE_OVERRIDE }, +    [XOP_STOS_M1632_E_AX]           = { false, 0xab, IDX_TO_EXT(-1), "stos", XPX_OPERAND_SIZE_OVERRIDE },      [XOP_SCAS_AL_M8]                = { false, 0xae, IDX_TO_EXT(-1), "scas", XPX_NONE }, @@ -521,6 +525,7 @@ X86Opcodes x86_guess_next_instruction(const bin_t *data, off_t pos, off_t len, X                  *prefix |= XPX_OPERAND_SIZE_OVERRIDE;                  break;              case 0xf2: +            case 0xf3:                  pos++;                  extra |= XPX_REPEAT_STRING_OPERATION;                  break; @@ -583,8 +588,11 @@ static const char *x86_get_instruction_text(const GX86Instruction *instr, const      result = strdup(_instructions[instr->type].keyword); +    /* FIXME : +       http://www.intel.com/software/products/documentation/vlin/mergedprojects/analyzer_ec/mergedprojects/reference_olh/mergedProjects/instructions/instruct32_hh/vc276.htm +    */      if (instr->prefixes & XPX_REPEAT_STRING_OPERATION) -        result = strprep(result, "repnz "); +        result = strprep(result, "rep "/*"repnz "*/);      return result; diff --git a/src/arch/x86/instruction.h b/src/arch/x86/instruction.h index de5f124..0db591f 100644 --- a/src/arch/x86/instruction.h +++ b/src/arch/x86/instruction.h @@ -62,6 +62,7 @@ typedef enum _X86Opcodes      XOP_MOVZX_R1632_RM8,                    /* movzx ([0x66] 0x0f 0xb6)    */      XOP_MOVSX_R1632_RM8,                    /* movsx ([0x66] 0x0f 0xbe)    */ +    XOP_MOVSX_R1632_RM1632,                 /* movsx ([0x66] 0x0f 0xbf)    */      XOP_ADC_RM8_R8,                         /* adc (0x10)                  */ @@ -208,9 +209,14 @@ typedef enum _X86Opcodes      XOP_MOV_MOFFS1632_E_AX,                 /* mov ([0x66] 0xa3)           */ + +    XOP_MOVS_M1632_M1632,                   /* movs ([0x66] 0xa5)          */ +      XOP_TEST_AL_IMM8,                       /* test (0xa8)                 */      XOP_TEST_E_AX_IMM1632,                  /* test ([0x66] 0xa9)          */ +    XOP_STOS_M1632_E_AX,                    /* stos ([0x66] 0xab)          */ +      XOP_SCAS_AL_M8,                         /* scas (0xae)                 */ diff --git a/src/arch/x86/op_movs.c b/src/arch/x86/op_movs.c new file mode 100644 index 0000000..64c8685 --- /dev/null +++ b/src/arch/x86/op_movs.c @@ -0,0 +1,66 @@ + +/* OpenIDA - Outil d'analyse de fichiers binaires + * op_movs.c - décodage des déplacements de données + * + * Copyright (C) 2009 Cyrille Bagard + * + *  This file is part of OpenIDA. + * + *  OpenIDA is free software; you can redistribute it and/or modify + *  it under the terms of the GNU General Public License as published by + *  the Free Software Foundation; either version 3 of the License, or + *  (at your option) any later version. + * + *  OpenIDA is distributed in the hope that it will be useful, + *  but WITHOUT ANY WARRANTY; without even the implied warranty of + *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the + *  GNU General Public License for more details. + * + *  You should have received a copy of the GNU General Public License + *  along with Foobar.  If not, see <http://www.gnu.org/licenses/>. + */ + + +#include <malloc.h> + + +#include "../instruction-int.h" +#include "opcodes.h" +#include "operand.h" + + + +/****************************************************************************** +*                                                                             * +*  Paramètres  : data = flux de données à analyser.                           * +*                pos  = position courante dans ce flux. [OUT]                 * +*                len  = taille totale des données à analyser.                 * +*                addr = adresse virtuelle de l'instruction.                   * +*                proc = architecture ciblée par le désassemblage.             * +*                                                                             * +*  Description : Décode une instruction de type 'movs' (16 ou 32 bits).       * +*                                                                             * +*  Retour      : Instruction mise en place ou NULL.                           * +*                                                                             * +*  Remarques   : -                                                            * +*                                                                             * +******************************************************************************/ + +GArchInstruction *x86_read_instr_movs_m1632_m1632(const bin_t *data, off_t *pos, off_t len, vmpa_t addr, X86Prefix prefix, const GX86Processor *proc) +{ +    GArchInstruction *result;               /* Instruction à retourner     */ +    AsmOperandSize oprsize;                 /* Taille des opérandes        */ + +    result = g_x86_instruction_new(XOP_MOVS_M1632_M1632); + +    oprsize = g_x86_processor_get_operand_size(proc, prefix); + +    if (!x86_read_two_operands(result, data, pos, len, X86_OTP_DST_1632, X86_OTP_SRC_1632, oprsize)) +    { +        /* TODO free(result);*/ +        return NULL; +    } + +    return result; + +} diff --git a/src/arch/x86/op_movsx.c b/src/arch/x86/op_movsx.c index 74b1b0b..7e8a09b 100644 --- a/src/arch/x86/op_movsx.c +++ b/src/arch/x86/op_movsx.c @@ -64,3 +64,39 @@ GArchInstruction *x86_read_instr_movsx_r1632_rm8(const bin_t *data, off_t *pos,      return result;  } + + +/****************************************************************************** +*                                                                             * +*  Paramètres  : data = flux de données à analyser.                           * +*                pos  = position courante dans ce flux. [OUT]                 * +*                len  = taille totale des données à analyser.                 * +*                addr = adresse virtuelle de l'instruction.                   * +*                proc = architecture ciblée par le désassemblage.             * +*                                                                             * +*  Description : Décode une instruction de type 'movsx' (16 ou 32 bits).      * +*                                                                             * +*  Retour      : Instruction mise en place ou NULL.                           * +*                                                                             * +*  Remarques   : -                                                            * +*                                                                             * +******************************************************************************/ + +GArchInstruction *x86_read_instr_movsx_r1632_rm1632(const bin_t *data, off_t *pos, off_t len, vmpa_t addr, X86Prefix prefix, const GX86Processor *proc) +{ +    GArchInstruction *result;               /* Instruction à retourner     */ +    AsmOperandSize oprsize;                 /* Taille des opérandes        */ + +    result = g_x86_instruction_new(XOP_MOVSX_R1632_RM1632); + +    oprsize = g_x86_processor_get_operand_size(proc, prefix); + +    if (!x86_read_two_operands(result, data, pos, len, X86_OTP_R1632, X86_OTP_RM1632, oprsize)) +    { +        /* TODO free(result);*/ +        return NULL; +    } + +    return result; + +} diff --git a/src/arch/x86/op_stos.c b/src/arch/x86/op_stos.c new file mode 100644 index 0000000..bf47ee7 --- /dev/null +++ b/src/arch/x86/op_stos.c @@ -0,0 +1,66 @@ + +/* OpenIDA - Outil d'analyse de fichiers binaires + * op_stos.c - décodage des enregistrements de données + * + * Copyright (C) 2009 Cyrille Bagard + * + *  This file is part of OpenIDA. + * + *  OpenIDA is free software; you can redistribute it and/or modify + *  it under the terms of the GNU General Public License as published by + *  the Free Software Foundation; either version 3 of the License, or + *  (at your option) any later version. + * + *  OpenIDA is distributed in the hope that it will be useful, + *  but WITHOUT ANY WARRANTY; without even the implied warranty of + *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the + *  GNU General Public License for more details. + * + *  You should have received a copy of the GNU General Public License + *  along with Foobar.  If not, see <http://www.gnu.org/licenses/>. + */ + + +#include <malloc.h> + + +#include "../instruction-int.h" +#include "opcodes.h" +#include "operand.h" + + + +/****************************************************************************** +*                                                                             * +*  Paramètres  : data = flux de données à analyser.                           * +*                pos  = position courante dans ce flux. [OUT]                 * +*                len  = taille totale des données à analyser.                 * +*                addr = adresse virtuelle de l'instruction.                   * +*                proc = architecture ciblée par le désassemblage.             * +*                                                                             * +*  Description : Décode une instruction de type 'stos' (16 ou 32 bits).       * +*                                                                             * +*  Retour      : Instruction mise en place ou NULL.                           * +*                                                                             * +*  Remarques   : -                                                            * +*                                                                             * +******************************************************************************/ + +GArchInstruction *x86_read_instr_stos_m1632_e_ax(const bin_t *data, off_t *pos, off_t len, vmpa_t addr, X86Prefix prefix, const GX86Processor *proc) +{ +    GArchInstruction *result;               /* Instruction à retourner     */ +    AsmOperandSize oprsize;                 /* Taille des opérandes        */ + +    result = g_x86_instruction_new(XOP_STOS_M1632_E_AX); + +    oprsize = g_x86_processor_get_operand_size(proc, prefix); + +    if (!x86_read_two_operands(result, data, pos, len, X86_OTP_DST_1632, X86_OTP_E_AX, oprsize)) +    { +        /* TODO free(result);*/ +        return NULL; +    } + +    return result; + +} diff --git a/src/arch/x86/opcodes.h b/src/arch/x86/opcodes.h index e45b107..16ace49 100644 --- a/src/arch/x86/opcodes.h +++ b/src/arch/x86/opcodes.h @@ -267,9 +267,15 @@ GArchInstruction *x86_read_instr_mov_rm1632_r1632(const bin_t *, off_t *, off_t,  /* Décode une instruction de type 'mov' (8 bits). */  GArchInstruction *x86_read_instr_mov_rm8_r8(const bin_t *, off_t *, off_t, vmpa_t, X86Prefix, const GX86Processor *); +/* Décode une instruction de type 'movs' (16 ou 32 bits). */ +GArchInstruction *x86_read_instr_movs_m1632_m1632(const bin_t *, off_t *, off_t, vmpa_t, X86Prefix, const GX86Processor *); +  /* Décode une instruction de type 'movsx' (16 ou 32 bits). */  GArchInstruction *x86_read_instr_movsx_r1632_rm8(const bin_t *, off_t *, off_t, vmpa_t, X86Prefix, const GX86Processor *); +/* Décode une instruction de type 'movsx' (16 ou 32 bits). */ +GArchInstruction *x86_read_instr_movsx_r1632_rm1632(const bin_t *, off_t *, off_t, vmpa_t, X86Prefix, const GX86Processor *); +  /* Décode une instruction de type 'movzx' (16 ou 32 bits). */  GArchInstruction *x86_read_instr_movzx_r1632_rm8(const bin_t *, off_t *, off_t, vmpa_t, X86Prefix, const GX86Processor *); @@ -366,6 +372,9 @@ GArchInstruction *x86_read_instr_shl_rm1632_imm8(const bin_t *, off_t *, off_t,  /* Décode une instruction de type 'shr' (16 ou 32 bits). */  GArchInstruction *x86_read_instr_shr_rm1632_imm8(const bin_t *, off_t *, off_t, vmpa_t, X86Prefix, const GX86Processor *); +/* Décode une instruction de type 'stos' (16 ou 32 bits). */ +GArchInstruction *x86_read_instr_stos_m1632_e_ax(const bin_t *, off_t *, off_t, vmpa_t, X86Prefix, const GX86Processor *); +  /* Décode une instruction de type 'sub al, ...' (8 bits). */  GArchInstruction *x86_read_instr_sub_al_imm8(const bin_t *, off_t *, off_t, vmpa_t, X86Prefix, const GX86Processor *); diff --git a/src/arch/x86/operand.c b/src/arch/x86/operand.c index d0e923f..09a3489 100644 --- a/src/arch/x86/operand.c +++ b/src/arch/x86/operand.c @@ -191,6 +191,38 @@ static void g_x86_moffs_operand_add_to_gtk_buffer(const GX86MOffsOperand *, cons +/* ---------------------- OPERANDES DE MANIPULATION DE DONNEES ---------------------- */ + + +/* Définition d'un opérande x86 de manipulation de données (instance) */ +struct _GX86DataOperand +{ +    GX86Operand parent;                     /* Instance parente            */ + +    GX86Register *reg;                      /* Registre représenté         */ +    bool dest;                              /* Déduction du type de segment*/ + +}; + +/* Définition d'un opérande x86 de manipulation de données (classe) */ +struct _GX86DataOperandClass +{ +    GX86OperandClass parent;                /* Classe parente              */ + +}; + + +/* Initialise la classe des opérandes x86 pointant des données. */ +static void g_x86_data_operand_class_init(GX86DataOperandClass *); + +/* Initialise une instance d'opérande x86 pointant des données. */ +static void g_x86_data_operand_init(GX86DataOperand *); + +/* Ajoute à un texte GTK le contenu d'un opérande. */ +static void g_x86_data_operand_add_to_gtk_buffer(const GX86DataOperand *, const GExeFormat *, AsmSyntax, GtkTextBuffer *, GtkTextIter *); + + +  /* ---------------------------------------------------------------------------------- */  /*                        COQUILLE VIDE POUR LES OPERANDES X86                        */  /* ---------------------------------------------------------------------------------- */ @@ -987,6 +1019,121 @@ static void g_x86_moffs_operand_add_to_gtk_buffer(const GX86MOffsOperand *operan  /* ---------------------------------------------------------------------------------- */ +/*                        OPERANDES DE MANIPULATION DE DONNEES                        */ +/* ---------------------------------------------------------------------------------- */ + + +/* Indique le type défini par la GLib pour un opérande x86 de manipulation de données. */ +G_DEFINE_TYPE(GX86DataOperand, g_x86_data_operand, G_TYPE_X86_OPERAND); + + +/****************************************************************************** +*                                                                             * +*  Paramètres  : klass = classe à initialiser.                                * +*                                                                             * +*  Description : Initialise la classe des opérandes x86 pointant des données. * +*                                                                             * +*  Retour      : -                                                            * +*                                                                             * +*  Remarques   : -                                                            * +*                                                                             * +******************************************************************************/ + +static void g_x86_data_operand_class_init(GX86DataOperandClass *klass) +{ + +} + + +/****************************************************************************** +*                                                                             * +*  Paramètres  : operand = instance à initialiser.                            * +*                                                                             * +*  Description : Initialise une instance d'opérande pointant des données.     * +*                                                                             * +*  Retour      : -                                                            * +*                                                                             * +*  Remarques   : -                                                            * +*                                                                             * +******************************************************************************/ + +static void g_x86_data_operand_init(GX86DataOperand *operand) +{ +    GContentExporter *parent;               /* Instance parente            */ + +    parent = G_CONTENT_EXPORTER(operand); + +    parent->add_arch_to_gtk_buffer = (add_arch_to_gtk_buffer_fc)g_x86_data_operand_add_to_gtk_buffer; + +} + + +/****************************************************************************** +*                                                                             * +*  Paramètres  : size = taille de l'opérande, et donc du registre.            * +*                dest = indique si la cible est une destination ou une source.* +*                                                                             * +*  Description : Crée un opérande x86 de manipulation de données.             * +*                                                                             * +*  Retour      : Opérande mis en place.                                       * +*                                                                             * +*  Remarques   : -                                                            * +*                                                                             * +******************************************************************************/ + +GArchOperand *g_x86_data_operand_new(MemoryDataSize size, bool dest) +{ +    GX86DataOperand *result;                /* Structure à retourner       */ + +    result = g_object_new(G_TYPE_X86_DATA_OPERAND, NULL); + +    result->reg = g_x86_register_new(size, dest ? 0x07 : 0x06); +    result->dest = dest; + +    return G_ARCH_OPERAND(result); + +} + + +/****************************************************************************** +*                                                                             * +*  Paramètres  : operand = opérande à transcrire.                             * +*                format = format du binaire manipulé.                         * +*                syntax = type de représentation demandée.                    * +*                buffer = zone de texte à venir compléter.                    * +*                iter   = point d'insertion du nouveau texte.                 * +*                                                                             * +*  Description : Ajoute à un texte GTK le contenu d'un opérande.              * +*                                                                             * +*  Retour      : -                                                            * +*                                                                             * +*  Remarques   : -                                                            * +*                                                                             * +******************************************************************************/ + +static void g_x86_data_operand_add_to_gtk_buffer(const GX86DataOperand *operand, const GExeFormat *format, AsmSyntax syntax, GtkTextBuffer *buffer, GtkTextIter *iter) +{ +    if (operand->dest) +        g_content_exporter_insert_with_gtk_tag(G_CONTENT_EXPORTER(operand), buffer, iter, +                                               "es:", 3, RTT_SEGMENT); +    else +        g_content_exporter_insert_with_gtk_tag(G_CONTENT_EXPORTER(operand), buffer, iter, +                                               "ds:", 3, RTT_SEGMENT); + +    g_content_exporter_insert_with_gtk_tag(G_CONTENT_EXPORTER(operand), buffer, iter, +                                           "[", 1, RTT_HOOK); + +    g_content_exporter_add_arch_to_gtk_buffer(G_CONTENT_EXPORTER(operand->reg), format, +                                              syntax, buffer, iter); + +    g_content_exporter_insert_with_gtk_tag(G_CONTENT_EXPORTER(operand), buffer, iter, +                                           "]", 1, RTT_HOOK); + +} + + + +/* ---------------------------------------------------------------------------------- */  /*                           AIDE A LA CREATION D'OPERANDES                           */  /* ---------------------------------------------------------------------------------- */ @@ -1138,6 +1285,24 @@ bool _x86_read_operands(GArchInstruction *instr, const bin_t *data, off_t *pos,                  op = g_x86_mod_rm_operand_new(data, &op_pos[i], len, oprsize);                  break; +            case X86_OTP_DST_8: +                op = g_x86_data_operand_new(MDS_8_BITS, true); +                break; + +            case X86_OTP_DST_1632: +                if (oprsize == AOS_UNDEFINED) oprsize = va_arg(ap, AsmOperandSize); +                op = g_x86_data_operand_new(oprsize == AOS_32_BITS ? MDS_32_BITS : MDS_16_BITS, true); +                break; + +            case X86_OTP_SRC_8: +                op = g_x86_data_operand_new(MDS_8_BITS, false); +                break; + +            case X86_OTP_SRC_1632: +                if (oprsize == AOS_UNDEFINED) oprsize = va_arg(ap, AsmOperandSize); +                op = g_x86_data_operand_new(oprsize == AOS_32_BITS ? MDS_32_BITS : MDS_16_BITS, false); +                break; +              case X86_OTP_CL:                  op = g_x86_register_operand_new_from_index(0x01, AOS_8_BITS);                  break; diff --git a/src/arch/x86/operand.h b/src/arch/x86/operand.h index fc40b38..2d8232d 100644 --- a/src/arch/x86/operand.h +++ b/src/arch/x86/operand.h @@ -169,6 +169,30 @@ GArchOperand *g_x86_moffs_operand_new(const bin_t *, off_t *, off_t, AsmOperandS +/* ---------------------- OPERANDES DE MANIPULATION DE DONNEES ---------------------- */ + + +#define G_TYPE_X86_DATA_OPERAND                  g_x86_data_operand_get_type() +#define G_X86_DATA_OPERAND(obj)                  (G_TYPE_CHECK_INSTANCE_CAST((obj), g_x86_data_operand_get_type(), GX86DataOperand)) +#define G_IS_X86_DATA_OPERAND(obj)               (G_TYPE_CHECK_INSTANCE_TYPE((obj), g_x86_data_operand_get_type())) +#define G_X86_DATA_OPERAND_GET_IFACE(inst)       (G_TYPE_INSTANCE_GET_INTERFACE((inst), g_x86_data_operand_get_type(), GX86DataOperandIface)) + + +/* Définition d'un opérande x86 de manipulation de données (instance) */ +typedef struct _GX86DataOperand GX86DataOperand; + +/* Définition d'un opérande x86 de manipulation de données (classe) */ +typedef struct _GX86DataOperandClass GX86DataOperandClass; + + +/* Indique le type défini par la GLib pour un opérande x86 de manipulation de données. */ +GType g_x86_data_operand_get_type(void); + +/* Crée un opérande x86 de manipulation de données. */ +GArchOperand *g_x86_data_operand_new(MemoryDataSize, bool); + + +  /* ------------------------- AIDE A LA CREATION D'OPERANDES ------------------------- */ @@ -177,10 +201,12 @@ GArchOperand *g_x86_moffs_operand_new(const bin_t *, off_t *, off_t, AsmOperandS  #define X86_OTP_IMM_TYPE    0x8000  #define X86_OTP_REG_TYPE    0x4000  #define X86_OTP_RM_TYPE     0x2000 +#define X86_OTP_DATA_TYPE   0x1000 -#define X86_OTP_IMM(b)  X86_OTP_IMM_TYPE | (1 << b) -#define X86_OTP_REG(b)  X86_OTP_REG_TYPE | (1 << b) -#define X86_OTP_RM(b)   X86_OTP_RM_TYPE  | (1 << b) +#define X86_OTP_IMM(b)  X86_OTP_IMM_TYPE  | (1 << b) +#define X86_OTP_REG(b)  X86_OTP_REG_TYPE  | (1 << b) +#define X86_OTP_RM(b)   X86_OTP_RM_TYPE   | (1 << b) +#define X86_OTP_DATA(b) X86_OTP_DATA_TYPE | (1 << b)  /* Types d'opérandes supportés */  typedef enum _X86OperandType @@ -200,6 +226,11 @@ typedef enum _X86OperandType      X86_OTP_RM8         = X86_OTP_RM(1),    /* Registre 8 bits ou mémoire  */      X86_OTP_RM1632      = X86_OTP_RM(2),    /* Registre 16/32b ou mémoire  */ +    X86_OTP_DST_8       = X86_OTP_DATA(1),  /* Emplacement sur 8 bits      */ +    X86_OTP_DST_1632    = X86_OTP_DATA(2),  /* Emplacement sur 16/32 bits  */ +    X86_OTP_SRC_8       = X86_OTP_DATA(3),  /* Emplacement sur 8 bits      */ +    X86_OTP_SRC_1632    = X86_OTP_DATA(4),  /* Emplacement sur 16/32 bits  */ +      X86_OTP_CL          = 0x0ffd,           /* Registre cl                 */      X86_OTP_AL          = 0x0ffe,           /* Registre al                 */      X86_OTP_E_AX        = 0x0fff            /* Registre eax ou ax          */ diff --git a/src/arch/x86/processor.c b/src/arch/x86/processor.c index 3dc5fc2..97cdb78 100644 --- a/src/arch/x86/processor.c +++ b/src/arch/x86/processor.c @@ -299,6 +299,10 @@ static GArchInstruction *g_x86_processor_decode_instruction(const GX86Processor              result = x86_read_instr_movsx_r1632_rm8(data, pos, len, addr, prefix, proc);              break; +        case XOP_MOVSX_R1632_RM1632: +            result = x86_read_instr_movsx_r1632_rm1632(data, pos, len, addr, prefix, proc); +            break; + @@ -659,6 +663,11 @@ static GArchInstruction *g_x86_processor_decode_instruction(const GX86Processor +        case XOP_MOVS_M1632_M1632: +            result = x86_read_instr_movs_m1632_m1632(data, pos, len, addr, prefix, proc); +            break; + +          case XOP_TEST_AL_IMM8:              result = x86_read_instr_test_al_imm8(data, pos, len, addr, prefix, proc);              break; @@ -668,6 +677,11 @@ static GArchInstruction *g_x86_processor_decode_instruction(const GX86Processor              break; +        case XOP_STOS_M1632_E_AX: +            result = x86_read_instr_stos_m1632_e_ax(data, pos, len, addr, prefix, proc); +            break; + +          case XOP_SCAS_AL_M8:              result = x86_read_instr_scas_al_m8(data, pos, len, addr, prefix, proc);              break;  | 
