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

📄 vm.cpp

📁 pascal的编译器 交作业没问题
💻 CPP
字号:
#include "string.h"
#include "stdio.h"
#include "VM.H"

VM::VM()
{
	Init();
}
void VM::Init()
{
    char *strs[]={"LOD","MOV","ADD","SUB","MUL","DIV","CLT",
		"CEQ","JMP","IN","OUT","JTU","INT"};
	for(int i=0;i<MAXINSTRLEN;i++)
		strcpy(ops[i],strs[i]);
}
void VM::Run(Instruction *codes)         //运行代码
{
    printf("------ Tiny Virtual Machine ------\n");
	int IP=0,temp,IP_INC;
    int type=GetInstrType(codes[IP].op);
    while(type!=12)   
	{	
		 IP_INC=0;
         int *op1,*op2;
		 if(codes[IP].p1==RX)   //确定第一个操作数地址
			 op1=&Rx;
		 else
			 op1=&Memory[codes[IP].p1];
		 if(codes[IP].p2==RX)  //确定第二个操作数地址
			 op2=&Rx;
		 else
			 op2=&Memory[codes[IP].p2];
         switch(type)
		 {
		 case 0:            //LOD
             *op1=codes[IP].p2;
			 break;
		 case 1:            //MOV
             *op1=*op2;
			 break;
		 case 2:            //ADD
             Rx=*op1+*op2;
			 break;
		 case 3:            //SUB
             Rx=*op1-*op2;
			 break;
		 case 4:            //MUL
             Rx=*op1*(*op2);
			 break;
		 case 5:            //DIV
             Rx=*op1/(*op2);
			 break;
		 case 6:            //CLT  如果第一个操作数小于第二个操作数Rx=1,否则Rx=0.
             if(*op1<*op2)
			     Rx=1;
			 else
				 Rx=0;
			 break; 
		 case 7:            //CEQ  如果第一个操作数等于第二个操作数Rx=1,否则Rx=0.
             if(*op1==*op2)
			     Rx=1;
			 else
				 Rx=0;
			 break;
		 case 8:            //JMP
             IP=codes[IP].p1;
			 IP_INC=1;
			 break;
		 case 9:             //IN
			 printf("Input:");
			 scanf("%d",&temp);
             *op1=temp;
			 break;
		 case 10:           //OUT
             printf("%d\n",*op1);
			 break;
		 case 11:           //JTU   Rx=1则跳转 。
			 if(Rx==1)
			 {
				 IP=codes[IP].p2;
				 IP_INC=1;
			 }
			 break;
		 default:
			 printf("错误的指令!\n");
			 break;
		 }
		 if(IP_INC==0) IP++;
		 type=GetInstrType(codes[IP].op);
	}
	printf("---------------Done---------------\n");
}

int VM::GetInstrType(char *op)
{
   	for(int i=0;i<MAXINSTRLEN;i++)
		if(strcmp(ops[i],op)==0)
		{
			return i;
			break;
		}
	return -1;
		
}

⌨️ 快捷键说明

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