/* * Disassemble floating-point ("escape") instruction * and return updated location. */ db_addr_t db_disasm_esc(db_addr_t loc, int inst, int short_addr, int size, int rex, char *seg) { int regmodrm; struct finst *fp; int mod; struct i_addr address; char * name; get_value_inc(regmodrm, loc, 1, FALSE); fp = &db_Esc_inst[inst - 0xd8][f_reg(regmodrm, 0)]; mod = f_mod(regmodrm); if (mod != 3) { if (*fp->f_name == '\0') { db_printf("<bad instruction>"); return (loc); } /* * Normal address modes. */ loc = db_read_address(loc, short_addr, regmodrm, rex, &address); db_printf("%s", fp->f_name); switch (fp->f_size) { case SNGL: db_printf("s"); break; case DBLR: db_printf("l"); break; case EXTR: db_printf("t"); break; case WORD: db_printf("s"); break; case LONG: db_printf("l"); break; case QUAD: db_printf("q"); break; default: break; } db_printf("\t"); db_print_address(seg, BYTE, &address); } else { /* * 'reg-reg' - special formats */ switch (fp->f_rrmode) { case op2(ST,STI): name = (fp->f_rrname) ? fp->f_rrname : fp->f_name; db_printf("%s\t%%st,%%st(%d)",name, f_rm(regmodrm, 0)); break; case op2(STI,ST): name = (fp->f_rrname) ? fp->f_rrname : fp->f_name; db_printf("%s\t%%st(%d),%%st",name, f_rm(regmodrm, 0)); break; case op1(STI): name = (fp->f_rrname) ? fp->f_rrname : fp->f_name; db_printf("%s\t%%st(%d)",name, f_rm(regmodrm, 0)); break; case op1(X): name = ((char * const *)fp->f_rrname)[f_rm(regmodrm,0)]; if (*name == '\0') goto bad; db_printf("%s", name); break; case op1(XA): name = ((char * const *)fp->f_rrname)[f_rm(regmodrm,0)]; if (*name == '\0') goto bad; db_printf("%s\t%%ax", name); break; default: bad: db_printf("<bad instruction>"); break; } } return (loc); }
void launch_by_pointer(const Function *f) { // copy to registers Function f_reg = *f; f_reg(); }