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

📄 protectedmodeudecoder.java

📁 JPC: x86 PC Hardware Emulator. 牛津大学开发的一个纯JAVA的x86系统结构硬件模拟器。
💻 JAVA
📖 第 1 页 / 共 5 页
字号:
	    bytesRead += 3;	    break;	case 4:	    immediate = (source.getByte() & 0xff) | ((source.getByte() << 8) & 0xff00) | ((source.getByte() << 16) & 0xff0000) | ((source.getByte() << 24) & 0xff000000);	    bytesRead += 4;	    break;	case 6:	    immediate = 0xffffffffl & ((source.getByte() & 0xff) | ((source.getByte() << 8) & 0xff00) | ((source.getByte() << 16) & 0xff0000) | ((source.getByte() << 24) & 0xff000000));	    immediate |= ((source.getByte() & 0xffl) | ((source.getByte() << 8) & 0xff00l)) << 32;	    bytesRead += 6;	    break;	default:	    System.err.println("Immediate Longer Than 6-bytes");	    break;	}	//write out input operands	writeInputOperands(prefices, opcode, modrm, sib, displacement, immediate);	//write out calculation	writeOperation(prefices, opcode, modrm);	//write out output operands	writeOutputOperands(prefices, opcode, modrm, sib, displacement);	//write out flags	writeFlags(prefices, opcode, modrm);	if (isJump(opcode, modrm))	    return -bytesRead;	else	    return bytesRead;    }     private void writeOperation(int prefices, int opcode, int modrm)    {	switch (opcode) {	case 0x00: //ADD Eb, Gb	case 0x01: //ADD Ev, Gv	case 0x02: //ADD Gb, Eb	case 0x03: //ADD Gv, Ev	case 0x04: //ADD AL, Ib	case 0x05: //ADD eAX, Iv	case 0xfc0: //XADD Eb, Gb	case 0xfc1: working.write(ADD); break; //XADD Ev, Gv	case 0x08: //OR  Eb, Gb	case 0x09: //OR  Ev, Gv	case 0x0a: //OR  Gb, Eb	case 0x0b: //OR  Gv, Ev	case 0x0c: //OR  AL, Ib	case 0x0d: working.write(OR ); break; //OR  eAX, Iv	case 0x10: //ADC Eb, Gb	case 0x11: //ADC Ev, Gv	case 0x12: //ADC Gb, Eb	case 0x13: //ADC Gv, Ev	case 0x14: //ADC AL, Ib	case 0x15: working.write(ADC); break; //ADC eAX, Iv	case 0x18: //SBB Eb, Gb	case 0x19: //SBB Ev, Gv	case 0x1a: //SBB Gb, Eb	case 0x1b: //SBB Gv, Ev	case 0x1c: //SBB AL, Ib	case 0x1d: working.write(SBB); break; //SBB eAX, Iv	case 0x20: //AND Eb, Gb	case 0x21: //AND Ev, Gv	case 0x22: //AND Gb, Eb	case 0x23: //AND Gv, Ev	case 0x24: //AND AL, Ib	case 0x25: //AND eAX, Iv		case 0x84: //TEST Eb, Gb	case 0x85: //TEST Ev, Gv	case 0xa8: //TEST AL, Ib	case 0xa9: working.write(AND); break; //TEST eAX, Iv	case 0x27: working.write(DAA); break; //DAA	case 0x28: //SUB Eb, Gb	case 0x29: //SUB Ev, Gv	case 0x2a: //SUB Gb, Eb	case 0x2b: //SUB Gv, Ev	case 0x2c: //SUB AL, Ib	case 0x2d: //SUB eAX, Iv	case 0x38: //CMP Eb, Gb	case 0x39: //CMP Ev, Gv	case 0x3a: //CMP Gb, Eb	case 0x3b: //CMP Gv, Ev	case 0x3c: //CMP AL, Ib	case 0x3d: working.write(SUB); break; //CMP eAX, Iv	case 0x2f: working.write(DAS); break; //DAS	case 0x30: //XOR Eb, Gb	case 0x31: //XOR Ev, Gv	case 0x32: //XOR Gb, Eb	case 0x33: //XOR Gv, Ev	case 0x34: //XOR AL, Ib	case 0x35: working.write(XOR); break; //XOR eAX, Iv	case 0x37: working.write(AAA); break; //AAA	case 0x3f: working.write(AAS); break; //AAS	case 0x40: //INC eAX	case 0x41: //INC eCX	case 0x42: //INC eDX	case 0x43: //INC eBX	case 0x44: //INC eSP	case 0x45: //INC eBP	case 0x46: //INC eSI	case 0x47: working.write(INC); break; //INC eDI	    	case 0x48: //DEC eAX	case 0x49: //DEC eCX	case 0x4a: //DEC eDX	case 0x4b: //DEC eBX	case 0x4c: //DEC eSP	case 0x4d: //DEC eBP	case 0x4e: //DEC eSI	case 0x4f: working.write(DEC); break; //DEC eDI	case 0x06: //PUSH ES	case 0x0e: //PUSH CS	case 0x16: //PUSH SS	case 0x1e: //PUSH DS	case 0x50: //PUSH eAX	case 0x51: //PUSH eCX	case 0x52: //PUSH eDX	case 0x53: //PUSH eBX	case 0x54: //PUSH eSP	case 0x55: //PUSH eBP	case 0x56: //PUSH eSI	case 0x57: //PUSH eDI	case 0x68: //PUSH Iv	case 0x6a: //PUSH Ib	case 0xfa0: //PUSH FS	case 0xfa8: //PUSH GS	    switch (prefices & (PREFICES_OPERAND | PREFICES_ADDRESS)) {	    case 0:		working.write(PUSH_O16_A16); break;	    case PREFICES_OPERAND:		working.write(PUSH_O32_A16); break;	    case PREFICES_ADDRESS:		working.write(PUSH_O16_A32); break;	    case PREFICES_ADDRESS | PREFICES_OPERAND:		working.write(PUSH_O32_A32); break;	    }	    break;	case 0x9c: //PUSHF	    switch (prefices & (PREFICES_OPERAND | PREFICES_ADDRESS)) {	    case 0:		working.write(PUSHF_O16_A16); break;	    case PREFICES_OPERAND:		working.write(PUSHF_O32_A16); break;	    case PREFICES_ADDRESS:		working.write(PUSHF_O16_A32); break;	    case PREFICES_ADDRESS | PREFICES_OPERAND:		working.write(PUSHF_O32_A32); break;	    }	    break;	case 0x07: //POP ES	case 0x17: //POP SS	case 0x1f: //POP DS	case 0x58: //POP eAX	case 0x59: //POP eCX	case 0x5a: //POP eDX	case 0x5b: //POP eBX	case 0x5c: //POP eSP	case 0x5d: //POP eBP	case 0x5e: //POP eSI	case 0x5f: //POP eDI	case 0x8f: //POP Ev	case 0xfa1: //POP FS	case 0xfa9: //POP GS	    switch (prefices & (PREFICES_OPERAND | PREFICES_ADDRESS)) {	    case 0:		working.write(POP_O16_A16); break;	    case PREFICES_OPERAND:		working.write(POP_O32_A16); break;	    case PREFICES_ADDRESS:		working.write(POP_O16_A32); break;	    case PREFICES_ADDRESS | PREFICES_OPERAND:		working.write(POP_O32_A32); break;	    }	    break;	case 0x9d: //POPF	    switch (prefices & (PREFICES_OPERAND | PREFICES_ADDRESS)) {	    case 0:		working.write(POPF_O16_A16); break;	    case PREFICES_OPERAND:		working.write(POPF_O32_A16); break;	    case PREFICES_ADDRESS:		working.write(POPF_O16_A32); break;	    case PREFICES_ADDRESS | PREFICES_OPERAND:		working.write(POPF_O32_A32); break;	    }	    break;	case 0x60: //PUSHA/D	    switch (prefices & PREFICES_OPERAND) {	    case 0:		working.write(PUSHAD_A16); break;	    case PREFICES_OPERAND:		working.write(PUSHAD_A32); break;	    }	    break;	case 0x61: //POPA/D	    switch (prefices & (PREFICES_OPERAND | PREFICES_ADDRESS)) {	    case 0:		working.write(POPA_A16); break;	    case PREFICES_OPERAND:		working.write(POPAD_A16); break;	    case PREFICES_ADDRESS:		working.write(POPA_A32); break;	    case PREFICES_ADDRESS | PREFICES_OPERAND:		working.write(POPAD_A32); break;	    }	    break;	case 0x62: //BOUND	    if ((prefices & PREFICES_OPERAND) != 0)		working.write(BOUND_O32);	    else		working.write(BOUND_O16);	    break;	case 0x69: //IMUL Gv, Ev, Iv	case 0x6b: //IMUL Gv, Ev, Ib	case 0xfaf: //IMUL Gv, Ev	    if ((prefices & PREFICES_OPERAND) != 0)		working.write(IMUL_O32);	    else		working.write(IMUL_O16);	    break;	case 0x6c: //INSB	    if ((prefices & PREFICES_REP) != 0) {		if ((prefices & PREFICES_ADDRESS) != 0)		    working.write(REP_INSB_A32);		else		    working.write(REP_INSB_A16);	    } else {		if ((prefices & PREFICES_ADDRESS) != 0)		    working.write(INSB_A32);		else		    working.write(INSB_A16);	    }	    break;	case 0x6d: //INSW/D	    if ((prefices & PREFICES_OPERAND) != 0) {		if ((prefices & PREFICES_REP) != 0) {		    if ((prefices & PREFICES_ADDRESS) != 0)			working.write(REP_INSD_A32);		    else			working.write(REP_INSD_A16);		} else {		    if ((prefices & PREFICES_ADDRESS) != 0)			working.write(INSD_A32);		    else			working.write(INSD_A16);		}	    } else {		if ((prefices & PREFICES_REP) != 0) {		    if ((prefices & PREFICES_ADDRESS) != 0)			working.write(REP_INSW_A32);		    else			working.write(REP_INSW_A16);		} else {		    if ((prefices & PREFICES_ADDRESS) != 0)			working.write(INSW_A32);		    else			working.write(INSW_A16);		}	    }	    break;	case 0x6e: //OUTSB	    if ((prefices & PREFICES_REP) != 0) {		if ((prefices & PREFICES_ADDRESS) != 0)		    working.write(REP_OUTSB_A32);		else		    working.write(REP_OUTSB_A16);	    } else {		if ((prefices & PREFICES_ADDRESS) != 0)		    working.write(OUTSB_A32);		else		    working.write(OUTSB_A16);	    }	    break;	case 0x6f: //OUTS DX, Xv	    if ((prefices & PREFICES_OPERAND) != 0) {		if ((prefices & PREFICES_REP) != 0) {		    if ((prefices & PREFICES_ADDRESS) != 0)			working.write(REP_OUTSD_A32);		    else			working.write(REP_OUTSD_A16);		} else {		    if ((prefices & PREFICES_ADDRESS) != 0)			working.write(OUTSD_A32);		    else			working.write(OUTSD_A16);		}	    } else {		if ((prefices & PREFICES_REP) != 0) {		    if ((prefices & PREFICES_ADDRESS) != 0)			working.write(REP_OUTSW_A32);		    else			working.write(REP_OUTSW_A16);		} else {		    if ((prefices & PREFICES_ADDRESS) != 0)			working.write(OUTSW_A32);		    else			working.write(OUTSW_A16);		}	    }	    break;	case 0x70: working.write(JO_O8); break;  //JC Jb	case 0x71: working.write(JNO_O8); break; //JNC Jb	case 0x72: working.write(JC_O8); break;  //JC Jb	case 0x73: working.write(JNC_O8); break; //JNC Jb	case 0x74: working.write(JZ_O8); break;  //JZ Jb	case 0x75: working.write(JNZ_O8); break; //JNZ Jb	case 0x76: working.write(JNA_O8); break; //JNA Jb	case 0x77: working.write(JA_O8); break;  //JA Jb	case 0x78: working.write(JS_O8); break;  //JS Jb 	case 0x79: working.write(JNS_O8); break; //JNS Jb	case 0x7a: working.write(JP_O8); break;  //JP Jb 	case 0x7b: working.write(JNP_O8); break; //JNP Jb	case 0x7c: working.write(JL_O8); break;  //JL Jb 	case 0x7d: working.write(JNL_O8); break; //JNL Jb	case 0x7e: working.write(JNG_O8); break;  //JNG Jb 	case 0x7f: working.write(JG_O8); break; //JG Jb	case 0x80: //IMM GP1 Eb, Ib	case 0x81: //IMM GP1 Ev, Iv	case 0x82: //IMM GP1 Eb, Ib	case 0x83: //IMM GP1 Ev, Ib (will have been sign extended to short/int)	    switch (modrm & 0x38) {	    case 0x00:		working.write(ADD); break;	    case 0x08:		working.write(OR); break;	    case 0x10:		working.write(ADC); break;	    case 0x18:		working.write(SBB); break;	    case 0x20:		working.write(AND); break;	    case 0x28:	    case 0x38: //CMP		working.write(SUB); break;	    case 0x30:		working.write(XOR); break;	    }	    break;	case 0x98: //CBW/CWDE	    if ((prefices & PREFICES_OPERAND) != 0) {		working.write(LOAD0_AX);		working.write(SIGN_EXTEND_16_32);		working.write(STORE0_EAX);	    } else {		working.write(LOAD0_AL);		working.write(SIGN_EXTEND_8_16);		working.write(STORE0_AX);	    }	    break;	case 0x99:	    if ((prefices & PREFICES_OPERAND) != 0)		working.write(CDQ);	    else		working.write(CWD);	    break;	case 0x9a: //CALLF	    switch (prefices & (PREFICES_OPERAND | PREFICES_ADDRESS)) {	    case 0:		working.write(CALL_FAR_O16_A16); break;	    case PREFICES_OPERAND:		working.write(CALL_FAR_O32_A16); break;	    case PREFICES_ADDRESS:		working.write(CALL_FAR_O16_A32); break;	    case PREFICES_ADDRESS | PREFICES_OPERAND:		working.write(CALL_FAR_O32_A32); break;	    }	    break;	case 0x9b: working.write(FWAIT); break; //FWAIT	case 0x9e: working.write(SAHF); break;	case 0x9f: working.write(LAHF); break;	case 0xa4: //MOVSB	    if ((prefices & PREFICES_REP) != 0) {		if ((prefices & PREFICES_ADDRESS) != 0)		    working.write(REP_MOVSB_A32);		else		    working.write(REP_MOVSB_A16);	    } else {		if ((prefices & PREFICES_ADDRESS) != 0)		    working.write(MOVSB_A32);		else		    working.write(MOVSB_A16);	    }	    break;	case 0xa5: //MOVSW/D	    if ((prefices & PREFICES_OPERAND) != 0) {		if ((prefices & PREFICES_REP) != 0) {		    if ((prefices & PREFICES_ADDRESS) != 0)			working.write(REP_MOVSD_A32);		    else			working.write(REP_MOVSD_A16);		} else {		    if ((prefices & PREFICES_ADDRESS) != 0)			working.write(MOVSD_A32);		    else			working.write(MOVSD_A16);		}	    } else {		if ((prefices & PREFICES_REP) != 0) {		    if ((prefices & PREFICES_ADDRESS) != 0)			working.write(REP_MOVSW_A32);		    else			working.write(REP_MOVSW_A16);		} else {		    if ((prefices & PREFICES_ADDRESS) != 0)			working.write(MOVSW_A32);		    else			working.write(MOVSW_A16);		}	    }	    break;	case 0xa6: //CMPSB	    if ((prefices & PREFICES_REPE) != 0) {		if ((prefices & PREFICES_ADDRESS) != 0)		    working.write(REPE_CMPSB_A32);		else		    working.write(REPE_CMPSB_A16);	    } else if ((prefices & PREFICES_REPNE) != 0) {		if ((prefices & PREFICES_ADDRESS) != 0)		    working.write(REPNE_CMPSB_A32);		else		    working.write(REPNE_CMPSB_A16);	    } else {		if ((prefices & PREFICES_ADDRESS) != 0)		    working.write(CMPSB_A32);		else

⌨️ 快捷键说明

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