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

📄 realmodeudecoder.java

📁 JPC: x86 PC Hardware Emulator. 牛津大学开发的一个纯JAVA的x86系统结构硬件模拟器。
💻 JAVA
📖 第 1 页 / 共 5 页
字号:
			working.write(REPNE_CMPSD_A16);		} else {		    if ((prefices & PREFICES_ADDRESS) != 0)			working.write(CMPSD_A32);		    else			working.write(CMPSD_A16);		}	    } else {		if ((prefices & PREFICES_REPE) != 0) {		    if ((prefices & PREFICES_ADDRESS) != 0)			working.write(REPE_CMPSW_A32);		    else			working.write(REPE_CMPSW_A16);		} else if ((prefices & PREFICES_REPNE) != 0) {		    if ((prefices & PREFICES_ADDRESS) != 0)			working.write(REPNE_CMPSW_A32);		    else			working.write(REPNE_CMPSW_A16);		} else {		    if ((prefices & PREFICES_ADDRESS) != 0)			working.write(CMPSW_A32);		    else			working.write(CMPSW_A16);		}	    }	    break;	    	case 0xaa: //STOSB	    if ((prefices & PREFICES_REP) != 0) {		if ((prefices & PREFICES_ADDRESS) != 0)		    working.write(REP_STOSB_A32);		else		    working.write(REP_STOSB_A16);	    } else {		if ((prefices & PREFICES_ADDRESS) != 0)		    working.write(STOSB_A32);		else		    working.write(STOSB_A16);	    }	    break;	case 0xab: //STOSW/STOSD	    if ((prefices & PREFICES_OPERAND) != 0) {		if ((prefices & PREFICES_REP) != 0) {		    if ((prefices & PREFICES_ADDRESS) != 0)			working.write(REP_STOSD_A32);		    else			working.write(REP_STOSD_A16);		} else {		    if ((prefices & PREFICES_ADDRESS) != 0)			working.write(STOSD_A32);		    else			working.write(STOSD_A16);		}	    } else {		if ((prefices & PREFICES_REP) != 0) {		    if ((prefices & PREFICES_ADDRESS) != 0)			working.write(REP_STOSW_A32);		    else			working.write(REP_STOSW_A16);		} else {		    if ((prefices & PREFICES_ADDRESS) != 0)			working.write(STOSW_A32);		    else			working.write(STOSW_A16);		}	    }	    break;	case 0xac: //LODSB	    if ((prefices & PREFICES_REP) != 0) {		if ((prefices & PREFICES_ADDRESS) != 0)		    working.write(REP_LODSB_A32);		else		    working.write(REP_LODSB_A16);	    } else {		if ((prefices & PREFICES_ADDRESS) != 0)		    working.write(LODSB_A32);		else		    working.write(LODSB_A16);	    }	    break;	case 0xad: //LODSW/LODSD	    if ((prefices & PREFICES_OPERAND) != 0) {		if ((prefices & PREFICES_REP) != 0) {		    if ((prefices & PREFICES_ADDRESS) != 0)			working.write(REP_LODSD_A32);		    else			working.write(REP_LODSD_A16);		} else {		    if ((prefices & PREFICES_ADDRESS) != 0)			working.write(LODSD_A32);		    else			working.write(LODSD_A16);		}	    } else {		if ((prefices & PREFICES_REP) != 0) {		    if ((prefices & PREFICES_ADDRESS) != 0)			working.write(REP_LODSW_A32);		    else			working.write(REP_LODSW_A16);		} else {		    if ((prefices & PREFICES_ADDRESS) != 0)			working.write(LODSW_A32);		    else			working.write(LODSW_A16);		}	    }	    break;	case 0xae: //SCASB	    if ((prefices & PREFICES_REPE) != 0) {		if ((prefices & PREFICES_ADDRESS) != 0)		    working.write(REPE_SCASB_A32);		else		    working.write(REPE_SCASB_A16);	    } else if ((prefices & PREFICES_REPNE) != 0) {		if ((prefices & PREFICES_ADDRESS) != 0)		    working.write(REPNE_SCASB_A32);		else		    working.write(REPNE_SCASB_A16);	    } else {		if ((prefices & PREFICES_ADDRESS) != 0)		    working.write(SCASB_A32);		else		    working.write(SCASB_A16);	    }	    break;	case 0xaf: //SCASW/D	    if ((prefices & PREFICES_OPERAND) != 0) {		if ((prefices & PREFICES_REPE) != 0) {		    if ((prefices & PREFICES_ADDRESS) != 0)			working.write(REPE_SCASD_A32);		    else			working.write(REPE_SCASD_A16);		} else if ((prefices & PREFICES_REPNE) != 0) {		    if ((prefices & PREFICES_ADDRESS) != 0)			working.write(REPNE_SCASD_A32);		    else			working.write(REPNE_SCASD_A16);		} else {		    if ((prefices & PREFICES_ADDRESS) != 0)			working.write(SCASD_A32);		    else			working.write(SCASD_A16);		}	    } else {		if ((prefices & PREFICES_REPE) != 0) {		    if ((prefices & PREFICES_ADDRESS) != 0)			working.write(REPE_SCASW_A32);		    else			working.write(REPE_SCASW_A16);		} else if ((prefices & PREFICES_REPNE) != 0) {		    if ((prefices & PREFICES_ADDRESS) != 0)			working.write(REPNE_SCASW_A32);		    else			working.write(REPNE_SCASW_A16);		} else {		    if ((prefices & PREFICES_ADDRESS) != 0)			working.write(SCASW_A32);		    else			working.write(SCASW_A16);		}	    }	    break;	case 0xc0:	case 0xd0:	case 0xd2:	    switch (modrm & 0x38) {	    case 0x00:		working.write(ROL_O8); break;	    case 0x08:		working.write(ROR_O8); break;	    case 0x10:		working.write(RCL_O8); break;	    case 0x18:		working.write(RCR_O8); break;	    case 0x20:		working.write(SHL); break;	    case 0x28:		working.write(SHR); break;	    case 0x30:		System.err.println("Using invalid SHL encoding");		working.write(SHL); break;	    case 0x38:		working.write(SAR_O8); break;	    }	    break;	case 0xc1:	case 0xd1:	case 0xd3:	    if ((prefices & PREFICES_OPERAND) != 0) {		switch (modrm & 0x38) {		case 0x00:		    working.write(ROL_O32); break;		case 0x08:		    working.write(ROR_O32); break;		case 0x10:		    working.write(RCL_O32); break;		case 0x18:		    working.write(RCR_O32); break;		case 0x20:		    working.write(SHL); break;		case 0x28:		    working.write(SHR); break;		case 0x30:		    System.err.println("Using invalid SHL encoding");		    working.write(SHL); break;		case 0x38:		    working.write(SAR_O32); break;		}	    } else {		switch (modrm & 0x38) {		case 0x00:		    working.write(ROL_O16); break;		case 0x08:		    working.write(ROR_O16); break;		case 0x10:		    working.write(RCL_O16); break;		case 0x18:		    working.write(RCR_O16); break;		case 0x20:		    working.write(SHL); break;		case 0x28:		    working.write(SHR); break;		case 0x30:		    System.err.println("Using invalid SHL encoding");		    working.write(SHL); break;		case 0x38:		    working.write(SAR_O16); break;		}	    }	    break;	case 0xc2:	    switch (prefices & (PREFICES_OPERAND | PREFICES_ADDRESS)) {	    case 0:		working.write(RET_IW_O16_A16); break;	    case PREFICES_OPERAND:		working.write(RET_IW_O32_A16); break;	    case PREFICES_ADDRESS:		working.write(RET_IW_O16_A32); break;	    case PREFICES_ADDRESS | PREFICES_OPERAND:		working.write(RET_IW_O32_A32); break;	    }	    break;	case 0xc3: //RET	    switch (prefices & (PREFICES_OPERAND | PREFICES_ADDRESS)) {	    case 0:		working.write(RET_O16_A16); break;	    case PREFICES_OPERAND:		working.write(RET_O32_A16); break;	    case PREFICES_ADDRESS:		working.write(RET_O16_A32); break;	    case PREFICES_ADDRESS | PREFICES_OPERAND:		working.write(RET_O32_A32); break;	    }	    break;	case 0xc8:	    switch (prefices & (PREFICES_OPERAND | PREFICES_ADDRESS)) {	    case 0:		working.write(ENTER_O16_A16); break;	    case PREFICES_OPERAND:		working.write(ENTER_O32_A16); break;	    case PREFICES_ADDRESS:		working.write(ENTER_O16_A32); break;	    case PREFICES_ADDRESS | PREFICES_OPERAND:		working.write(ENTER_O32_A32); break;	    }	    break;	case 0xc9:	    switch (prefices & (PREFICES_OPERAND | PREFICES_ADDRESS)) {	    case 0:		working.write(LEAVE_O16_A16); break;	    case PREFICES_OPERAND:		working.write(LEAVE_O32_A16); break;	    case PREFICES_ADDRESS:		working.write(LEAVE_O16_A32); break;	    case PREFICES_ADDRESS | PREFICES_OPERAND:		working.write(LEAVE_O32_A32); break;	    }	    break;	case 0xca:	    switch (prefices & (PREFICES_OPERAND | PREFICES_ADDRESS)) {	    case 0:		working.write(RET_FAR_IW_O16_A16); break;	    case PREFICES_OPERAND:		working.write(RET_FAR_IW_O32_A16); break;	    case PREFICES_ADDRESS:		working.write(RET_FAR_IW_O16_A32); break;	    case PREFICES_ADDRESS | PREFICES_OPERAND:		working.write(RET_FAR_IW_O32_A32); break;	    }	    break;	case 0xcb:	    switch (prefices & (PREFICES_OPERAND | PREFICES_ADDRESS)) {	    case 0:		working.write(RET_FAR_O16_A16); break;	    case PREFICES_OPERAND:		working.write(RET_FAR_O32_A16); break;	    case PREFICES_ADDRESS:		working.write(RET_FAR_O16_A32); break;	    case PREFICES_ADDRESS | PREFICES_OPERAND:		working.write(RET_FAR_O32_A32); break;	    }	    break;	case 0xcc:	    switch (prefices & (PREFICES_OPERAND | PREFICES_ADDRESS)) {	    case 0:		working.write(INT3_O16_A16); break;	    case PREFICES_OPERAND:		working.write(INT3_O32_A16); break;	    case PREFICES_ADDRESS:		working.write(INT3_O16_A32); break;	    case PREFICES_ADDRESS | PREFICES_OPERAND:		working.write(INT3_O32_A32); break;	    }	    break;	case 0xcd:	    switch (prefices & (PREFICES_OPERAND | PREFICES_ADDRESS)) {	    case 0:		working.write(INT_O16_A16); break;	    case PREFICES_OPERAND:		working.write(INT_O32_A16); break;	    case PREFICES_ADDRESS:		working.write(INT_O16_A32); break;	    case PREFICES_ADDRESS | PREFICES_OPERAND:		working.write(INT_O32_A32); break;	    }	    break;	case 0xce:	    switch (prefices & (PREFICES_OPERAND | PREFICES_ADDRESS)) {	    case 0:		working.write(INTO_O16_A16); break;	    case PREFICES_OPERAND:		working.write(INTO_O32_A16); break;	    case PREFICES_ADDRESS:		working.write(INTO_O16_A32); break;	    case PREFICES_ADDRESS | PREFICES_OPERAND:		working.write(INTO_O32_A32); break;	    }	    break;	case 0xcf:	    switch (prefices & (PREFICES_OPERAND | PREFICES_ADDRESS)) {	    case 0:		working.write(IRET_O16_A16); break;	    case PREFICES_OPERAND:		working.write(IRET_O32_A16); break;	    case PREFICES_ADDRESS:		working.write(IRET_O16_A32); break;	    case PREFICES_ADDRESS | PREFICES_OPERAND:		working.write(IRET_O32_A32); break;	    }	    break;	case 0xd4: working.write(AAM); break; //AAM	case 0xd5: working.write(AAD); break; //AAD	case 0xe0: //LOOPNZ Jb	    if ((prefices & PREFICES_ADDRESS) != 0)		working.write(LOOPNZ_ECX);	    else		working.write(LOOPNZ_CX);	    break;	case 0xe1: //LOOPZ Jb	    if ((prefices & PREFICES_ADDRESS) != 0)		working.write(LOOPZ_ECX);	    else		working.write(LOOPZ_CX);	    break;	case 0xe2: //LOOP Jb	    if ((prefices & PREFICES_ADDRESS) != 0)		working.write(LOOP_ECX);	    else		working.write(LOOP_CX);	    break;	case 0xe3: //JCXZ 	    if ((prefices & PREFICES_ADDRESS) != 0)		working.write(JECXZ);	    else		working.write(JCXZ);	    break;	case 0xe4: //IN AL, Ib	case 0xec: working.write(IN_O8); break; //IN AL, DX	case 0xe5: //IN eAX, Ib	case 0xed: //IN eAX, DX	    if ((prefices & PREFICES_OPERAND) != 0)		working.write(IN_O32);	    else		working.write(IN_O16);	    break;	    	case 0xe6: //OUT Ib, AL	case 0xee: working.write(OUT_O8); break; //OUT DX, AL 	case 0xe7: //OUT Ib, eAX	case 0xef: //OUT DX, eAX	    if ((prefices & PREFICES_OPERAND) != 0)		working.write(OUT_O32);	    else		working.write(OUT_O16);	    break;	case 0xe8: //CALL Jv	    switch (prefices & (PREFICES_OPERAND | PREFICES_ADDRESS)) {	    case 0:		working.write(CALL_O16_A16); break;	    case PREFICES_OPERAND:		working.write(CALL_O32_A16); break;	    case PREFICES_ADDRESS:		working.write(CALL_O16_A32); break;	    case PREFICES_ADDRESS | PREFICES_OPERAND:		working.write(CALL_O32_A32); break;	    }	    break;	case 0xe9: //JMP Jv	    if ((prefices & PREFICES_OPERAND) != 0)		working.write(JUMP_O32);	    else		working.write(JUMP_O16);	    break;	case 0xea: //JMPF Ap	    if ((prefices & PREFICES_OPERAND) != 0)		working.write(JUMP_FAR_O32);	    else		working.write(JUMP_FAR_O16);	    break;	case 0xeb: working.write(JUMP_O8); break; //JMP Jb	case 0xf4: working.write(HALT); break; //HLT	case 0xf5: working.write(CMC); break; //CMC	case 0xf6: //UNA GP3 Eb	    switch (modrm & 0x38) {	    case 0x00:		working.write(AND); break;	    case 0x10:		working.write(NOT); break;	    case 0x18:		working.write(NEG); break;

⌨️ 快捷键说明

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