📄 realmodeudecoder.java
字号:
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 + -