diff options
Diffstat (limited to 'src/arch/x86/processor.c')
| -rw-r--r-- | src/arch/x86/processor.c | 49 | 
1 files changed, 30 insertions, 19 deletions
| diff --git a/src/arch/x86/processor.c b/src/arch/x86/processor.c index 3fde754..8cc3a72 100644 --- a/src/arch/x86/processor.c +++ b/src/arch/x86/processor.c @@ -239,6 +239,7 @@ AsmOperandSize switch_x86_operand_size_if_needed(const asm_x86_processor *proc,  void x86_register_instructions(asm_x86_processor *proc)  {      register_opcode(proc->opcodes[X86_OP_ADD_RM8_R8], 0x00, "add", x86_read_instr_add_rm8_r8); +    register_opcode(proc->opcodes[X86_OP_ADD_RM1632_R1632], 0x01, "add", x86_read_instr_add_rm1632_r1632);      register_opcode_1632(proc->opcodes[X86_OP_SUB_R1632_RM1632], 0x29, "sub", x86_read_instr_sub_r1632_from_rm1632); @@ -289,6 +290,9 @@ void x86_register_instructions(asm_x86_processor *proc)      register_opcode_1632(proc->opcodes[X86_OP_PUSH_IMM1632], 0x68, "push", x86_read_instr_push_imm1632); +    register_opcode(proc->opcodes[X86_OP_JB_REL8], 0x72, "jb", x86_read_instr_jb_rel8); +    register_opcode(proc->opcodes[X86_OP_JNB_REL8], 0x73, "jnb", x86_read_instr_jnb_rel8); +      register_opcode(proc->opcodes[X86_OP_JE_8], 0x74, "je", x86_read_instr_je_8);      register_opcode(proc->opcodes[X86_OP_JNE_8], 0x75, "jne", x86_read_instr_jne_8); @@ -316,6 +320,7 @@ void x86_register_instructions(asm_x86_processor *proc)      register_opcode(proc->opcodes[X86_OP_TEST_RM8_R8], 0x84, "test", x86_read_instr_test_rm8_with_r8);      register_opcode_1632(proc->opcodes[X86_OP_TEST_RM1632_R1632], 0x85, "test", x86_read_instr_test_rm1632_with_r1632); +    register_opcode(proc->opcodes[X86_OP_MOV_RM8_R8], 0x88, "mov", x86_read_instr_mov_rm8_r8);      register_opcode_1632(proc->opcodes[X86_OP_MOV_RM1632_R1632], 0x89, "mov", x86_read_instr_mov_r1632_to_rm1632);      register_opcode_1632(proc->opcodes[X86_OP_MOV_R1632_RM1632], 0x8b, "mov", x86_read_instr_mov_rm1632_to_r1632); @@ -359,6 +364,7 @@ void x86_register_instructions(asm_x86_processor *proc)      register_opcode(proc->opcodes[X86_OP_INT], 0xcd, "int", x86_read_instr_int); +    register_opcode_1632_with_ext(proc->opcodes[X86_OP_SHL_RM1632_CL], 0xd3, 4, "shl", x86_read_instr_shl_rm1632_cl);      register_opcode_1632(proc->opcodes[X86_OP_CALL_REL1632], 0xe8, "call", x86_read_instr_call_rel1632);      register_opcode_1632(proc->opcodes[X86_OP_JMP_REL1632], 0xe9, "jmp", x86_read_instr_jmp_rel1632); @@ -367,11 +373,17 @@ void x86_register_instructions(asm_x86_processor *proc)      register_opcode(proc->opcodes[X86_OP_HLT], 0xf4, "hlt", x86_read_instr_hlt); +    register_opcode_1632_with_ext(proc->opcodes[X86_OP_NOT_RM1632], 0xf7, 7, "not", x86_read_instr_not_rm1632); + +    register_opcode(proc->opcodes[X86_OP_CLD], 0xfc, "cld", x86_read_instr_cld); +      register_opcode_1632_with_ext(proc->opcodes[X86_OP_CALL_RM1632], 0xff, 2, "call", x86_read_instr_call_rm1632);      register_opcode_1632_with_ext(proc->opcodes[X86_OP_JMP_RM1632], 0xff, 4, "jmp", x86_read_instr_jmp_rm1632);      register_opcode_1632_with_ext(proc->opcodes[X86_OP_PUSH_RM1632], 0xff, 6, "push", x86_read_instr_push_rm1632); -    //register_2b_opcode_1632(proc->opcodes[X86_OP_MOVZX_R1632_RM8], 0xb6, "movzx", x86_read_instr_movzx_r1632_rm8); +    register_2b_opcode_1632(proc->opcodes[X86_OP_MOVZX_R1632_RM8], 0xb6, "movzx", x86_read_instr_movzx_r1632_rm8); + +    register_2b_opcode_1632(proc->opcodes[X86_OP_MOVSX_R1632_RM8], 0xbe, "movsx", x86_read_instr_movsx_r1632_rm8);  } @@ -398,33 +410,32 @@ asm_instr *x86_fetch_instruction(const asm_x86_processor *proc, const uint8_t *d  {      asm_x86_instr *result;                  /* Résultat à faire remonter   */      X86Prefix prefix;                       /* Préfixe détecté             */ +    off_t k;                                /* Itération sur le contenu    */      X86Opcodes i;                           /* Boucle de parcours          */      result = NULL;      prefix = X86_PRE_NONE; - consume_prefix: - -    switch (data[*pos]) -    { -        case 0x66: -            prefix |= X86_PRE_OPSIZE; -            (*pos)++; -            break; +    for (k = *pos; k < len; k++) +        switch (data[k]) +        { +            case 0x66: +                prefix |= X86_PRE_OPSIZE; +                break; -        case 0x0f: -            prefix |= X86_PRE_ESCAPE; -            (*pos)++; -            break; +            case 0x0f: +                prefix |= X86_PRE_ESCAPE; +                break; -        default: -            goto found_instr; -            break; +            default: +                goto found_instr; +                break; -    } +        } -    goto consume_prefix; +    /* Contenu binaire tronqué */ +    return NULL;   found_instr: @@ -432,7 +443,7 @@ asm_instr *x86_fetch_instruction(const asm_x86_processor *proc, const uint8_t *d      {          if ((prefix & proc->opcodes[i].prefix) != prefix) continue; -        if (data[*pos] != proc->opcodes[i].opcode) continue; +        if (data[k] != proc->opcodes[i].opcode) continue;          result = proc->opcodes[i].read(data, pos, len, offset, proc);          if (result != NULL) result->type = i; | 
