📄 prefix_66.h
字号:
CASE_D(0x91) /* XCHG ECX,EAX */ { Bit32u temp=reg_eax;reg_eax=reg_ecx;reg_ecx=temp;break;} CASE_D(0x92) /* XCHG EDX,EAX */ { Bit32u temp=reg_eax;reg_eax=reg_edx;reg_edx=temp;break;} break; CASE_D(0x93) /* XCHG EBX,EAX */ { Bit32u temp=reg_eax;reg_eax=reg_ebx;reg_ebx=temp;break;} break; CASE_D(0x94) /* XCHG ESP,EAX */ { Bit32u temp=reg_eax;reg_eax=reg_esp;reg_esp=temp;break;} break; CASE_D(0x95) /* XCHG EBP,EAX */ { Bit32u temp=reg_eax;reg_eax=reg_ebp;reg_ebp=temp;break;} break; CASE_D(0x96) /* XCHG ESI,EAX */ { Bit32u temp=reg_eax;reg_eax=reg_esi;reg_esi=temp;break;} break; CASE_D(0x97) /* XCHG EDI,EAX */ { Bit32u temp=reg_eax;reg_eax=reg_edi;reg_edi=temp;break;} break; CASE_D(0x98) /* CWDE */ reg_eax=(Bit16s)reg_ax;break; CASE_D(0x99) /* CDQ */ if (reg_eax & 0x80000000) reg_edx=0xffffffff; else reg_edx=0; break; CASE_D(0x9a) /* CALL FAR Ad */ { Bit32u newip=Fetchd();Bit16u newcs=Fetchw(); FillFlags(); CPU_CALL(true,newcs,newip,GETIP);#if CPU_TRAP_CHECK if (GETFLAG(TF)) { cpudecoder=CPU_Core_Normal_Trap_Run; return CBRET_NONE; }#endif continue; } CASE_D(0x9c) /* PUSHFD */ FillFlags(); if (CPU_PUSHF(true)) RUNEXCEPTION(); break; CASE_D(0x9d) /* POPFD */ if (CPU_POPF(true)) RUNEXCEPTION(); lflags.type=t_UNKNOWN;#if CPU_TRAP_CHECK if (GETFLAG(TF)) { cpudecoder=CPU_Core_Normal_Trap_Run; goto decode_end; }#endif#if CPU_PIC_CHECK if (GETFLAG(IF) && PIC_IRQCheck) goto decode_end;#endif break; CASE_D(0xa1) /* MOV EAX,Od */ { GetEADirect; reg_eax=LoadMd(eaa); } break; CASE_D(0xa3) /* MOV Od,EAX */ { GetEADirect; SaveMd(eaa,reg_eax); } break; CASE_D(0xa5) /* MOVSD */ DoString(R_MOVSD);break; CASE_D(0xa7) /* CMPSD */ DoString(R_CMPSD);break; CASE_D(0xa9) /* TEST EAX,Id */ EAXId(TESTD);break; CASE_D(0xab) /* STOSD */ DoString(R_STOSD);break; CASE_D(0xad) /* LODSD */ DoString(R_LODSD);break; CASE_D(0xaf) /* SCASD */ DoString(R_SCASD);break; CASE_D(0xb8) /* MOV EAX,Id */ reg_eax=Fetchd();break; CASE_D(0xb9) /* MOV ECX,Id */ reg_ecx=Fetchd();break; CASE_D(0xba) /* MOV EDX,Iw */ reg_edx=Fetchd();break; CASE_D(0xbb) /* MOV EBX,Id */ reg_ebx=Fetchd();break; CASE_D(0xbc) /* MOV ESP,Id */ reg_esp=Fetchd();break; CASE_D(0xbd) /* MOV EBP.Id */ reg_ebp=Fetchd();break; CASE_D(0xbe) /* MOV ESI,Id */ reg_esi=Fetchd();break; CASE_D(0xbf) /* MOV EDI,Id */ reg_edi=Fetchd();break; CASE_D(0xc1) /* GRP2 Ed,Ib */ GRP2D(Fetchb());break; CASE_D(0xc2) /* RETN Iw */ reg_eip=Pop_32(); reg_esp+=Fetchw(); continue; CASE_D(0xc3) /* RETN */ reg_eip=Pop_32(); continue; CASE_D(0xc4) /* LES */ { GetRMrd;GetEAa; if (CPU_SetSegGeneral(es,LoadMw(eaa+4))) RUNEXCEPTION(); *rmrd=LoadMd(eaa); break; } CASE_D(0xc5) /* LDS */ { GetRMrd;GetEAa; if (CPU_SetSegGeneral(ds,LoadMw(eaa+4))) RUNEXCEPTION(); *rmrd=LoadMd(eaa); break; } CASE_D(0xc7) /* MOV Ed,Id */ { GetRM; if (rm >= 0xc0) {GetEArd;*eard=Fetchd();} else {GetEAa;SaveMd(eaa,Fetchd());} break; } CASE_D(0xc8) /* ENTER Iw,Ib */ { Bitu bytes=Fetchw(); Bitu level=Fetchb(); CPU_ENTER(true,bytes,level); } break; CASE_D(0xc9) /* LEAVE */ reg_esp&=cpu.stack.notmask; reg_esp|=(reg_ebp&cpu.stack.mask); reg_ebp=Pop_32(); break; CASE_D(0xca) /* RETF Iw */ { Bitu words=Fetchw(); FillFlags(); CPU_RET(true,words,GETIP); continue; } CASE_D(0xcb) /* RETF */ { FillFlags(); CPU_RET(true,0,GETIP); continue; } CASE_D(0xcf) /* IRET */ { FillFlags(); CPU_IRET(true,GETIP);#if CPU_TRAP_CHECK if (GETFLAG(TF)) { cpudecoder=CPU_Core_Normal_Trap_Run; return CBRET_NONE; }#endif#if CPU_PIC_CHECK if (GETFLAG(IF) && PIC_IRQCheck) return CBRET_NONE;#endif continue; } CASE_D(0xd1) /* GRP2 Ed,1 */ GRP2D(1);break; CASE_D(0xd3) /* GRP2 Ed,CL */ GRP2D(reg_cl);break; CASE_D(0xe0) /* LOOPNZ */ if (TEST_PREFIX_ADDR) { JumpCond32_b(--reg_ecx && !get_ZF()); } else { JumpCond32_b(--reg_cx && !get_ZF()); } break; CASE_D(0xe1) /* LOOPZ */ if (TEST_PREFIX_ADDR) { JumpCond32_b(--reg_ecx && get_ZF()); } else { JumpCond32_b(--reg_cx && get_ZF()); } break; CASE_D(0xe2) /* LOOP */ if (TEST_PREFIX_ADDR) { JumpCond32_b(--reg_ecx); } else { JumpCond32_b(--reg_cx); } break; CASE_D(0xe3) /* JCXZ */ JumpCond32_b(!(reg_ecx & AddrMaskTable[core.prefixes& PREFIX_ADDR])); break; CASE_D(0xe5) /* IN EAX,Ib */ { Bitu port=Fetchb(); if (CPU_IO_Exception(port,4)) RUNEXCEPTION(); reg_eax=IO_ReadD(port); break; } CASE_D(0xe7) /* OUT Ib,EAX */ { Bitu port=Fetchb(); if (CPU_IO_Exception(port,4)) RUNEXCEPTION(); IO_WriteD(port,reg_eax); break; } CASE_D(0xe8) /* CALL Jd */ { Bit32s addip=Fetchds(); SAVEIP; Push_32(reg_eip); reg_eip+=addip; continue; } CASE_D(0xe9) /* JMP Jd */ { Bit32s addip=Fetchds(); SAVEIP; reg_eip+=addip; continue; } CASE_D(0xea) /* JMP Ad */ { Bit32u newip=Fetchd(); Bit16u newcs=Fetchw(); FillFlags(); CPU_JMP(true,newcs,newip,GETIP);#if CPU_TRAP_CHECK if (GETFLAG(TF)) { cpudecoder=CPU_Core_Normal_Trap_Run; return CBRET_NONE; }#endif continue; } CASE_D(0xeb) /* JMP Jb */ { Bit32s addip=Fetchbs(); SAVEIP; reg_eip+=addip; continue; } CASE_D(0xed) /* IN EAX,DX */ reg_eax=IO_ReadD(reg_dx); break; CASE_D(0xef) /* OUT DX,EAX */ IO_WriteD(reg_dx,reg_eax); break; CASE_D(0xf7) /* GRP3 Ed(,Id) */ { GetRM;Bitu which=(rm>>3)&7; switch (which) { case 0x00: /* TEST Ed,Id */ case 0x01: /* TEST Ed,Id Undocumented*/ { if (rm >= 0xc0 ) {GetEArd;TESTD(*eard,Fetchd(),LoadRd,SaveRd);} else {GetEAa;TESTD(eaa,Fetchd(),LoadMd,SaveMd);} break; } case 0x02: /* NOT Ed */ { if (rm >= 0xc0 ) {GetEArd;*eard=~*eard;} else {GetEAa;SaveMd(eaa,~LoadMd(eaa));} break; } case 0x03: /* NEG Ed */ { lflags.type=t_NEGd; if (rm >= 0xc0 ) { GetEArd;lf_var1d=*eard;lf_resd=0-lf_var1d; *eard=lf_resd; } else { GetEAa;lf_var1d=LoadMd(eaa);lf_resd=0-lf_var1d; SaveMd(eaa,lf_resd); } break; } case 0x04: /* MUL EAX,Ed */ RMEd(MULD); break; case 0x05: /* IMUL EAX,Ed */ RMEd(IMULD); break; case 0x06: /* DIV Ed */ RMEd(DIVD); break; case 0x07: /* IDIV Ed */ RMEd(IDIVD); break; } break; } CASE_D(0xff) /* GRP 5 Ed */ { GetRM;Bitu which=(rm>>3)&7; switch (which) { case 0x00: /* INC Ed */ RMEd(INCD); break; case 0x01: /* DEC Ed */ RMEd(DECD); break; case 0x02: /* CALL NEAR Ed */ if (rm >= 0xc0 ) {GetEArd;reg_eip=*eard;} else {GetEAa;reg_eip=LoadMd(eaa);} Push_32(GETIP); continue; case 0x03: /* CALL FAR Ed */ { if (rm >= 0xc0) goto illegal_opcode; GetEAa; Bit32u newip=LoadMd(eaa); Bit16u newcs=LoadMw(eaa+4); FillFlags(); CPU_CALL(true,newcs,newip,GETIP);#if CPU_TRAP_CHECK if (GETFLAG(TF)) { cpudecoder=CPU_Core_Normal_Trap_Run; return CBRET_NONE; }#endif continue; } case 0x04: /* JMP NEAR Ed */ if (rm >= 0xc0 ) {GetEArd;reg_eip=*eard;} else {GetEAa;reg_eip=LoadMd(eaa);} continue; case 0x05: /* JMP FAR Ed */ { if (rm >= 0xc0) goto illegal_opcode; GetEAa; Bit32u newip=LoadMd(eaa); Bit16u newcs=LoadMw(eaa+4); FillFlags(); CPU_JMP(true,newcs,newip,GETIP);#if CPU_TRAP_CHECK if (GETFLAG(TF)) { cpudecoder=CPU_Core_Normal_Trap_Run; return CBRET_NONE; }#endif continue; } break; case 0x06: /* Push Ed */ if (rm >= 0xc0 ) {GetEArd;Push_32(*eard);} else {GetEAa;Push_32(LoadMd(eaa));} break; default: E_Exit("CPU:66:GRP5:Illegal call %2X",which); break; } break; }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -