?? 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; //靜態(tài)鏈,指向定義該過程的直接外過程(或主程序)運(yùn)行時最新數(shù)據(jù)段的基地址。
s[2]=0; //動態(tài)鏈,指向調(diào)用該過程前正在運(yùn)行過程的數(shù)據(jù)段基地址。
s[3]=0; //返回地址,記錄調(diào)用該過程時目標(biāo)程序的斷點(diǎn),即調(diào)用過程指令的下一條指令的地址。
do
{
f=code[p].f;l=code[p].l;a=code[p].a;
p++;
switch (f)
{
case LIT: //將常數(shù)值取到棧頂,a為常數(shù)值
s[++t]=a;
break;
case LOD: //將變量值取到棧頂,a為偏移量,l為層差
s[++t]=s[base(l)+a];
break;
case STO: //將棧頂內(nèi)容送入某變量單元中,a為偏移量,l為層差
s[base(l)+a]=s[t--];
break;
case CAL: //調(diào)用過程,a為過程地址,l為層差
s[t+1]=base(l);
s[t+2]=b;
s[t+3]=p;
b=t+1;
p=a;
break;
case INT: //在運(yùn)行棧中為被調(diào)用的過程開辟a個單元的數(shù)據(jù)區(qū)
t+=a;break;
case JMP: //無條件跳轉(zhuǎn)至a地址
p=a;break;
case JPC: //條件跳轉(zhuǎn),當(dāng)棧頂布爾值非真則跳轉(zhuǎn)至a地址,否則順序執(zhí)行
if (s[t]==0) p=a;
t--;
break;
case RED: //從命令行讀入一個輸入置于棧頂
t++;
cout<<"請輸入數(shù)據(jù)"<<endl;
cin>>s[t];
s[base(l)+a]=s[t--];
break;
case WRT: //棧頂值輸出至屏幕
cout<<s[t]<<"\t";
break;
case OPR:
switch (a)
{
case 0: //過程調(diào)用結(jié)束后,返回調(diào)用點(diǎn)并退棧
t=b-1;
p=s[t+3];
b=s[t+2];
break;
case 1: //棧頂元素取反
s[t]=-s[t];
break;
case 2: t--; //次棧頂與棧頂相加,退兩個棧元素,結(jié)果值進(jìn)棧
s[t]=s[t]+s[t+1];
break;
case 3: t--; //次棧頂減去棧頂,退兩個棧元素,結(jié)果值進(jìn)棧
s[t]=s[t]-s[t+1];
break;
case 4: t--; //次棧頂乘以棧頂,退兩個棧元素,結(jié)果值進(jìn)棧
s[t]=s[t]*s[t+1];
break;
case 5: t--; //次棧頂除以棧頂,退兩個棧元素,結(jié)果值進(jìn)棧
s[t]=s[t]/s[t+1];
break;
case 6: //棧頂元素的奇偶判斷,結(jié)果值在棧頂
s[t]=s[t]%2;
break;
case 8: t--; //次棧頂與棧頂是否相等,退兩個棧元素,結(jié)果值進(jìn)棧
s[t]=(s[t]==s[t+1]);
break;
case 9: t--; //次棧頂與棧頂是否不等,退兩個棧元素,結(jié)果值進(jìn)棧
s[t]=(s[t]!=s[t+1]);
break;
case 10: t--; //次棧頂是否小于棧頂,退兩個棧元素,結(jié)果值進(jìn)棧
s[t]=(s[t]<s[t+1]);
break;
case 11: t--; //次棧頂是否大于等于棧頂,退兩個棧元素,結(jié)果值進(jìn)棧
s[t]=(s[t]>=s[t+1]);
break;
case 12: t--; //次棧頂是否大于棧頂,退兩個棧元素,結(jié)果值進(jìn)棧
s[t]=(s[t]>s[t+1]);
break;
case 13: t--; //次棧頂是否小于等于棧頂,退兩個棧元素,結(jié)果值進(jìn)棧
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();
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -