static int disassemble(RAsm *a, RAsmOp *aop, const ut8 *buf, int len) { m68k_word bof[8] = {0}; int iaddr = (int)a->pc; char opcode[256], operands[256]; const unsigned char *buf2; int ilen ; static struct DisasmPara_68k dp; char *buf_asm; /* initialize DisasmPara */ *operands = *opcode = 0; memcpy (bof, buf, R_MIN(len, sizeof(bof))); dp.opcode = opcode; dp.operands = operands; dp.iaddr = (m68k_word *) (size_t)iaddr; dp.instr = bof; buf2 = (const ut8*)M68k_Disassemble (&dp); if (!buf2) { // invalid instruction return aop->size = 2; } ilen = (buf2-(const ut8*)bof); if (*operands) buf_asm = sdb_fmt ("%s %s", opcode, operands); else buf_asm = sdb_fmt ("%s", opcode); r_str_rmch (buf_asm, '#'); r_asm_op_set_asm (aop, buf_asm); aop->size = ilen; return aop->size; }
static int disassemble(RAsm *a, RAsmOp *op, const ut8 *buf, int len) { cs_insn* insn = NULL; cs_mode mode = 0; int ret, n = 0; csh cd; mode = (a->bits==16)? CS_MODE_THUMB: CS_MODE_ARM; if (a->big_endian) mode |= CS_MODE_BIG_ENDIAN; else mode |= CS_MODE_LITTLE_ENDIAN; if (a->cpu && strstr (a->cpu, "m")) mode |= CS_MODE_MCLASS; if (a->cpu && strstr (a->cpu, "v8")) mode |= CS_MODE_V8; op->size = 4; op->buf_asm[0] = 0; ret = (a->bits==64)? cs_open (CS_ARCH_ARM64, mode, &cd): cs_open (CS_ARCH_ARM, mode, &cd); if (ret) { ret = -1; goto beach; } if (a->syntax == R_ASM_SYNTAX_REGNUM) { cs_option (cd, CS_OPT_SYNTAX, CS_OPT_SYNTAX_NOREGNAME); } else cs_option (cd, CS_OPT_SYNTAX, CS_OPT_SYNTAX_DEFAULT); cs_option (cd, CS_OPT_DETAIL, CS_OPT_OFF); n = cs_disasm (cd, buf, R_MIN (4, len), a->pc, 1, &insn); if (n<1) { ret = -1; goto beach; } if (insn->size<1) { ret = -1; goto beach; } op->size = insn->size; snprintf (op->buf_asm, R_ASM_BUFSIZE, "%s%s%s", insn->mnemonic, insn->op_str[0]?" ":"", insn->op_str); r_str_rmch (op->buf_asm, '#'); cs_free (insn, n); beach: cs_close (&cd); if (!op->buf_asm[0]) strcpy (op->buf_asm, "invalid"); return op->size; }
static int disassemble(RAsm *a, RAsmOp *op, const ut8 *buf, int len) { static int omode = -1; static int obits = 32; cs_insn* insn = NULL; cs_mode mode = 0; int ret, n = 0; mode |= (a->big_endian)? CS_MODE_BIG_ENDIAN: CS_MODE_LITTLE_ENDIAN; if (mode != omode || a->bits != obits) { cs_close (&cd); cd = 0; // unnecessary omode = mode; obits = a->bits; } // replace this with the asm.features? if (a->cpu && strstr (a->cpu, "68000")) mode |= CS_MODE_M68K_000; if (a->cpu && strstr (a->cpu, "68010")) mode |= CS_MODE_M68K_010; if (a->cpu && strstr (a->cpu, "68020")) mode |= CS_MODE_M68K_020; if (a->cpu && strstr (a->cpu, "68030")) mode |= CS_MODE_M68K_030; if (a->cpu && strstr (a->cpu, "68040")) mode |= CS_MODE_M68K_040; if (a->cpu && strstr (a->cpu, "68060")) mode |= CS_MODE_M68K_060; op->size = 4; op->buf_asm[0] = 0; if (cd == 0) { ret = cs_open (CS_ARCH_M68K, mode, &cd); if (ret) { ret = -1; goto beach; } } if (a->features && *a->features) { cs_option (cd, CS_OPT_DETAIL, CS_OPT_ON); } else { cs_option (cd, CS_OPT_DETAIL, CS_OPT_OFF); } n = cs_disasm (cd, buf, R_MIN (8, len), a->pc, 1, &insn); if (n<1) { ret = -1; goto beach; } op->size = 0; if (insn->size<1) { ret = -1; goto beach; } if (a->features && *a->features) { if (!check_features (a, insn)) { op->size = insn->size; strcpy (op->buf_asm, "illegal"); } } if (!op->size) { op->size = insn->size; snprintf (op->buf_asm, R_ASM_BUFSIZE, "%s%s%s", insn->mnemonic, insn->op_str[0]?" ":"", insn->op_str); } { char *p = r_str_replace (strdup (op->buf_asm), "$", "0x", true); if (p) { strncpy (op->buf_asm, p, R_ASM_BUFSIZE-1); free (p); } } cs_free (insn, n); beach: //cs_close (&cd); if (!strncmp (op->buf_asm, "dc.w", 4)) { strcpy (op->buf_asm, "invalid"); } r_str_rmch (op->buf_asm, '#'); return op->size; }
static int disassemble(RAsm *a, RAsmOp *op, const ut8 *buf, int len) { static int omode = -1; static int obits = 32; cs_insn* insn = NULL; cs_mode mode = 0; int ret, n = 0; mode |= (a->bits == 16)? CS_MODE_THUMB: CS_MODE_ARM; mode |= (a->big_endian)? CS_MODE_BIG_ENDIAN: CS_MODE_LITTLE_ENDIAN; if (mode != omode || a->bits != obits) { cs_close (&cd); cd = 0; // unnecessary omode = mode; obits = a->bits; } if (a->features && strstr (a->features, "mclass")) mode |= CS_MODE_MCLASS; if (a->features && strstr (a->features, "v8")) mode |= CS_MODE_V8; op->size = 4; op->buf_asm[0] = 0; if (cd == 0) { ret = (a->bits == 64)? cs_open (CS_ARCH_ARM64, mode, &cd): cs_open (CS_ARCH_ARM, mode, &cd); if (ret) { ret = -1; goto beach; } } if (a->syntax == R_ASM_SYNTAX_REGNUM) { cs_option (cd, CS_OPT_SYNTAX, CS_OPT_SYNTAX_NOREGNAME); } else cs_option (cd, CS_OPT_SYNTAX, CS_OPT_SYNTAX_DEFAULT); if (a->features && *a->features) { cs_option (cd, CS_OPT_DETAIL, CS_OPT_ON); } else { cs_option (cd, CS_OPT_DETAIL, CS_OPT_OFF); } n = cs_disasm (cd, buf, R_MIN (4, len), a->pc, 1, &insn); if (n < 1) { ret = -1; goto beach; } op->size = 0; if (insn->size<1) { ret = -1; goto beach; } if (a->features && *a->features) { if (!check_features (a, insn)) { op->size = insn->size; strcpy (op->buf_asm, "illegal"); } } if (!op->size) { op->size = insn->size; snprintf (op->buf_asm, R_ASM_BUFSIZE, "%s%s%s", insn->mnemonic, insn->op_str[0]?" ":"", insn->op_str); r_str_rmch (op->buf_asm, '#'); } cs_free (insn, n); beach: //cs_close (&cd); if (!op->buf_asm[0]) strcpy (op->buf_asm, "invalid"); return op->size; }