虚拟机设计与实现——C/C++

源代码在线查看: run.c

软件大小: 614 K
上传用户: sbukhpak
关键词: 虚拟机
下载地址: 免注册下载 普通下载 VIP

相关代码

				/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
				+                                                                   +
				+ run.c - execution engine                                          +
				+                                                                   +
				+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
				
				/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
				+ public prototypes                                                 + 
				+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
				
				void run(U1 dbg);
				
				/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
				+ definitions                                                       + 
				+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
				
				void run(U1 dbg)
				{	
					U2 tick;
					U8 start_debug_instr;
				
					tick=0;
					debug = dbg;  /*set global from dbgcmd.c*/
				
					interruptOn=TRUE;
				
					DBG_RUN0("initiating bytecode execution\n");
				
					while(RAM[ R[$IP] ] != HALT)
					{
						if(debug==TRUE){ readDbgCmd(); }
						start_debug_instr = (U8)R[$IP];
				
						switch(RAM[ R[$IP] ])
						{
							case LBI:{ HANDLE_LBI(); }break;
							case LWI:{ HANDLE_LWI(); }break;
							case LDI:{ HANDLE_LDI(); }break;
							case LQI:{ HANDLE_LQI(); }break;
							case LF1I:{ HANDLE_LF1I(); }break;
							case LF2I:{ HANDLE_LF2I(); }break;
				
							case LAD:{ HANDLE_LAD(); }break;
							case LAI:{ HANDLE_LAI(); }break;
				
							case LB:{ HANDLE_LB(); }break;
							case LW:{ HANDLE_LW(); }break;
							case LD:{ HANDLE_LD(); }break;
							case LQ:{ HANDLE_LQ(); }break;
							case LF1:{ HANDLE_LF1(); }break;
							case LF2:{ HANDLE_LF2(); }break;
						
							case SB:{ HANDLE_SB(); }break;
							case SW:{ HANDLE_SW(); }break;
							case SD:{ HANDLE_SD(); }break;
							case SQ:{ HANDLE_SQ(); }break;
							case SF1:{ HANDLE_SF1(); }break;
							case SF2:{ HANDLE_SF2(); }break;
				
							case PUSHB:{ HANDLE_PUSHB(); }break;
							case PUSHW:{ HANDLE_PUSHW(); }break;
							case PUSHD:{ HANDLE_PUSHD(); }break;
							case PUSHQ:{ HANDLE_PUSHQ(); }break;
							case PUSHF1:{ HANDLE_PUSHF1(); }break;
							case PUSHF2:{ HANDLE_PUSHF2(); }break;
				
							case POPB:{ HANDLE_POPB(); }break;
							case POPW:{ HANDLE_POPW(); }break;
							case POPD:{ HANDLE_POPD(); }break;
							case POPQ:{ HANDLE_POPQ(); }break;
							case POPF1:{ HANDLE_POPF1(); }break;
							case POPF2:{ HANDLE_POPF2(); }break;
				
							case MOV:{ HANDLE_MOV(); }break;
							case MOVF:{ HANDLE_MOVF(); }break;
							case MOVD:{ HANDLE_MOVD(); }break;
							
							case JMP:{ HANDLE_JMP();  }break;
							case JE:{ HANDLE_JE();  }break;
							case JNE:{ HANDLE_JNE(); }break;
							case SLT:{ HANDLE_SLT(); }break;
							case INT:{ HANDLE_INT(); }break;
							case DI:{ HANDLE_DI(); }break;
							case EI:{ HANDLE_EI(); }break;
							case NOP:{ HANDLE_NOP(); }break;
				
							case AND:{ HANDLE_AND(); }break;
							case OR:{ HANDLE_OR(); }break;
							case XOR:{ HANDLE_XOR(); }break;
							case NOT:{ HANDLE_NOT(); }break;
							case BT:{ handleBT(); }break;
							case BS:{ handleBS(); }break;
				
							case SRA:{ HANDLE_SRA(); }break;
							case SRL:{ HANDLE_SRL(); }break;
							case SL:{ HANDLE_SL(); }break;
				
							case ADD:{ HANDLE_ADD(); }break;
							case SUB:{ HANDLE_SUB(); }break;
							case MULT:{ HANDLE_MULT(); }break;
							case DIV:{ HANDLE_DIV(); }break;
				
							case CAST_IF:{ HANDLE_CAST_IF(); }break;
							case CAST_ID:{ HANDLE_CAST_ID(); }break;
							case CAST_FI:{ HANDLE_CAST_FI(); }break;
							case CAST_FD:{ HANDLE_CAST_FD(); }break;
							case CAST_DI:{ HANDLE_CAST_DI(); }break;
							case CAST_DF:{ HANDLE_CAST_DF(); }break;
				
							case FADD:{ HANDLE_FADD(); }break;
							case FSUB:{ HANDLE_FSUB(); }break;
							case FMULT:{ HANDLE_FMULT(); }break;
							case FDIV:{ HANDLE_FDIV(); }break;
							case FSLT:{ HANDLE_FSLT(); }break;
				
							case DADD:{ HANDLE_DADD(); }break;
							case DSUB:{ HANDLE_DSUB(); }break;
							case DMULT:{ HANDLE_DMULT(); }break;
							case DDIV:{ HANDLE_DDIV(); }break;
							case DSLT:{ HANDLE_DSLT(); }break;
				
							default:
							{ 
								xmlBegin();
								fprintf(errPtr,"run(): ");
								fprintf(errPtr,"bad instruction (%d) ",RAM[R[$IP]]);
								fprintf(errPtr,"at address = ");
								fpU8(errPtr,(U8)R[$IP]);
								fprintf(errPtr,"\n");
								xmlEnd();
				
								ERROR_LVL1("run(): fatal error");
				
							}break;
						
						}/*end switch*/
					
						if(debug==TRUE){ printDbgInstr(start_debug_instr); }
				
						tick++;
						if(tick==65535){ tick = 0; }
				
					}/*end while*/
				
					if(debug==TRUE){ readDbgCmd(); }
					DBG_RUN0("HALT instruction executed\n");
					return;
				
				}/*end run*/			

相关资源