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