ops.c

来自「针对OpenJtag通用调试板的Uboot程序」· C语言 代码 · 共 2,395 行 · 第 1/5 页

C
2,395
字号
	M.x86.R_EAX = add_long(M.x86.R_EAX, srcval);    } else {	M.x86.R_AX = add_word(M.x86.R_AX, (u16)srcval);    }    DECODE_CLEAR_SEGOVR();    END_OF_INSTR();}/****************************************************************************REMARKS:Handles opcode 0x06****************************************************************************/void x86emuOp_push_ES(u8 X86EMU_UNUSED(op1)){    START_OF_INSTR();    DECODE_PRINTF("PUSH\tES\n");    TRACE_AND_STEP();    push_word(M.x86.R_ES);    DECODE_CLEAR_SEGOVR();    END_OF_INSTR();}/****************************************************************************REMARKS:Handles opcode 0x07****************************************************************************/void x86emuOp_pop_ES(u8 X86EMU_UNUSED(op1)){    START_OF_INSTR();    DECODE_PRINTF("POP\tES\n");    TRACE_AND_STEP();    M.x86.R_ES = pop_word();    DECODE_CLEAR_SEGOVR();    END_OF_INSTR();}/****************************************************************************REMARKS:Handles opcode 0x08****************************************************************************/void x86emuOp_or_byte_RM_R(u8 X86EMU_UNUSED(op1)){    int mod, rl, rh;    u8 *destreg, *srcreg;    uint destoffset;    u8 destval;    START_OF_INSTR();    DECODE_PRINTF("OR\t");    FETCH_DECODE_MODRM(mod, rh, rl);    switch (mod) {    case 0:	destoffset = decode_rm00_address(rl);	DECODE_PRINTF(",");	destval = fetch_data_byte(destoffset);	srcreg = DECODE_RM_BYTE_REGISTER(rh);	DECODE_PRINTF("\n");	TRACE_AND_STEP();	destval = or_byte(destval, *srcreg);	store_data_byte(destoffset, destval);	break;    case 1:	destoffset = decode_rm01_address(rl);	DECODE_PRINTF(",");	destval = fetch_data_byte(destoffset);	srcreg = DECODE_RM_BYTE_REGISTER(rh);	DECODE_PRINTF("\n");	TRACE_AND_STEP();	destval = or_byte(destval, *srcreg);	store_data_byte(destoffset, destval);	break;    case 2:	destoffset = decode_rm10_address(rl);	DECODE_PRINTF(",");	destval = fetch_data_byte(destoffset);	srcreg = DECODE_RM_BYTE_REGISTER(rh);	DECODE_PRINTF("\n");	TRACE_AND_STEP();	destval = or_byte(destval, *srcreg);	store_data_byte(destoffset, destval);	break;    case 3:                     /* register to register */	destreg = DECODE_RM_BYTE_REGISTER(rl);	DECODE_PRINTF(",");	srcreg = DECODE_RM_BYTE_REGISTER(rh);	DECODE_PRINTF("\n");	TRACE_AND_STEP();	*destreg = or_byte(*destreg, *srcreg);	break;    }    DECODE_CLEAR_SEGOVR();    END_OF_INSTR();}/****************************************************************************REMARKS:Handles opcode 0x09****************************************************************************/void x86emuOp_or_word_RM_R(u8 X86EMU_UNUSED(op1)){    int mod, rl, rh;    uint destoffset;    START_OF_INSTR();    DECODE_PRINTF("OR\t");    FETCH_DECODE_MODRM(mod, rh, rl);    switch (mod) {    case 0:	if (M.x86.mode & SYSMODE_PREFIX_DATA) {	    u32 destval;	    u32 *srcreg;	    destoffset = decode_rm00_address(rl);	    DECODE_PRINTF(",");	    destval = fetch_data_long(destoffset);	    srcreg = DECODE_RM_LONG_REGISTER(rh);	    DECODE_PRINTF("\n");	    TRACE_AND_STEP();	    destval = or_long(destval, *srcreg);	    store_data_long(destoffset, destval);	} else {	    u16 destval;	    u16 *srcreg;	    destoffset = decode_rm00_address(rl);	    DECODE_PRINTF(",");	    destval = fetch_data_word(destoffset);	    srcreg = DECODE_RM_WORD_REGISTER(rh);	    DECODE_PRINTF("\n");	    TRACE_AND_STEP();	    destval = or_word(destval, *srcreg);	    store_data_word(destoffset, destval);	}	break;    case 1:	if (M.x86.mode & SYSMODE_PREFIX_DATA) {	    u32 destval;	    u32 *srcreg;	    destoffset = decode_rm01_address(rl);	    DECODE_PRINTF(",");	    destval = fetch_data_long(destoffset);	    srcreg = DECODE_RM_LONG_REGISTER(rh);	    DECODE_PRINTF("\n");	    TRACE_AND_STEP();	    destval = or_long(destval, *srcreg);	    store_data_long(destoffset, destval);	} else {	    u16 destval;	    u16 *srcreg;	    destoffset = decode_rm01_address(rl);	    DECODE_PRINTF(",");	    destval = fetch_data_word(destoffset);	    srcreg = DECODE_RM_WORD_REGISTER(rh);	    DECODE_PRINTF("\n");	    TRACE_AND_STEP();	    destval = or_word(destval, *srcreg);	    store_data_word(destoffset, destval);	}	break;    case 2:	if (M.x86.mode & SYSMODE_PREFIX_DATA) {	    u32 destval;	    u32 *srcreg;	    destoffset = decode_rm10_address(rl);	    DECODE_PRINTF(",");	    destval = fetch_data_long(destoffset);	    srcreg = DECODE_RM_LONG_REGISTER(rh);	    DECODE_PRINTF("\n");	    TRACE_AND_STEP();	    destval = or_long(destval, *srcreg);	    store_data_long(destoffset, destval);	} else {	    u16 destval;	    u16 *srcreg;	    destoffset = decode_rm10_address(rl);	    DECODE_PRINTF(",");	    destval = fetch_data_word(destoffset);	    srcreg = DECODE_RM_WORD_REGISTER(rh);	    DECODE_PRINTF("\n");	    TRACE_AND_STEP();	    destval = or_word(destval, *srcreg);	    store_data_word(destoffset, destval);	}	break;    case 3:                     /* register to register */	if (M.x86.mode & SYSMODE_PREFIX_DATA) {	    u32 *destreg,*srcreg;	    destreg = DECODE_RM_LONG_REGISTER(rl);	    DECODE_PRINTF(",");	    srcreg = DECODE_RM_LONG_REGISTER(rh);	    DECODE_PRINTF("\n");	    TRACE_AND_STEP();	    *destreg = or_long(*destreg, *srcreg);	} else {	    u16 *destreg,*srcreg;	    destreg = DECODE_RM_WORD_REGISTER(rl);	    DECODE_PRINTF(",");	    srcreg = DECODE_RM_WORD_REGISTER(rh);	    DECODE_PRINTF("\n");	    TRACE_AND_STEP();	    *destreg = or_word(*destreg, *srcreg);	}	break;    }    DECODE_CLEAR_SEGOVR();    END_OF_INSTR();}/****************************************************************************REMARKS:Handles opcode 0x0a****************************************************************************/void x86emuOp_or_byte_R_RM(u8 X86EMU_UNUSED(op1)){    int mod, rl, rh;    u8 *destreg, *srcreg;    uint srcoffset;    u8 srcval;    START_OF_INSTR();    DECODE_PRINTF("OR\t");    FETCH_DECODE_MODRM(mod, rh, rl);    switch (mod) {    case 0:	destreg = DECODE_RM_BYTE_REGISTER(rh);	DECODE_PRINTF(",");	srcoffset = decode_rm00_address(rl);	srcval = fetch_data_byte(srcoffset);	DECODE_PRINTF("\n");	TRACE_AND_STEP();	*destreg = or_byte(*destreg, srcval);	break;    case 1:	destreg = DECODE_RM_BYTE_REGISTER(rh);	DECODE_PRINTF(",");	srcoffset = decode_rm01_address(rl);	srcval = fetch_data_byte(srcoffset);	DECODE_PRINTF("\n");	TRACE_AND_STEP();	*destreg = or_byte(*destreg, srcval);	break;    case 2:	destreg = DECODE_RM_BYTE_REGISTER(rh);	DECODE_PRINTF(",");	srcoffset = decode_rm10_address(rl);	srcval = fetch_data_byte(srcoffset);	DECODE_PRINTF("\n");	TRACE_AND_STEP();	*destreg = or_byte(*destreg, srcval);	break;    case 3:                     /* register to register */	destreg = DECODE_RM_BYTE_REGISTER(rh);	DECODE_PRINTF(",");	srcreg = DECODE_RM_BYTE_REGISTER(rl);	DECODE_PRINTF("\n");	TRACE_AND_STEP();	*destreg = or_byte(*destreg, *srcreg);	break;    }    DECODE_CLEAR_SEGOVR();    END_OF_INSTR();}/****************************************************************************REMARKS:Handles opcode 0x0b****************************************************************************/void x86emuOp_or_word_R_RM(u8 X86EMU_UNUSED(op1)){    int mod, rl, rh;    uint srcoffset;    START_OF_INSTR();    DECODE_PRINTF("OR\t");    FETCH_DECODE_MODRM(mod, rh, rl);    switch (mod) {    case 0:	if (M.x86.mode & SYSMODE_PREFIX_DATA) {	    u32 *destreg;	    u32 srcval;	    destreg = DECODE_RM_LONG_REGISTER(rh);	    DECODE_PRINTF(",");	    srcoffset = decode_rm00_address(rl);	    srcval = fetch_data_long(srcoffset);	    DECODE_PRINTF("\n");	    TRACE_AND_STEP();	    *destreg = or_long(*destreg, srcval);	} else {	    u16 *destreg;	    u16 srcval;	    destreg = DECODE_RM_WORD_REGISTER(rh);	    DECODE_PRINTF(",");	    srcoffset = decode_rm00_address(rl);	    srcval = fetch_data_word(srcoffset);	    DECODE_PRINTF("\n");	    TRACE_AND_STEP();	    *destreg = or_word(*destreg, srcval);	}	break;    case 1:	if (M.x86.mode & SYSMODE_PREFIX_DATA) {	    u32 *destreg;	    u32 srcval;	    destreg = DECODE_RM_LONG_REGISTER(rh);	    DECODE_PRINTF(",");	    srcoffset = decode_rm01_address(rl);	    srcval = fetch_data_long(srcoffset);	    DECODE_PRINTF("\n");	    TRACE_AND_STEP();	    *destreg = or_long(*destreg, srcval);	} else {	    u16 *destreg;	    u16 srcval;	    destreg = DECODE_RM_WORD_REGISTER(rh);	    DECODE_PRINTF(",");	    srcoffset = decode_rm01_address(rl);	    srcval = fetch_data_word(srcoffset);	    DECODE_PRINTF("\n");	    TRACE_AND_STEP();	    *destreg = or_word(*destreg, srcval);	}	break;    case 2:	if (M.x86.mode & SYSMODE_PREFIX_DATA) {	    u32 *destreg;	    u32 srcval;	    destreg = DECODE_RM_LONG_REGISTER(rh);	    DECODE_PRINTF(",");	    srcoffset = decode_rm10_address(rl);	    srcval = fetch_data_long(srcoffset);	    DECODE_PRINTF("\n");	    TRACE_AND_STEP();	    *destreg = or_long(*destreg, srcval);	} else {	    u16 *destreg;	    u16 srcval;	    destreg = DECODE_RM_WORD_REGISTER(rh);	    DECODE_PRINTF(",");	    srcoffset = decode_rm10_address(rl);	    srcval = fetch_data_word(srcoffset);	    DECODE_PRINTF("\n");	    TRACE_AND_STEP();	    *destreg = or_word(*destreg, srcval);	}	break;    case 3:                     /* register to register */	if (M.x86.mode & SYSMODE_PREFIX_DATA) {	    u32 *destreg,*srcreg;	    destreg = DECODE_RM_LONG_REGISTER(rh);	    DECODE_PRINTF(",");	    srcreg = DECODE_RM_LONG_REGISTER(rl);	    DECODE_PRINTF("\n");	    TRACE_AND_STEP();	    *destreg = or_long(*destreg, *srcreg);	} else {	    u16 *destreg,*srcreg;	    destreg = DECODE_RM_WORD_REGISTER(rh);	    DECODE_PRINTF(",");	    srcreg = DECODE_RM_WORD_REGISTER(rl);	    DECODE_PRINTF("\n");	    TRACE_AND_STEP();	    *destreg = or_word(*destreg, *srcreg);	}	break;    }    DECODE_CLEAR_SEGOVR();    END_OF_INSTR();}/****************************************************************************REMARKS:Handles opcode 0x0c****************************************************************************/void x86emuOp_or_byte_AL_IMM(u8 X86EMU_UNUSED(op1)){    u8 srcval;    START_OF_INSTR();    DECODE_PRINTF("OR\tAL,");    srcval = fetch_byte_imm();    DECODE_PRINTF2("%x\n", srcval);    TRACE_AND_STEP();    M.x86.R_AL = or_byte(M.x86.R_AL, srcval);    DECODE_CLEAR_SEGOVR();    END_OF_INSTR();}/****************************************************************************REMARKS:Handles opcode 0x0d****************************************************************************/void x86emuOp_or_word_AX_IMM(u8 X86EMU_UNUSED(op1)){    u32 srcval;    START_OF_INSTR();    if (M.x86.mode & SYSMODE_PREFIX_DATA) {	DECODE_PRINTF("OR\tEAX,");	srcval = fetch_long_imm();    } else {	DECODE_PRINTF("OR\tAX,");	srcval = fetch_word_imm();    }    DECODE_PRINTF2("%x\n", srcval);    TRACE_AND_STEP();    if (M.x86.mode & SYSMODE_PREFIX_DATA) {	M.x86.R_EAX = or_long(M.x86.R_EAX, srcval);    } else {	M.x86.R_AX = or_word(M.x86.R_AX, (u16)srcval);    }    DECODE_CLEAR_SEGOVR();    END_OF_INSTR();}/****************************************************************************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 0x10****************************************************************************/void x86emuOp_adc_byte_RM_R(u8 X86EMU_UNUSED(op1)){    int mod, rl, rh;    u8 *destreg, *srcreg;    uint destoffset;    u8 destval;    START_OF_INSTR();    DECODE_PRINTF("ADC\t");    FETCH_DECODE_MODRM(mod, rh, rl);    switch (mod) {    case 0:	destoffset = decode_rm00_address(rl);	DECODE_PRINTF(",");	destval = fetch_data_byte(destoffset);	srcreg = DECODE_RM_BYTE_REGISTER(rh);	DECODE_PRINTF("\n");	TRACE_AND_STEP();	destval = adc_byte(destval, *srcreg);	store_data_byte(destoffset, destval);	break;    case 1:

⌨️ 快捷键说明

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