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

📄 pcode.cpp

📁 第一次写的
💻 CPP
字号:
// pcode.cpp: implementation of the pcode class.
//
//////////////////////////////////////////////////////////////////////

#include "pcode.h"

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

pcode::pcode()
{
	cx=0;
}


void pcode::Gen(fct ff,int ll,int aa)
{
	if(cx<CODE_MAX)
	{
		this->code[cx].f=ff;
		this->code[cx].l=ll;
		this->code[cx].a=aa;
		cx++;
	}
}

void pcode::Interpret()
{
	int p,t,l,a;
	fct f;

	t=0;	//栈顶寄存器
	b=1;	//基址寄存器
	p=0;	//程序地址寄存器
	s[1]=0;	//静态链,指向定义该过程的直接外过程(或主程序)运行时最新数据段的基地址。
	s[2]=0;	//动态链,指向调用该过程前正在运行过程的数据段基地址。
	s[3]=0;	//返回地址,记录调用该过程时目标程序的断点,即调用过程指令的下一条指令的地址。
	do
	{
		f=code[p].f;l=code[p].l;a=code[p].a;
		p++;
		switch (f)
		{
		case LIT:			//将常数值取到栈顶,a为常数值
			s[++t]=a; 
			break;
		case LOD:           //将变量值取到栈顶,a为偏移量,l为层差
			s[++t]=s[base(l)+a];
			break;
		case STO:           //将栈顶内容送入某变量单元中,a为偏移量,l为层差
			s[base(l)+a]=s[t--];
			break;
		case CAL:			//调用过程,a为过程地址,l为层差
			s[t+1]=base(l);	
			s[t+2]=b;		
			s[t+3]=p;		
			b=t+1;
			p=a;
			break;
		case INT:			//在运行栈中为被调用的过程开辟a个单元的数据区
			t+=a;break;
		case JMP:			//无条件跳转至a地址
			p=a;break;
		case JPC:			//条件跳转,当栈顶布尔值非真则跳转至a地址,否则顺序执行
			if (s[t]==0) p=a;
			t--;
			break;
		case RED:			//从命令行读入一个输入置于栈顶
			t++;
			cout<<"请输入数据"<<endl;
			cin>>s[t];
			s[base(l)+a]=s[t--];
			break;
		case WRT:			//栈顶值输出至屏幕
			cout<<s[t]<<"\t";
			break;
		case OPR:
			switch (a)		
			{
			case 0:			//过程调用结束后,返回调用点并退栈
				t=b-1;
				p=s[t+3];
				b=s[t+2];
				break;
			case 1:			//栈顶元素取反
				s[t]=-s[t];
				break;
			case 2:	t--;	//次栈顶与栈顶相加,退两个栈元素,结果值进栈
				s[t]=s[t]+s[t+1];
				break;
			case 3:	t--;	//次栈顶减去栈顶,退两个栈元素,结果值进栈
				s[t]=s[t]-s[t+1];
				break;
			case 4:	t--;	//次栈顶乘以栈顶,退两个栈元素,结果值进栈
				s[t]=s[t]*s[t+1];
				break;
			case 5:	t--;	//次栈顶除以栈顶,退两个栈元素,结果值进栈
				s[t]=s[t]/s[t+1];
				break;
			case 6:			//栈顶元素的奇偶判断,结果值在栈顶
				s[t]=s[t]%2;
				break;
			case 8:	t--;	//次栈顶与栈顶是否相等,退两个栈元素,结果值进栈
				s[t]=(s[t]==s[t+1]);
				break;
			case 9:	t--;	//次栈顶与栈顶是否不等,退两个栈元素,结果值进栈
				s[t]=(s[t]!=s[t+1]);
				break;
			case 10: t--;	//次栈顶是否小于栈顶,退两个栈元素,结果值进栈
				s[t]=(s[t]<s[t+1]);
				break;
			case 11: t--;	//次栈顶是否大于等于栈顶,退两个栈元素,结果值进栈
				s[t]=(s[t]>=s[t+1]);
				break;
			case 12: t--;	//次栈顶是否大于栈顶,退两个栈元素,结果值进栈
				s[t]=(s[t]>s[t+1]);
				break;
			case 13: t--;	//次栈顶是否小于等于栈顶,退两个栈元素,结果值进栈
				s[t]=(s[t]<=s[t+1]);
				break;
			case 15:		//屏幕输出换行
				cout<<endl;
				break;
			}
			break;
		}

	}while(p!=0);
}

int pcode::base(int l)
{
	int b1;
	b1=b;
	while(l>0)
	{
		b1=s[b1];
		l--;
	}
	return b1;
}

void pcode::PrintCode()
{
	int i;
	for (i=0;i<cx;i++)
	{
		cout<<i<<"\t";
		switch (code[i].f)
		{
		case LIT:cout<<"LIT\t";break;
		case LOD:cout<<"LOD\t";break;
		case STO:cout<<"STO\t";break;
		case CAL:cout<<"CAL\t";break;
		case INT:cout<<"INT\t";break;
		case JMP:cout<<"JMP\t";break;
		case JPC:cout<<"JPC\t";break;
		case OPR:cout<<"OPR\t";break;
		case RED:cout<<"RED\t";break;
		case WRT:cout<<"WRT\t";break;
		}
		cout<<code[i].l<<"\t"<<code[i].a<<endl;
	}
}

void pcode::OutToFile(string &name)
{
	fstream CodeFile;
	int i;
	name+=".cod";
	CodeFile.open(name.data(),ios::out);
	if(!CodeFile)
	{
		cout<<"打开文件失败";
		exit(0);
	}
//	for(i=0;i<cx;i++)
//		CodeFile.write((char*)&code[i],sizeof(CCode));
	for (i=0;i<cx;i++)
	{
		CodeFile<<i<<"\t";
		switch (code[i].f)
		{
		case LIT:CodeFile<<"LIT\t";break;
		case LOD:CodeFile<<"LOD\t";break;
		case STO:CodeFile<<"STO\t";break;
		case CAL:CodeFile<<"CAL\t";break;
		case INT:CodeFile<<"INT\t";break;
		case JMP:CodeFile<<"JMP\t";break;
		case JPC:CodeFile<<"JPC\t";break;
		case OPR:CodeFile<<"OPR\t";break;
		case RED:CodeFile<<"RED\t";break;
		case WRT:CodeFile<<"WRT\t";break;
		}
		CodeFile<<code[i].l<<"\t"<<code[i].a<<endl;
	}
	CodeFile.close();
}

⌨️ 快捷键说明

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