?? ops.c
字號:
REMARKS:Handles opcode 0x0e****************************************************************************/void x86emuOp_push_CS(u8 X86EMU_UNUSED(op1)){ START_OF_INSTR(); DECODE_PRINTF("PUSH\tCS\n"); TRACE_AND_STEP(); push_word(M.x86.R_CS); DECODE_CLEAR_SEGOVR(); END_OF_INSTR();}/****************************************************************************REMARKS:Handles opcode 0x0f. Escape for two-byte opcode (286 or better)****************************************************************************/void x86emuOp_two_byte(u8 X86EMU_UNUSED(op1)){ u8 op2 = (*sys_rdb)(((u32)M.x86.R_CS << 4) + (M.x86.R_IP++)); INC_DECODED_INST_LEN(1); (*x86emu_optab2[op2])(op2);}/****************************************************************************REMARKS:Handles opcode 0x16****************************************************************************/void x86emuOp_push_SS(u8 X86EMU_UNUSED(op1)){ START_OF_INSTR(); DECODE_PRINTF("PUSH\tSS\n"); TRACE_AND_STEP(); push_word(M.x86.R_SS); DECODE_CLEAR_SEGOVR(); END_OF_INSTR();}/****************************************************************************REMARKS:Handles opcode 0x17****************************************************************************/void x86emuOp_pop_SS(u8 X86EMU_UNUSED(op1)){ START_OF_INSTR(); DECODE_PRINTF("POP\tSS\n"); TRACE_AND_STEP(); M.x86.R_SS = pop_word(); DECODE_CLEAR_SEGOVR(); END_OF_INSTR();}/****************************************************************************REMARKS:Handles opcode 0x1e****************************************************************************/void x86emuOp_push_DS(u8 X86EMU_UNUSED(op1)){ START_OF_INSTR(); DECODE_PRINTF("PUSH\tDS\n"); TRACE_AND_STEP(); push_word(M.x86.R_DS); DECODE_CLEAR_SEGOVR(); END_OF_INSTR();}/****************************************************************************REMARKS:Handles opcode 0x1f****************************************************************************/void x86emuOp_pop_DS(u8 X86EMU_UNUSED(op1)){ START_OF_INSTR(); DECODE_PRINTF("POP\tDS\n"); TRACE_AND_STEP(); M.x86.R_DS = pop_word(); DECODE_CLEAR_SEGOVR(); END_OF_INSTR();}/****************************************************************************REMARKS:Handles opcode 0x26****************************************************************************/void x86emuOp_segovr_ES(u8 X86EMU_UNUSED(op1)){ START_OF_INSTR(); DECODE_PRINTF("ES:\n"); TRACE_AND_STEP(); M.x86.mode |= SYSMODE_SEGOVR_ES; /* * note the lack of DECODE_CLEAR_SEGOVR(r) since, here is one of 4 * opcode subroutines we do not want to do this. */ END_OF_INSTR();}/****************************************************************************REMARKS:Handles opcode 0x27****************************************************************************/void x86emuOp_daa(u8 X86EMU_UNUSED(op1)){ START_OF_INSTR(); DECODE_PRINTF("DAA\n"); TRACE_AND_STEP(); M.x86.R_AL = daa_byte(M.x86.R_AL); DECODE_CLEAR_SEGOVR(); END_OF_INSTR();}/****************************************************************************REMARKS:Handles opcode 0x2e****************************************************************************/void x86emuOp_segovr_CS(u8 X86EMU_UNUSED(op1)){ START_OF_INSTR(); DECODE_PRINTF("CS:\n"); TRACE_AND_STEP(); M.x86.mode |= SYSMODE_SEGOVR_CS; /* note no DECODE_CLEAR_SEGOVR here. */ END_OF_INSTR();}/****************************************************************************REMARKS:Handles opcode 0x2f****************************************************************************/void x86emuOp_das(u8 X86EMU_UNUSED(op1)){ START_OF_INSTR(); DECODE_PRINTF("DAS\n"); TRACE_AND_STEP(); M.x86.R_AL = das_byte(M.x86.R_AL); DECODE_CLEAR_SEGOVR(); END_OF_INSTR();}/****************************************************************************REMARKS:Handles opcode 0x36****************************************************************************/void x86emuOp_segovr_SS(u8 X86EMU_UNUSED(op1)){ START_OF_INSTR(); DECODE_PRINTF("SS:\n"); TRACE_AND_STEP(); M.x86.mode |= SYSMODE_SEGOVR_SS; /* no DECODE_CLEAR_SEGOVR ! */ END_OF_INSTR();}/****************************************************************************REMARKS:Handles opcode 0x37****************************************************************************/void x86emuOp_aaa(u8 X86EMU_UNUSED(op1)){ START_OF_INSTR(); DECODE_PRINTF("AAA\n"); TRACE_AND_STEP(); M.x86.R_AX = aaa_word(M.x86.R_AX); DECODE_CLEAR_SEGOVR(); END_OF_INSTR();}/****************************************************************************REMARKS:Handles opcode 0x3e****************************************************************************/void x86emuOp_segovr_DS(u8 X86EMU_UNUSED(op1)){ START_OF_INSTR(); DECODE_PRINTF("DS:\n"); TRACE_AND_STEP(); M.x86.mode |= SYSMODE_SEGOVR_DS; /* NO DECODE_CLEAR_SEGOVR! */ END_OF_INSTR();}/****************************************************************************REMARKS:Handles opcode 0x3f****************************************************************************/void x86emuOp_aas(u8 X86EMU_UNUSED(op1)){ START_OF_INSTR(); DECODE_PRINTF("AAS\n"); TRACE_AND_STEP(); M.x86.R_AX = aas_word(M.x86.R_AX); DECODE_CLEAR_SEGOVR(); END_OF_INSTR();}/****************************************************************************REMARKS:Handles opcode 0x40 - 0x47****************************************************************************/void x86emuOp_inc_register(u8 op1){ START_OF_INSTR(); op1 &= 0x7; DECODE_PRINTF("INC\t"); if (M.x86.mode & SYSMODE_PREFIX_DATA) { u32 *reg; reg = DECODE_RM_LONG_REGISTER(op1); DECODE_PRINTF("\n"); TRACE_AND_STEP(); *reg = inc_long(*reg); } else { u16 *reg; reg = DECODE_RM_WORD_REGISTER(op1); DECODE_PRINTF("\n"); TRACE_AND_STEP(); *reg = inc_word(*reg); } DECODE_CLEAR_SEGOVR(); END_OF_INSTR();}/****************************************************************************REMARKS:Handles opcode 0x48 - 0x4F****************************************************************************/void x86emuOp_dec_register(u8 op1){ START_OF_INSTR(); op1 &= 0x7; DECODE_PRINTF("DEC\t"); if (M.x86.mode & SYSMODE_PREFIX_DATA) { u32 *reg; reg = DECODE_RM_LONG_REGISTER(op1); DECODE_PRINTF("\n"); TRACE_AND_STEP(); *reg = dec_long(*reg); } else { u16 *reg; reg = DECODE_RM_WORD_REGISTER(op1); DECODE_PRINTF("\n"); TRACE_AND_STEP(); *reg = dec_word(*reg); } DECODE_CLEAR_SEGOVR(); END_OF_INSTR();}/****************************************************************************REMARKS:Handles opcode 0x50 - 0x57****************************************************************************/void x86emuOp_push_register(u8 op1){ START_OF_INSTR(); op1 &= 0x7; DECODE_PRINTF("PUSH\t"); if (M.x86.mode & SYSMODE_PREFIX_DATA) { u32 *reg; reg = DECODE_RM_LONG_REGISTER(op1); DECODE_PRINTF("\n"); TRACE_AND_STEP(); push_long(*reg); } else { u16 *reg; reg = DECODE_RM_WORD_REGISTER(op1); DECODE_PRINTF("\n"); TRACE_AND_STEP(); push_word(*reg); } DECODE_CLEAR_SEGOVR(); END_OF_INSTR();}/****************************************************************************REMARKS:Handles opcode 0x58 - 0x5F****************************************************************************/void x86emuOp_pop_register(u8 op1){ START_OF_INSTR(); op1 &= 0x7; DECODE_PRINTF("POP\t"); if (M.x86.mode & SYSMODE_PREFIX_DATA) { u32 *reg; reg = DECODE_RM_LONG_REGISTER(op1); DECODE_PRINTF("\n"); TRACE_AND_STEP(); *reg = pop_long(); } else { u16 *reg; reg = DECODE_RM_WORD_REGISTER(op1); DECODE_PRINTF("\n"); TRACE_AND_STEP(); *reg = pop_word(); } DECODE_CLEAR_SEGOVR(); END_OF_INSTR();}/****************************************************************************REMARKS:Handles opcode 0x60****************************************************************************/void x86emuOp_push_all(u8 X86EMU_UNUSED(op1)){ START_OF_INSTR(); if (M.x86.mode & SYSMODE_PREFIX_DATA) { DECODE_PRINTF("PUSHAD\n"); } else { DECODE_PRINTF("PUSHA\n"); } TRACE_AND_STEP(); if (M.x86.mode & SYSMODE_PREFIX_DATA) { u32 old_sp = M.x86.R_ESP; push_long(M.x86.R_EAX); push_long(M.x86.R_ECX); push_long(M.x86.R_EDX); push_long(M.x86.R_EBX); push_long(old_sp); push_long(M.x86.R_EBP); push_long(M.x86.R_ESI); push_long(M.x86.R_EDI); } else { u16 old_sp = M.x86.R_SP; push_word(M.x86.R_AX); push_word(M.x86.R_CX); push_word(M.x86.R_DX); push_word(M.x86.R_BX); push_word(old_sp); push_word(M.x86.R_BP); push_word(M.x86.R_SI); push_word(M.x86.R_DI); } DECODE_CLEAR_SEGOVR(); END_OF_INSTR();}/****************************************************************************REMARKS:Handles opcode 0x61****************************************************************************/void x86emuOp_pop_all(u8 X86EMU_UNUSED(op1)){ START_OF_INSTR(); if (M.x86.mode & SYSMODE_PREFIX_DATA) { DECODE_PRINTF("POPAD\n"); } else { DECODE_PRINTF("POPA\n"); } TRACE_AND_STEP(); if (M.x86.mode & SYSMODE_PREFIX_DATA) { M.x86.R_EDI = pop_long(); M.x86.R_ESI = pop_long(); M.x86.R_EBP = pop_long(); M.x86.R_ESP += 4; /* skip ESP */ M.x86.R_EBX = pop_long(); M.x86.R_EDX = pop_long(); M.x86.R_ECX = pop_long(); M.x86.R_EAX = pop_long(); } else { M.x86.R_DI = pop_word(); M.x86.R_SI = pop_word(); M.x86.R_BP = pop_word(); M.x86.R_SP += 2; /* skip SP */ M.x86.R_BX = pop_word(); M.x86.R_DX = pop_word(); M.x86.R_CX = pop_word(); M.x86.R_AX = pop_word(); } DECODE_CLEAR_SEGOVR(); END_OF_INSTR();}/*opcode 0x62 ILLEGAL OP, calls x86emuOp_illegal_op() *//*opcode 0x63 ILLEGAL OP, calls x86emuOp_illegal_op() *//****************************************************************************REMARKS:Handles opcode 0x64****************************************************************************/void x86emuOp_segovr_FS(u8 X86EMU_UNUSED(op1)){ START_OF_INSTR(); DECODE_PRINTF("FS:\n"); TRACE_AND_STEP(); M.x86.mode |= SYSMODE_SEGOVR_FS; /* * note the lack of DECODE_CLEAR_SEGOVR(r) since, here is one of 4 * opcode subroutines we do not want to do this. */ END_OF_INSTR();}/****************************************************************************REMARKS:Handles opcode 0x65****************************************************************************/void x86emuOp_segovr_GS(u8 X86EMU_UNUSED(op1)){ START_OF_INSTR(); DECODE_PRINTF("GS:\n"); TRACE_AND_STEP(); M.x86.mode |= SYSMODE_SEGOVR_GS; /* * note the lack of DECODE_CLEAR_SEGOVR(r) since, here is one of 4 * opcode subroutines we do not want to do this. */ END_OF_INSTR();}/****************************************************************************REMARKS:Handles opcode 0x66 - prefix for 32-bit register****************************************************************************/void x86emuOp_prefix_data(u8 X86EMU_UNUSED(op1)){ START_OF_INSTR(); DECODE_PRINTF("DATA:\n"); TRACE_AND_STEP(); M.x86.mode |= SYSMODE_PREFIX_DATA; /* note no DECODE_CLEAR_SEGOVR here. */ END_OF_INSTR();}/****************************************************************************REMARKS:Handles opcode 0x67 - prefix for 32-bit address****************************************************************************/void x86emuOp_prefix_addr(u8 X86EMU_UNUSED(op1)){ START_OF_INSTR(); DECODE_PRINTF("ADDR:\n"); TRACE_AND_STEP(); M.x86.mode |= SYSMODE_PREFIX_ADDR; /* note no DECODE_CLEAR_SEGOVR here. */ END_OF_INSTR();}/****************************************************************************REMARKS:Handles opcode 0x68****************************************************************************/void x86emuOp_push_word_IMM(u8 X86EMU_UNUSED(op1)){ u32 imm; START_OF_INSTR(); if (M.x86.mode & SYSMODE_PREFIX_DATA) { imm = fetch_long_imm(); } else { imm = fetch_word_imm(); } DECODE_PRINTF2("PUSH\t%x\n", imm); TRACE_AND_STEP(); if (M.x86.mode & SYSMODE_PREFIX_DATA) { push_long(imm); } else { push_word((u16)imm); } DECODE_CLEAR_SEGOVR(); END_OF_INSTR();}/****************************************************************************REMARKS:Handles opcode 0x69****************************************************************************/void x86emuOp_imul_word_IMM(u8 X86EMU_UNUSED(op1)){ int mod, rl, rh; uint srcoffset; START_OF_INSTR(); DECODE_PRINTF("IMUL\t"); FETCH_DECODE_MODRM(mod, rh, rl); if (mod < 3) { srcoffset = decode_rmXX_address(mod, rl); if (M.x86.mode & SYSMODE_PREFIX_DATA) { u32 *destreg; u32 srcval; u32 res_lo,res_hi; s32 imm;
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -