static int disassemble(RAsm *a, RAsmOp *op, const ut8 *buf, int len) { char *tmp = NULL; r_8051_op o = r_8051_decode (buf, len); memset(op->buf_asm, 0, sizeof (op->buf_asm)); if (!o.name) return 0; // invalid instruction tmp = r_8051_disasm (o, a->pc, op->buf_asm, sizeof (op->buf_asm)); if (tmp) { if (strlen(tmp) < sizeof (op->buf_asm)) { strncpy (op->buf_asm, tmp, strlen (tmp)); } else { eprintf ("8051 disassemble: too big opcode!\n"); free (tmp); op->size = -1; return -1; } free (tmp); } if (!*op->buf_asm) { op->size = 1; return -1; } return (op->size = o.length); }
static int i8051_op(RAnal *anal, RAnalOp *op, ut64 addr, const ut8 *buf, int len) { char *tmp = NULL; char buf_asm[64]; op->delay = 0; r_8051_op o = r_8051_decode (buf, len); memset(buf_asm, 0, sizeof (buf_asm)); if (!o.name) return 0; // invalid instruction tmp = r_8051_disasm (o, addr, buf_asm, sizeof (buf_asm)); if (tmp) { if (strlen (tmp) < sizeof (buf_asm)) { strncpy (buf_asm, tmp, strlen (tmp)); } else { eprintf ("8051 analysis: too big opcode!\n"); free (tmp); op->size = -1; return -1; } free (tmp); } if (!strncmp (buf_asm, "push", 4)) { op->type = R_ANAL_OP_TYPE_UPUSH; op->ptr = 0; op->stackop = R_ANAL_STACK_INC; op->stackptr = 1; } else if (!strncmp (buf_asm, "pop", 3)) { op->type = R_ANAL_OP_TYPE_POP; op->ptr = 0; op->stackop = R_ANAL_STACK_INC; op->stackptr = -1; } else if (!strncmp (buf_asm, "ret", 3)) { op->type = R_ANAL_OP_TYPE_RET; op->stackop = R_ANAL_STACK_INC; op->stackptr = -2; } else if (!strncmp (buf_asm, "nop", 3)) { op->type = R_ANAL_OP_TYPE_NOP; } else if (!strncmp (buf_asm, "inv", 3)) { op->type = R_ANAL_OP_TYPE_ILL; } else if ((!strncmp (buf_asm, "inc", 3)) || (!strncmp (buf_asm, "add", 3))) { op->type = R_ANAL_OP_TYPE_ADD; } else if ((!strncmp (buf_asm, "dec", 3)) || (!strncmp (buf_asm, "sub", 3))) { op->type = R_ANAL_OP_TYPE_SUB; } else if (!strncmp (buf_asm, "mov", 3)) { op->type = R_ANAL_OP_TYPE_MOV; } else if (*buf_asm && !strncmp (buf_asm+1, "call", 4)) { op->type = R_ANAL_OP_TYPE_CALL; op->jump = o.addr; op->fail = addr+o.length; } else /* CJNE, DJNZ, JC, JNC, JZ, JB, JNB, LJMP, SJMP */ if (buf_asm[0]=='j' || (buf_asm[0] && buf_asm[1] == 'j')) { op->type = R_ANAL_OP_TYPE_JMP; if (o.operand == OFFSET) op->jump = o.addr+addr+o.length; else op->jump = o.addr; op->fail = addr+o.length; } if (anal->decode) { ut8 copy[3] = {0, 0, 0}; memcpy (copy, buf, len >= 3 ? 3 : len); analop_esil (anal, op, addr, copy, buf_asm); } return op->size = o.length; }