📄 vm.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 + -