⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ia64dis.cc

📁 功能较全面的反汇编器:反汇编器ht-2.0.15.tar.gz
💻 CC
📖 第 1 页 / 共 2 页
字号:
				slot->op[0].reg = ((slot->data >> 20) & (0x7f));				slot->op[2].type = IA64_OPERAND_REG;				slot->op[2].reg = ((slot->data >> 13) & (0x7f));				break;			case IA64_FORMAT_M18:				slot->op[0].type = IA64_OPERAND_FREG;				slot->op[0].reg = ((slot->data >> 6) & (0x7f));				slot->op[2].type = IA64_OPERAND_REG;				slot->op[2].reg = ((slot->data >> 13) & (0x7f));				break;			case IA64_FORMAT_M19:				slot->op[0].type = IA64_OPERAND_REG;				slot->op[0].reg = ((slot->data >> 6) & (0x7f));				slot->op[2].type = IA64_OPERAND_FREG;				slot->op[2].reg = ((slot->data >> 13) & (0x7f));				break;			case IA64_FORMAT_M30:				slot->op[0].type = IA64_OPERAND_AREG;				slot->op[0].reg = ((slot->data >> 20) & (0x7f));				slot->op[2].type = IA64_OPERAND_IMM;				slot->op[2].imm = ((slot->data >> 13) & 0x7f)							|(((slot->data >> 36) & (1)) << 7);				slot->op[2].imm = signExtend(slot->op[2].imm, 8);				break;			case IA64_FORMAT_M32:				break;			case IA64_FORMAT_M33:				break;			case IA64_FORMAT_M34:				slot->op[0].type = IA64_OPERAND_REG;				slot->op[0].reg = ((slot->data >> 6) & (0x7f));				slot->op[2].type = IA64_OPERAND_AR_PFS;				slot->op[3].type = IA64_OPERAND_IMM;				slot->op[3].imm = (slot->data >> 20) & (0x7f);				slot->op[4].type = IA64_OPERAND_IMM;				slot->op[4].imm = (0);				slot->op[5].type = IA64_OPERAND_IMM;				slot->op[5].imm = ((slot->data >> 13) & 0x7f)-slot->op[3].imm;				slot->op[6].type = IA64_OPERAND_IMM;				slot->op[6].imm = ((slot->data >> 27) & (0xf))<<3;				break;			case IA64_FORMAT_M35:				break;			case IA64_FORMAT_M36:				break;			case IA64_FORMAT_M42:				slot->op[0].type = IA64_OPERAND_REG_FILE;				slot->op[0].regfile.db = slot->opcode->op1.type - IA64_OPTYPE_PMC;				slot->op[0].regfile.idx = ((slot->data >> 20) & (0x7f));								slot->op[2].type = IA64_OPERAND_REG;				slot->op[2].reg = ((slot->data >> 13) & (0x7f));				break;			case IA64_FORMAT_M43:				break;			case IA64_FORMAT_M45:				slot->op[0].type = IA64_OPERAND_REG;				slot->op[0].reg = ((slot->data >> 13) & (0x7f));				slot->op[1].type = IA64_OPERAND_REG;				slot->op[1].reg = ((slot->data >> 20) & (0x7f));				break;			case IA64_FORMAT_X2:				slot->op[0].type = IA64_OPERAND_REG;				slot->op[0].reg = ((slot->data >> 6) & (0x7f));				slot->op[2].type = IA64_OPERAND_IMM;				slot->op[2].imm = ((slot->data >> 13) & (0x7f))						|(((slot->data >> 27) & (0x1ff)) << 7)						|(((slot->data >> 22) & (0x1f)) << 16)						|(((slot->data >> 21) & (1)) << 21)						|(insn.slot[slot_nb+1].data << 22)						|(((slot->data >> 36) & (1)) << 63);				break;			default:				break;		}	}	}dis_insn *IA64Disassembler::decode(byte *code, int maxlen, CPU_ADDR addr){	cpu_addr = addr;	insn.selected = 0;	if (maxlen < 16) {		// invalid		insn.valid = false;		insn.size = maxlen;		if (maxlen) memcpy(insn.data, code, maxlen);	} else {		insn.valid = true;		insn.size = 16;		if (maxlen) memcpy(insn.data, code, maxlen);		insn.tmplt_idx = code[0] & 0x1f;		insn.tmplt = &IA64Templates[insn.tmplt_idx];		if (insn.tmplt->slot[0] == IA64_SLOT_INVALID) {			insn.valid = false;		} else {			insn.slot[0].data = 				  (uint32(code[0]) >> 5)				| (uint32(code[1]) << 3)				| (uint32(code[2]) << 11)				| (uint32(code[3]) << 19)				| (uint32(code[4] & 0x1f) << 27)     // 32 bits				|				  ((uint64(code[4] >> 5)				| (uint64(code[5] & 0x3f) << 3)) << 32);  // +9 = 41 bits			insn.slot[1].data = 				  (uint32(code[5]) >> 6)				| (uint32(code[6]) << 2)				| (uint32(code[7]) << 10)				| (uint32(code[8]) << 18)				| (uint32(code[9] & 0x3f) << 26)    // 32 bits				|				  ((uint64(code[9] >> 6)				| (uint64(code[10] & 0x7f) << 2)) << 32);    // +9 = 41 bits			insn.slot[2].data = 				  (uint32(code[10]) >> 7)				| (uint32(code[11]) << 1)				| (uint32(code[12]) << 9)				| (uint32(code[13]) << 17)				| (uint32(code[14] & 0x7f) << 25)   // 32 bits				|				  ((uint64(code[14] >> 7)				| (uint64(code[15]) << 1)) << 32);           // +9 = 41 bits		}		for (int i=0; i<3; ) {			insn.slot[i].valid = false;			decodeSlot(i);			i += insn.slot[i].next;		}	}	return (dis_insn*)&insn;}dis_insn *IA64Disassembler::duplicateInsn(dis_insn *disasm_insn){	IA64DisInsn *insn = ht_malloc(sizeof (IA64DisInsn));	*insn = *(IA64DisInsn *)disasm_insn;	return insn;}void IA64Disassembler::getOpcodeMetrics(int &min_length, int &max_length, int &min_look_ahead, int &avg_look_ahead, int &addr_align){	min_length = 16;	max_length = 16;	min_look_ahead = 16;	avg_look_ahead = 16;	addr_align = 16;}byte IA64Disassembler::getSize(dis_insn *disasm_insn){	return ((IA64DisInsn*)disasm_insn)->size;}const char *IA64Disassembler::getName(){	return "IA64/Disassembler";}const char *IA64Disassembler::str(dis_insn *disasm_insn, int style){	return strf(disasm_insn, style, "");}const char *IA64Disassembler::strf(dis_insn *disasm_insn, int style, const char *format){	if (style & DIS_STYLE_HIGHLIGHT) enable_highlighting();	const char *cs_default = get_cs(e_cs_default);	const char *cs_number = get_cs(e_cs_number);	const char *cs_symbol = get_cs(e_cs_symbol);//	const char *cs_string = get_cs(e_cs_string);	const char *cs_comment = get_cs(e_cs_comment);	IA64DisInsn *dis_insn = (IA64DisInsn *) disasm_insn;	if (!dis_insn->valid) {		char *is = insnstr + sprintf(insnstr, "db              ");		for (int i=0; i < dis_insn->size; i++) {			is += sprintf(is, "%s%02x", cs_number, dis_insn->data[i]);			if (i==7) is += sprintf(is, "-");		}	} else {		char *is = insnstr;		IA64SlotDisInsn *slot = &dis_insn->slot[dis_insn->selected];		is[0] = 0;		if (slot->valid) {			char qp[10];			if (slot->qp) {				ht_snprintf(qp, sizeof qp, "(p%d)", slot->qp);			} else {				qp[0] = 0;			}			is += ht_snprintf(is, 256, "%s%d %5s %s%-20s", cs_comment, dis_insn->selected, qp, cs_default, slot->opcode->name);			for (int i=0; i < 7; i++) {				if (slot->op[i].type == IA64_OPERAND_NO) break;				if (slot->op[i].type == IA64_OPERAND_EQUALS) {					is += ht_snprintf(is, 256, " %s= ", cs_symbol);					i++;					goto w;				} else {					if (i != 0) is += ht_snprintf(is, 256, "%s, ", cs_symbol);				}				w:				switch (slot->op[i].type) {				case IA64_OPERAND_1:					is += ht_snprintf(is, 256, "%s1", cs_number);					break;				case IA64_OPERAND_REG:					is += ht_snprintf(is, 256, "%sr%d", cs_default, slot->op[i].reg);					break;                              				case IA64_OPERAND_BREG:					is += ht_snprintf(is, 256, "%sbr%d", cs_default, slot->op[i].reg);					break;                              				case IA64_OPERAND_FREG:					is += ht_snprintf(is, 256, "%sf%d", cs_default, slot->op[i].reg);					break;                              				case IA64_OPERAND_PREG:					is += ht_snprintf(is, 256, "%sp%d", cs_default, slot->op[i].reg);					break;				case IA64_OPERAND_AREG:					is += ht_snprintf(is, 256, "%sar%d", cs_default, slot->op[i].reg);					break;				case IA64_OPERAND_PRALL:					is += ht_snprintf(is, 256, "%spr", cs_default);					break;				case IA64_OPERAND_PRROT:					is += ht_snprintf(is, 256, "%spr.rot", cs_default);					break;				case IA64_OPERAND_AR_PFS:					is += ht_snprintf(is, 256, "%sar.pfs", cs_default);					break;				case IA64_OPERAND_IP:					is += ht_snprintf(is, 256, "%sip", cs_default);					break;				case IA64_OPERAND_MEM_REG:					is += ht_snprintf(is, 256, "%s[%sr%d%s]", cs_symbol, cs_default, slot->op[i].reg, cs_symbol);					break;                              				case IA64_OPERAND_IMM:					is += ht_snprintf(is, 256, "%s%qx", cs_number, slot->op[i].imm);					break;                              				case IA64_OPERAND_ADDRESS: {					CPU_ADDR caddr;					caddr.flat64.addr = slot->op[i].ofs;					int slen;					char *s = (addr_sym_func) ? addr_sym_func(caddr, &slen, addr_sym_func_context) : NULL;					if (s) {						char *p = is;						memmove(p, s, slen);						p[slen] = 0;						is += slen;					} else {						is += ht_snprintf(is, 256, "%s0x%qx", cs_number, &slot->op[i].ofs);					}					break;				}				case IA64_OPERAND_REG_FILE: {					const char *dbs[] = {"pmc", "pmd", "pkr", "rr", "ibr", "dbr", "itr", "dtr", "msr"};					is += ht_snprintf(is, 256, "%s%s[%sr%d%s]", dbs[slot->op[i].regfile.db], cs_symbol, cs_default, slot->op[i].regfile.idx, cs_symbol);				}				}			}		} else {			is += ht_snprintf(is, 256, "%s%d       %-20s", cs_comment, dis_insn->selected, "invalid");		}				char tmplt_str[100];		tmplt_str[0] = 0;		char *t = tmplt_str;		for (int i=0; i<3; i++) {		switch (insn.tmplt->slot[i] & 0x0f) {		case IA64_SLOT_INVALID:			t+=sprintf(t, "*");			goto e;			break;		case IA64_SLOT_M_UNIT:			t+=sprintf(t, "M");			break;		case IA64_SLOT_I_UNIT:			t+=sprintf(t, "I");			break;		case IA64_SLOT_L_UNIT:			t+=sprintf(t, "L");			break;		case IA64_SLOT_X_UNIT:			t+=sprintf(t, "X");			break;		case IA64_SLOT_F_UNIT:			t+=sprintf(t, "F");			break;		case IA64_SLOT_B_UNIT:			t+=sprintf(t, "B");			break;		}		}		e:;//		is += ht_snprintf(is, 256, "                   t=%02x(%s) s0=%013Q s1=%013Q s2=%013Q", insn.tmplt_idx, tmplt_str, &insn.slot[0].data, &insn.slot[1].data, &insn.slot[2].data);/*		for (int i=0; i < dis_insn->size; i++) {			is += sprintf(is, "%s%02x", cs_number, dis_insn->data[i]);			if (i==7) is += sprintf(is, "-");		}*/	}		disable_highlighting();	return insnstr;     }ObjectID IA64Disassembler::getObjectID() const{	return ATOM_DISASM_IA64;}bool IA64Disassembler::validInsn(dis_insn *disasm_insn){	return ((IA64DisInsn *)disasm_insn)->valid;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -