static int first_nibble_is_2(RAnal* anal, RAnalOp* op, ut16 code){ //TODO handle mov.x Rm, @Rn, (X)OR/AND regs, if (IS_MOVB_REG_TO_REGREF(code)){ op->type = R_ANAL_OP_TYPE_MOV; op->src[0] = anal_fill_ai_rg(anal,GET_SOURCE_REG(code)); op->dst = anal_fill_reg_ref(anal,GET_TARGET_REG(code),BYTE_SIZE); } else if (IS_MOVW_REG_TO_REGREF(code)){ op->type = R_ANAL_OP_TYPE_MOV; op->src[0] = anal_fill_ai_rg(anal,GET_SOURCE_REG(code)); op->dst = anal_fill_reg_ref(anal,GET_TARGET_REG(code),WORD_SIZE); } else if (IS_MOVL_REG_TO_REGREF(code)){ op->type = R_ANAL_OP_TYPE_MOV; op->src[0] = anal_fill_ai_rg(anal,GET_SOURCE_REG(code)); op->dst = anal_fill_reg_ref(anal,GET_TARGET_REG(code),LONG_SIZE); } else if (IS_AND_REGS(code)){ op->type = R_ANAL_OP_TYPE_AND; op->src[0] = anal_fill_ai_rg(anal,GET_SOURCE_REG(code)); op->dst = anal_fill_ai_rg(anal,GET_TARGET_REG(code)); } else if (IS_XOR_REGS(code)){ op->type = R_ANAL_OP_TYPE_XOR; op->src[0] = anal_fill_ai_rg(anal,GET_SOURCE_REG(code)); op->dst = anal_fill_ai_rg(anal,GET_TARGET_REG(code)); } else if (IS_OR_REGS(code)){ op->type = R_ANAL_OP_TYPE_OR; op->src[0] = anal_fill_ai_rg(anal,GET_SOURCE_REG(code)); op->dst = anal_fill_ai_rg(anal,GET_TARGET_REG(code)); } //TODO Handle 'pushes' (mov Rm,@-Rn) //TODO Handle CMP/STR ?? return op->size; }
static int first_nibble_is_2(RAnal* anal, RAnalOp* op, ut16 code){ if (IS_MOVB_REG_TO_REGREF(code)) { // 0010nnnnmmmm0000 mov.b <REG_M>,@<REG_N> op->type = R_ANAL_OP_TYPE_STORE; op->src[0] = anal_fill_ai_rg (anal, GET_SOURCE_REG(code)); op->dst = anal_fill_reg_ref (anal, GET_TARGET_REG(code), BYTE_SIZE); } else if (IS_MOVW_REG_TO_REGREF(code)) { op->type = R_ANAL_OP_TYPE_STORE; op->src[0] = anal_fill_ai_rg (anal, GET_SOURCE_REG(code)); op->dst = anal_fill_reg_ref (anal, GET_TARGET_REG(code), WORD_SIZE); } else if (IS_MOVL_REG_TO_REGREF(code)) { op->type = R_ANAL_OP_TYPE_STORE; op->src[0] = anal_fill_ai_rg (anal, GET_SOURCE_REG(code)); op->dst = anal_fill_reg_ref (anal, GET_TARGET_REG(code), LONG_SIZE); } else if (IS_AND_REGS(code)) { op->type = R_ANAL_OP_TYPE_AND; op->src[0] = anal_fill_ai_rg (anal, GET_SOURCE_REG(code)); op->dst = anal_fill_ai_rg (anal, GET_TARGET_REG(code)); } else if (IS_XOR_REGS(code)) { op->type = R_ANAL_OP_TYPE_XOR; op->src[0] = anal_fill_ai_rg (anal, GET_SOURCE_REG(code)); op->dst = anal_fill_ai_rg (anal, GET_TARGET_REG(code)); } else if (IS_OR_REGS(code)) { op->type = R_ANAL_OP_TYPE_OR; op->src[0] = anal_fill_ai_rg (anal, GET_SOURCE_REG(code)); op->dst = anal_fill_ai_rg (anal, GET_TARGET_REG(code)); } else if (IS_PUSHB(code) || IS_PUSHW(code) || IS_PUSHL(code)) { op->type = R_ANAL_OP_TYPE_PUSH; //TODO Handle 'pushes' (mov Rm,@-Rn) } else if (IS_TSTRR(code)) { op->type = R_ANAL_OP_TYPE_ACMP; //TODO: handle tst reg,reg } else if (IS_CMPSTR(code)) { //0010nnnnmmmm1100 cmp/str <REG_M>,<REG_N> op->type = R_ANAL_OP_TYPE_ACMP; //maybe not? op->src[0] = anal_fill_ai_rg (anal, GET_SOURCE_REG(code)); op->src[1] = anal_fill_ai_rg (anal, GET_TARGET_REG(code)); //todo: handle cmp/str byte-per-byte cmp? } else if (IS_XTRCT(code)) { //0010nnnnmmmm1101 xtrct <REG_M>,<REG_N> op->type = R_ANAL_OP_TYPE_MOV; op->src[0] = anal_fill_ai_rg (anal, GET_SOURCE_REG(code)); op->src[1] = anal_fill_ai_rg (anal, GET_TARGET_REG(code)); op->dst = anal_fill_ai_rg (anal, GET_TARGET_REG(code)); //todo: add details ? } else if (IS_DIV0S(code)) { op->type = R_ANAL_OP_TYPE_DIV; //todo: add details? } else if (IS_MULUW(code) || IS_MULSW(code)) { //0010nnnnmmmm111_ mul{s,u}.w <REG_M>,<REG_N> op->type = R_ANAL_OP_TYPE_MUL; op->src[0] = anal_fill_ai_rg(anal,GET_SOURCE_REG(code)); op->src[1] = anal_fill_ai_rg(anal,GET_TARGET_REG(code)); //todo: dest=MACL } return op->size; }
static int first_nibble_is_6(RAnal* anal, RAnalOp* op, ut16 code){ if (IS_MOV_REGS(code)) { op->type = R_ANAL_OP_TYPE_MOV; op->src[0] = anal_fill_ai_rg (anal, GET_SOURCE_REG(code)); op->dst = anal_fill_ai_rg (anal, GET_TARGET_REG(code)); } else if (IS_MOVB_REGREF_TO_REG(code)) { op->type = R_ANAL_OP_TYPE_LOAD; op->src[0] = anal_fill_reg_ref (anal, GET_SOURCE_REG(code), BYTE_SIZE); op->dst = anal_fill_ai_rg (anal, GET_TARGET_REG(code)); } else if (IS_MOVW_REGREF_TO_REG(code)) { op->type = R_ANAL_OP_TYPE_LOAD; op->src[0] = anal_fill_reg_ref (anal, GET_SOURCE_REG(code), WORD_SIZE); op->dst = anal_fill_ai_rg (anal, GET_TARGET_REG(code)); } else if (IS_MOVL_REGREF_TO_REG(code)) { op->type = R_ANAL_OP_TYPE_LOAD; op->src[0] = anal_fill_reg_ref (anal, GET_SOURCE_REG(code), LONG_SIZE); op->dst = anal_fill_ai_rg (anal, GET_TARGET_REG(code)); } else if (IS_EXT(code)) { //ext{s,u}.{b,w} instructs. todo : more detail ? op->type = R_ANAL_OP_TYPE_MOV; op->src[0] = anal_fill_ai_rg (anal, GET_SOURCE_REG(code)); op->dst = anal_fill_ai_rg (anal, GET_TARGET_REG(code)); } else if (IS_MOVB_POP(code) || IS_MOVW_POP(code) || IS_MOVL_POP(code)) { /* 0110nnnnmmmm0100 mov.b @<REG_M>+,<REG_N>*/ /* 0110nnnnmmmm0101 mov.w @<REG_M>+,<REG_N>*/ /* 0110nnnnmmmm0110 mov.l @<REG_M>+,<REG_N>*/ op->type = R_ANAL_OP_TYPE_POP; op->dst = anal_fill_ai_rg (anal, GET_TARGET_REG(code)); //todo : op->src for pop = ? } else if (IS_NEG(code)) { //todo: neg and negc details op->type = R_ANAL_OP_TYPE_UNK; /* 0110nnnnmmmm1010 negc*/ /* 0110nnnnmmmm1010 neg */ op->src[0] = anal_fill_ai_rg (anal, GET_SOURCE_REG(code)); op->dst = anal_fill_ai_rg (anal, GET_TARGET_REG(code)); } else if (IS_NOT(code)) { //todo : details? op->type = R_ANAL_OP_TYPE_NOT; op->src[0] = anal_fill_ai_rg (anal, GET_SOURCE_REG(code)); op->dst = anal_fill_ai_rg (anal, GET_TARGET_REG(code)); } else if (IS_SWAP(code)) { /* 0110nnnnmmmm1000 swap.b <REG_M>,<REG_N>*/ /* 0110nnnnmmmm1001 swap.w <REG_M>,<REG_N>*/ op->type = R_ANAL_OP_TYPE_MOV; //todo : details } return op->size; }
static int first_nibble_is_6(RAnal* anal, RAnalOp* op, ut16 code){ if(IS_MOV_REGS(code)){ op->type = R_ANAL_OP_TYPE_MOV; op->src[0] = anal_fill_ai_rg(anal,GET_SOURCE_REG(code)); op->dst = anal_fill_ai_rg(anal,GET_TARGET_REG(code)); } else if (IS_MOVB_REGREF_TO_REG(code)){ op->type = R_ANAL_OP_TYPE_MOV; op->src[0] = anal_fill_reg_ref(anal,GET_SOURCE_REG(code),BYTE_SIZE); op->dst = anal_fill_ai_rg(anal,GET_TARGET_REG(code)); } else if (IS_MOVW_REGREF_TO_REG(code)){ op->type = R_ANAL_OP_TYPE_MOV; op->src[0] = anal_fill_reg_ref(anal,GET_SOURCE_REG(code),WORD_SIZE); op->dst = anal_fill_ai_rg(anal,GET_TARGET_REG(code)); } else if (IS_MOVL_REGREF_TO_REG(code)){ op->type = R_ANAL_OP_TYPE_MOV; op->src[0] = anal_fill_reg_ref(anal,GET_SOURCE_REG(code),LONG_SIZE); op->dst = anal_fill_ai_rg(anal,GET_TARGET_REG(code)); } //TODO neg(c) + MOV.L @Rm+,Rn return op->size; }