void asm_instruction_debug(asm_instr *ins, FILE *out) { int i; fprintf(out, "ins=[%s] len=[%i] types=[%c|%c%c%c]\n", asm_instr_get_memonic(ins, ins->proc), asm_instr_len(ins), (ins->type & ASM_TYPE_BRANCH) && !(ins->type & ASM_TYPE_CONDCONTROL) ? 'I' : ins->type & ASM_TYPE_CALLPROC ? 'C' : (ins->type & ASM_TYPE_BRANCH) && (ins->type & ASM_TYPE_CONDCONTROL) ? 'J' : ins->type & ASM_TYPE_RETPROC ? 'R' : ' ', ins->type & ASM_TYPE_ARITH ? 'c' : ' ', ins->type & ASM_TYPE_CONTROL ? 'f' : ' ', ins->type & ASM_TYPE_ASSIGN ? 'a' : ' '); for (i = 0; i < 3; i++) { asm_operand_debug(ins, i, 0, out); } }
/** * Display An instruction. * Runtime compatible * @param fd * @param index * @param vaddr * @param foffset * @param size * @param name * @param nindex * @param buff */ int revm_instr_display(int fd, eresi_Addr vaddr, u_int foffset, u_int size, char *name, u_int symoff, char *buff) { char *s; char buf[256]; u_int idx_bytes; int ret; asm_instr ptr; char base[16] = "0123456789ABCDEF"; char logbuf[BUFSIZ]; char c1[2]; char c2[2]; u_int strsz; int err; PROFILER_IN(__FILE__, __FUNCTION__, __LINE__); if (!buff) PROFILER_ERR(__FILE__, __FUNCTION__, __LINE__, "Invalid argument", (-1)); revm_proc_init(); err = 0; /* Print the instr. itself : vaddr and relative symbol resolution */ ret = asm_read_instr(&ptr, (u_char *) buff, size, world.curjob->proc); if (ret == -1) PROFILER_ERR(__FILE__, __FUNCTION__, __LINE__, "Failed to read instruction", ESTD_DISASM_FAILED); s = (!ret ? "(bad)" : asm_display_instr_att(&ptr, vaddr)); /* Libasm test */ if (fd == -1) { /* Are we in quiet mode ? */ if (world.state.revm_quiet) { snprintf(buf, sizeof(buf), " %s %s + %s", revm_coloraddress(XFMT, vaddr), revm_colorstr(name), revm_colornumber("%u", symoff)); size = snprintf(logbuf, BUFSIZ, "%-40s %-30s ", buf, revm_colorinstr(s)); } else { size = snprintf(buf, sizeof(buf), " %s [%s %s] %s + %s", revm_coloraddress(XFMT, vaddr), revm_colorfieldstr("foff:"), revm_colornumber("%u", foffset), revm_colorstr(name), revm_colornumber("%u", symoff)); strsz = strlen(s); size = snprintf(logbuf, BUFSIZ, "%-*s %-*s ", (size > 95 ? 125 : size > 87 ? 100 : size > 75 ? 108 : size > 50 ? 88 : 55), buf, (strsz > 95 ? 125 : strsz > 87 ? 100 : strsz > 75 ? 108 : strsz > 50 ? 88 : 55), revm_colorinstr(s)); } /* Print bytes in hexa for this instruction */ ret = asm_instr_len(&ptr); if (!ret) ret++; if (!world.state.revm_quiet) for (idx_bytes = 0; idx_bytes < (u_int) ret; idx_bytes++) { c1[0] = base[(buff[idx_bytes] >> 4) & 0x0F]; c2[0] = base[buff[idx_bytes] & 0x0F]; c1[1] = c2[1] = 0x00; size += snprintf(logbuf + size, sizeof(logbuf) - size, "%s%s ", revm_colorfieldstr(c1), revm_colorfieldstr(c2)); } if (!world.curjob->curcmd || !world.curjob->curcmd->use_regx[1] || !regexec(&second->name, logbuf, 0, 0, 0)) { snprintf(logbuf + size, sizeof(logbuf) - size, "\n"); err = revm_output(logbuf); } revm_endline(); if (err < 0) PROFILER_ROUT(__FILE__, __FUNCTION__, __LINE__, err); } else