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

📄 ops.c

📁 MIPS处理器的bootloader,龙芯就是用的修改过的PMON2
💻 C
📖 第 1 页 / 共 5 页
字号:
            u32 res;            s16 imm;            destreg = DECODE_RM_WORD_REGISTER(rh);            DECODE_PRINTF(",");            srcoffset = decode_rm10_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 3:                     /* register to register */        if (M.x86.mode & SYSMODE_PREFIX_DATA) {            u32 *destreg,*srcreg;            u32 res_lo,res_hi;            s32 imm;            destreg = DECODE_RM_LONG_REGISTER(rh);            DECODE_PRINTF(",");            srcreg = DECODE_RM_LONG_REGISTER(rl);            imm = fetch_long_imm();            DECODE_PRINTF2(",%d\n", (s32)imm);            TRACE_AND_STEP();            imul_long_direct(&res_lo,&res_hi,(s32)*srcreg,(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,*srcreg;            u32 res;            s16 imm;            destreg = DECODE_RM_WORD_REGISTER(rh);            DECODE_PRINTF(",");            srcreg = DECODE_RM_WORD_REGISTER(rl);            imm = fetch_word_imm();            DECODE_PRINTF2(",%d\n", (s32)imm);            res = (s16)*srcreg * (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;    }    DECODE_CLEAR_SEGOVR();    END_OF_INSTR();}/****************************************************************************REMARKS:Handles opcode 0x6a****************************************************************************/static void x86emuOp_push_byte_IMM(u8 X86EMU_UNUSED(op1)){    s16 imm;    START_OF_INSTR();    imm = (s8)fetch_byte_imm();    DECODE_PRINTF2("PUSH\t%d\n", imm);    TRACE_AND_STEP();    push_word(imm);    DECODE_CLEAR_SEGOVR();    END_OF_INSTR();}/****************************************************************************REMARKS:Handles opcode 0x6b****************************************************************************/static void x86emuOp_imul_byte_IMM(u8 X86EMU_UNUSED(op1)){    int mod, rl, rh;    uint srcoffset;    s8  imm;    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;            destreg = DECODE_RM_LONG_REGISTER(rh);            DECODE_PRINTF(",");            srcoffset = decode_rm00_address(rl);            srcval = fetch_data_long(srcoffset);            imm = fetch_byte_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;            destreg = DECODE_RM_WORD_REGISTER(rh);            DECODE_PRINTF(",");            srcoffset = decode_rm00_address(rl);            srcval = fetch_data_word(srcoffset);            imm = fetch_byte_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;            destreg = DECODE_RM_LONG_REGISTER(rh);            DECODE_PRINTF(",");            srcoffset = decode_rm01_address(rl);            srcval = fetch_data_long(srcoffset);            imm = fetch_byte_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;            destreg = DECODE_RM_WORD_REGISTER(rh);            DECODE_PRINTF(",");            srcoffset = decode_rm01_address(rl);            srcval = fetch_data_word(srcoffset);            imm = fetch_byte_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;            destreg = DECODE_RM_LONG_REGISTER(rh);            DECODE_PRINTF(",");            srcoffset = decode_rm10_address(rl);            srcval = fetch_data_long(srcoffset);            imm = fetch_byte_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;            destreg = DECODE_RM_WORD_REGISTER(rh);            DECODE_PRINTF(",");            srcoffset = decode_rm10_address(rl);            srcval = fetch_data_word(srcoffset);            imm = fetch_byte_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 3:                     /* register to register */        if (M.x86.mode & SYSMODE_PREFIX_DATA) {            u32 *destreg,*srcreg;            u32 res_lo,res_hi;            destreg = DECODE_RM_LONG_REGISTER(rh);            DECODE_PRINTF(",");            srcreg = DECODE_RM_LONG_REGISTER(rl);            imm = fetch_byte_imm();            DECODE_PRINTF2(",%d\n", (s32)imm);            TRACE_AND_STEP();            imul_long_direct(&res_lo,&res_hi,(s32)*srcreg,(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,*srcreg;            u32 res;            destreg = DECODE_RM_WORD_REGISTER(rh);            DECODE_PRINTF(",");            srcreg = DECODE_RM_WORD_REGISTER(rl);            imm = fetch_byte_imm();            DECODE_PRINTF2(",%d\n", (s32)imm);            res = (s16)*srcreg * (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;    }    DECODE_CLEAR_SEGOVR();    END_OF_INSTR();}/****************************************************************************REMARKS:Handles opcode 0x6c****************************************************************************/static void x86emuOp_ins_byte(u8 X86EMU_UNUSED(op1)){    START_OF_INSTR();    DECODE_PRINTF("INSB\n");    ins(1);    TRACE_AND_STEP();    DECODE_CLEAR_SEGOVR();    END_OF_INSTR();}/****************************************************************************REMARKS:Handles opcode 0x6d****************************************************************************/static void x86emuOp_ins_word(u8 X86EMU_UNUSED(op1)){    START_OF_INSTR();    if (M.x86.mode & SYSMODE_PREFIX_DATA) {        DECODE_PRINTF("INSD\n");        ins(4);    } else {        DECODE_PRINTF("INSW\n");        ins(2);    }    TRACE_AND_STEP();    DECODE_CLEAR_SEGOVR();    END_OF_INSTR();}/****************************************************************************REMARKS:Handles opcode 0x6e****************************************************************************/static void x86emuOp_outs_byte(u8 X86EMU_UNUSED(op1)){    START_OF_INSTR();    DECODE_PRINTF("OUTSB\n");    outs(1);    TRACE_AND_STEP();    DECODE_CLEAR_SEGOVR();    END_OF_INSTR();}/****************************************************************************REMARKS:Handles opcode 0x6f****************************************************************************/static void x86emuOp_outs_word(u8 X86EMU_UNUSED(op1)){    START_OF_INSTR();    if (M.x86.mode & SYSMODE_PREFIX_DATA) {        DECODE_PRINTF("OUTSD\n");        outs(4);    } else {        DECODE_PRINTF("OUTSW\n");        outs(2);    }    TRACE_AND_STEP();    DECODE_CLEAR_SEGOVR();    END_OF_INSTR();}/****************************************************************************REMARKS:Handles opcode 0x70****************************************************************************/static void x86emuOp_jump_near_O(u8 X86EMU_UNUSED(op1)){    s8 offset;    u16 target;    /* jump to byte offset if overflow flag is set */    START_OF_INSTR();    DECODE_PRINTF("JO\t");    offset = (s8)fetch_byte_imm();    target = (u16)(M.x86.R_IP + (s16)offset);    DECODE_PRINTF2("%x\n", target);    TRACE_AND_STEP();    if (ACCESS_FLAG(F_OF))        M.x86.R_IP = target;    DECODE_CLEAR_SEGOVR();    END_OF_INSTR();}/****************************************************************************REMARKS:Handles opcode 0x71****************************************************************************/static void x86emuOp_jump_near_NO(u8 X86EMU_UNUSED(op1)){    s8 offset;    u16 target;    /* jump to byte offset if overflow is not set */    START_OF_INSTR();    DECODE_PRINTF("JNO\t");    offset = (s8)fetch_byte_imm();    target = (u16)(M.x86.R_IP + (s16)offset);    DECODE_PRINTF2("%x\n", target);    TRACE_AND_STEP();    if (!ACCESS_FLAG(F_OF))        M.x86.R_IP = target;    DECODE_CLEAR_SEGOVR();    END_OF_INSTR();}/****************************************************************************REMARKS:Handles opcode 0x72****************************************************************************/static void x86emuOp_jump_near_B(u8 X86EMU_UNUSED(op1)){    s8 offset;    u16 target;    /* jump to byte offset if carry flag is set. */    START_OF_INSTR();    DECODE_PRINTF("JB\t");    offset = (s8)fetch_byte_imm();    target = (u16)(M.x86.R_IP + (s16)offset);    DECODE_PRINTF2("%x\n", target);    TRACE_AND_STEP();    if (ACCESS_FLAG(F_CF))        M.x86.R_IP = target;    DECODE_CLEAR_SEGOVR();    END_OF_INSTR();}/****************************************************************************REMARKS:Handles opcode 0x73****************************************************************************/static void x86emuOp_jump_near_NB(u8 X86EMU_UNUSED(op1)){    s8 offset;    u16 target;    /* jump to byte offset if carry flag is clear. */    START_OF_INSTR();    DECODE_PRINTF("JNB\t");    offset = (s8)fetch_byte_imm();    target = (u16)(M.x86.R_IP + (s16)offset);    DECODE_PRINTF2("%x\n", target);    TRACE_AND_STEP();    if (!ACCESS_FLAG(F_CF))        M

⌨️ 快捷键说明

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