int op_xor_al_ib(asm_instr *instr, u_char *opcode, u_int len, asm_processor *proc) {
  instr->instr = ASM_XOR;
  instr->len += 1;
  instr->ptr_instr = opcode;
  instr->type = ASM_TYPE_ARITH | ASM_TYPE_WRITEFLAG;
  instr->flagswritten = ASM_FLAG_CF | ASM_FLAG_OF | ASM_FLAG_PF |
    ASM_FLAG_ZF | ASM_FLAG_SF;

#if WIP
  instr->len += asm_operand_fetch(&instr->op[0], opcode, ASM_OTYPE_FIXED, instr,
				  asm_fixed_pack(0, ASM_OP_BASE, ASM_REG_AL,
						 ASM_REGSET_R8));
  instr->len += asm_operand_fetch(&instr->op[1], opcode + 1,
				  ASM_OTYPE_IMMEDIATEBYTE, instr, 0);
#else
  instr->len += asm_operand_fetch(&instr->op[0], opcode, ASM_OTYPE_FIXED, instr);
  instr->op[0].ptr = opcode;
  instr->op[0].len = 0;
  instr->op[0].baser = ASM_REG_AL;
  instr->op[0].regset = ASM_REGSET_R8;
  instr->len += asm_operand_fetch(&instr->op[1], opcode + 1,
				  ASM_OTYPE_IMMEDIATEBYTE, instr);
#endif

  return (instr->len);
}
int op_retf_i2(asm_instr *instr, u_char *opcode, u_int len, 
               asm_processor *proc)
{
  instr->instr = ASM_RETF;
  instr->ptr_instr = opcode;
  instr->len += 1;
  instr->type = ASM_TYPE_RETPROC | ASM_TYPE_TOUCHSP | ASM_TYPE_EPILOG;

#if WIP
  instr->len += asm_operand_fetch(&instr->op[0], opcode + 1,
                                ASM_OTYPE_IMMEDIATEWORD, instr, 0);
#else
  instr->len += asm_operand_fetch(&instr->op[0], opcode + 1,
                                ASM_OTYPE_IMMEDIATEWORD, instr);
#endif
  return (instr->len);
}
Exemple #3
0
int op_xor_rmv_rv(asm_instr *instr, u_char *opcode, u_int len, 
                  asm_processor *proc)
{
  instr->len += 1;
  instr->ptr_instr = opcode;
  instr->instr = ASM_XOR;
  instr->type = ASM_TYPE_ARITH | ASM_TYPE_WRITEFLAG;
  instr->flagswritten = ASM_FLAG_CF | ASM_FLAG_OF | ASM_FLAG_PF |
                        ASM_FLAG_ZF | ASM_FLAG_SF;

#if WIP
  instr->len += asm_operand_fetch(&instr->op[0], opcode + 1, ASM_OTYPE_ENCODED, instr, 0);
  instr->len += asm_operand_fetch(&instr->op[1], opcode + 1, ASM_OTYPE_GENERAL, instr, 0);
#else
  instr->len += asm_operand_fetch(&instr->op[0], opcode + 1, ASM_OTYPE_ENCODED, instr);
  instr->len += asm_operand_fetch(&instr->op[1], opcode + 1, ASM_OTYPE_GENERAL, instr);
#endif
  return (instr->len);
}
int op_xchg_rmb_rb(asm_instr *instr, u_char *opcode, u_int len, 
                   asm_processor *proc)
{
  instr->len += 1;
  instr->ptr_instr = opcode;
  instr->instr = ASM_XCHG;
  instr->type = ASM_TYPE_LOAD | ASM_TYPE_STORE;

#if WIP
  instr->len += asm_operand_fetch(&instr->op[0], opcode + 1, ASM_OTYPE_ENCODEDBYTE, 
                                instr, 0);
  instr->len += asm_operand_fetch(&instr->op[1], opcode + 1, ASM_OTYPE_GENERALBYTE, 
                                instr, 0);
#else
  instr->len += asm_operand_fetch(&instr->op[0], opcode + 1, ASM_OTYPE_ENCODEDBYTE, 
                                instr);
  instr->len += asm_operand_fetch(&instr->op[1], opcode + 1, ASM_OTYPE_GENERALBYTE, 
                                instr);
#endif

  return (instr->len);
}
Exemple #5
0
int op_cmpsb(asm_instr *instr, u_char *opcode, u_int len, asm_processor *proc)
{
  instr->instr = ASM_CMPSB;
  instr->len += 1;
  instr->ptr_instr = opcode;

  instr->type = ASM_TYPE_COMPARISON | ASM_TYPE_WRITEFLAG;
  instr->flagswritten = ASM_FLAG_AF | ASM_FLAG_CF | ASM_FLAG_PF |
                        ASM_FLAG_OF | ASM_FLAG_SF | ASM_FLAG_ZF;

#if WIP
  instr->len += asm_operand_fetch(&instr->op[0], opcode + 1, ASM_OTYPE_XSRC, instr, 0);
#else
  instr->len += asm_operand_fetch(&instr->op[0], opcode + 1, ASM_OTYPE_XSRC, instr);
#endif
#if WIP
  instr->len += asm_operand_fetch(&instr->op[1], opcode + 1, ASM_OTYPE_YDEST, instr, 0);
#else
  instr->len += asm_operand_fetch(&instr->op[1], opcode + 1, ASM_OTYPE_YDEST, instr);
#endif

  return (instr->len);
}
Exemple #6
0
int op_esc7(asm_instr *instr, u_char *opcode, u_int len, asm_processor *proc)
{
  struct s_modrm        *modrm;

  modrm = (struct s_modrm *) opcode + 1;
  instr->ptr_instr = opcode;
  instr->len += 1;
  if (*(opcode + 1) == 0xe0) 
  {
    if (!(instr->prefix & ASM_PREFIX_FWAIT))
      instr->instr = ASM_FNSTSW;
    else
      instr->instr = ASM_FSTSW;
    instr->op[0].type = ASM_OTYPE_FIXED;
    instr->op[0].content = ASM_OP_BASE;
    instr->op[0].regset = ASM_REGSET_R16;
    instr->op[0].baser = ASM_REG_EAX;
  } 
  else
  switch (modrm->r) 
  {
    case 0:    
    instr->instr = ASM_FILD;
    break;
    case 1:
    // bad instr->instr = ASM_;
    break;
    case 2:
    instr->instr = ASM_FIST;
    break;
    case 3:
    instr->instr = ASM_FISTP;
    break;
    case 4:
    instr->instr = ASM_FBLD;
    break;
    case 5:
    instr->instr = ASM_FILD;
    break;
    case 6:
    instr->instr = ASM_FBSTP;
    break;
    case 7:
    instr->instr = ASM_FISTP;
    break;
  }
  if (*(opcode + 1) != 0xe0) {
#if LIBASM_USE_OPERAND_VECTOR
#if WIP
    instr->len += asm_operand_fetch(&instr->op[0], opcode + 1, ASM_OTYPE_ENCODED,
				  instr, 0);
#else
    instr->len += asm_operand_fetch(&instr->op[0], opcode + 1, ASM_OTYPE_ENCODED,
				  instr);
#endif
#else
    instr->op[0].type = ASM_OTYPE_ENCODED;
    operand_rmv(&instr->op[0], opcode + 1, len - 1, proc);
    instr->len += instr->op[0].len;
#endif
  } else
  instr->len++;
  return (instr->len);
}