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

📄 ops.c

📁 MIPS处理器的bootloader,龙芯就是用的修改过的PMON2
💻 C
📖 第 1 页 / 共 5 页
字号:
/****************************************************************************REMARKS:Handles opcode 0x5a****************************************************************************/static void x86emuOp_pop_DX(u8 X86EMU_UNUSED(op1)){    START_OF_INSTR();    if (M.x86.mode & SYSMODE_PREFIX_DATA) {        DECODE_PRINTF("POP\tEDX\n");    } else {        DECODE_PRINTF("POP\tDX\n");    }    TRACE_AND_STEP();    if (M.x86.mode & SYSMODE_PREFIX_DATA) {        M.x86.R_EDX = pop_long();    } else {        M.x86.R_DX = pop_word();    }    DECODE_CLEAR_SEGOVR();    END_OF_INSTR();}/****************************************************************************REMARKS:Handles opcode 0x5b****************************************************************************/static void x86emuOp_pop_BX(u8 X86EMU_UNUSED(op1)){    START_OF_INSTR();    if (M.x86.mode & SYSMODE_PREFIX_DATA) {        DECODE_PRINTF("POP\tEBX\n");    } else {        DECODE_PRINTF("POP\tBX\n");    }    TRACE_AND_STEP();    if (M.x86.mode & SYSMODE_PREFIX_DATA) {        M.x86.R_EBX = pop_long();    } else {        M.x86.R_BX = pop_word();    }    DECODE_CLEAR_SEGOVR();    END_OF_INSTR();}/****************************************************************************REMARKS:Handles opcode 0x5c****************************************************************************/static void x86emuOp_pop_SP(u8 X86EMU_UNUSED(op1)){    START_OF_INSTR();    if (M.x86.mode & SYSMODE_PREFIX_DATA) {        DECODE_PRINTF("POP\tESP\n");    } else {        DECODE_PRINTF("POP\tSP\n");    }    TRACE_AND_STEP();    if (M.x86.mode & SYSMODE_PREFIX_DATA) {        M.x86.R_ESP = pop_long();    } else {        M.x86.R_SP = pop_word();    }    DECODE_CLEAR_SEGOVR();    END_OF_INSTR();}/****************************************************************************REMARKS:Handles opcode 0x5d****************************************************************************/static void x86emuOp_pop_BP(u8 X86EMU_UNUSED(op1)){    START_OF_INSTR();    if (M.x86.mode & SYSMODE_PREFIX_DATA) {        DECODE_PRINTF("POP\tEBP\n");    } else {        DECODE_PRINTF("POP\tBP\n");    }    TRACE_AND_STEP();    if (M.x86.mode & SYSMODE_PREFIX_DATA) {        M.x86.R_EBP = pop_long();    } else {        M.x86.R_BP = pop_word();    }    DECODE_CLEAR_SEGOVR();    END_OF_INSTR();}/****************************************************************************REMARKS:Handles opcode 0x5e****************************************************************************/static void x86emuOp_pop_SI(u8 X86EMU_UNUSED(op1)){    START_OF_INSTR();    if (M.x86.mode & SYSMODE_PREFIX_DATA) {        DECODE_PRINTF("POP\tESI\n");    } else {        DECODE_PRINTF("POP\tSI\n");    }    TRACE_AND_STEP();    if (M.x86.mode & SYSMODE_PREFIX_DATA) {        M.x86.R_ESI = pop_long();    } else {        M.x86.R_SI = pop_word();    }    DECODE_CLEAR_SEGOVR();    END_OF_INSTR();}/****************************************************************************REMARKS:Handles opcode 0x5f****************************************************************************/static void x86emuOp_pop_DI(u8 X86EMU_UNUSED(op1)){    START_OF_INSTR();    if (M.x86.mode & SYSMODE_PREFIX_DATA) {        DECODE_PRINTF("POP\tEDI\n");    } else {        DECODE_PRINTF("POP\tDI\n");    }    TRACE_AND_STEP();    if (M.x86.mode & SYSMODE_PREFIX_DATA) {        M.x86.R_EDI = pop_long();    } else {        M.x86.R_DI = pop_word();    }    DECODE_CLEAR_SEGOVR();    END_OF_INSTR();}/****************************************************************************REMARKS:Handles opcode 0x60****************************************************************************/static 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****************************************************************************/static 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****************************************************************************/static 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****************************************************************************/static 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****************************************************************************/static 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****************************************************************************/static 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****************************************************************************/static 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****************************************************************************/static 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);    switch (mod) {    case 0:        if (M.x86.mode & SYSMODE_PREFIX_DATA) {            u32 *destreg;            u32 srcval;            u32 res_lo,res_hi;            s32 imm;            destreg = DECODE_RM_LONG_REGISTER(rh);            DECODE_PRINTF(",");            srcoffset = decode_rm00_address(rl);            srcval = fetch_data_long(srcoffset);            imm = fetch_long_imm();            DECODE_PRINTF2(",%d\n", (s32)imm);            TRACE_AND_STEP();            imul_long_direct(&res_lo,&res_hi,(s32)srcval,(s32)imm);            if (res_hi != 0) {                SET_FLAG(F_CF);                SET_FLAG(F_OF);            } else {                CLEAR_FLAG(F_CF);                CLEAR_FLAG(F_OF);            }            *destreg = (u32)res_lo;        } else {            u16 *destreg;            u16 srcval;            u32 res;            s16 imm;            destreg = DECODE_RM_WORD_REGISTER(rh);            DECODE_PRINTF(",");            srcoffset = decode_rm00_address(rl);            srcval = fetch_data_word(srcoffset);            imm = fetch_word_imm();            DECODE_PRINTF2(",%d\n", (s32)imm);            TRACE_AND_STEP();            res = (s16)srcval * (s16)imm;            if (res > 0xFFFF) {                SET_FLAG(F_CF);                SET_FLAG(F_OF);            } else {                CLEAR_FLAG(F_CF);                CLEAR_FLAG(F_OF);            }            *destreg = (u16)res;        }        break;    case 1:        if (M.x86.mode & SYSMODE_PREFIX_DATA) {            u32 *destreg;            u32 srcval;            u32 res_lo,res_hi;            s32 imm;            destreg = DECODE_RM_LONG_REGISTER(rh);            DECODE_PRINTF(",");            srcoffset = decode_rm01_address(rl);            srcval = fetch_data_long(srcoffset);            imm = fetch_long_imm();            DECODE_PRINTF2(",%d\n", (s32)imm);            TRACE_AND_STEP();            imul_long_direct(&res_lo,&res_hi,(s32)srcval,(s32)imm);            if (res_hi != 0) {                SET_FLAG(F_CF);                SET_FLAG(F_OF);            } else {                CLEAR_FLAG(F_CF);                CLEAR_FLAG(F_OF);            }            *destreg = (u32)res_lo;        } else {            u16 *destreg;            u16 srcval;            u32 res;            s16 imm;            destreg = DECODE_RM_WORD_REGISTER(rh);            DECODE_PRINTF(",");            srcoffset = decode_rm01_address(rl);            srcval = fetch_data_word(srcoffset);            imm = fetch_word_imm();            DECODE_PRINTF2(",%d\n", (s32)imm);            TRACE_AND_STEP();            res = (s16)srcval * (s16)imm;            if (res > 0xFFFF) {                SET_FLAG(F_CF);                SET_FLAG(F_OF);            } else {                CLEAR_FLAG(F_CF);                CLEAR_FLAG(F_OF);            }            *destreg = (u16)res;        }        break;    case 2:        if (M.x86.mode & SYSMODE_PREFIX_DATA) {            u32 *destreg;            u32 srcval;            u32 res_lo,res_hi;            s32 imm;            destreg = DECODE_RM_LONG_REGISTER(rh);            DECODE_PRINTF(",");            srcoffset = decode_rm10_address(rl);            srcval = fetch_data_long(srcoffset);            imm = fetch_long_imm();            DECODE_PRINTF2(",%d\n", (s32)imm);            TRACE_AND_STEP();            imul_long_direct(&res_lo,&res_hi,(s32)srcval,(s32)imm);            if (res_hi != 0) {                SET_FLAG(F_CF);                SET_FLAG(F_OF);            } else {                CLEAR_FLAG(F_CF);                CLEAR_FLAG(F_OF);            }            *destreg = (u32)res_lo;        } else {            u16 *destreg;            u16 srcval;

⌨️ 快捷键说明

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