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); }
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); }
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); }
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); }