📄 plx.cpp
字号:
#include "plx.h"
plxw::plxw()
{
}
plxw::~plxw()
{
}
/* 虚拟机 */
void plxw::interpret()
{
t = 0;
b = 1;
p = 0;
s[1] = 0;
s[2] = 0;
s[3] = 0;
do{
i = code[p];
p++;
switch(i.f)
{
case LIT : t++;
s[t] = i.a;
break;
case OPR : switch(i.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: t--;
s[t] = s[t] % s[t+1];
break;
case 7: break;
case 8: t--;
s[t] = (int)(s[t] == s[t+1]);
break;
case 9: t--;
s[t] = (int)(s[t] != s[t+1]);
break;
case 10:t--;
s[t] = (int)(s[t] < s[t+1]);
break;
case 11:t--;
s[t] = (int)(s[t] >= s[t+1]);
break;
case 12:t--;
s[t] = (int)(s[t] > s[t+1]);
break;
case 13:t--;
s[t] = (int)(s[t] <= s[t+1]);
break;
case 14:t--;
s[t] = (int)(s[t] | s[t+1]);
break;
case 15:t--;
s[t] = (int)(s[t] & s[t+1]);
break;
case 16:s[t] = (int)(!s[t]);
break;
}
break;
case LOD : s[t] = s[base(i.l)+i.a + s[t]];
break;
case STO : t--;
s[base(i.l)+i.a + s[t]] = s[t+1];
t--;
break;
case CAL : s[t+1] = base(i.l) ;
s[t+2] = b;
s[t+3] = p;
b = t + 1;
p = i.a;
break;
case INT : t = t + i.a;
break;
case JMP : p = i.a;
break;
case JPC : if(s[t] == 0)
{
p = i.a;
}
t--;
break;
case SHO : printf("%d \n",s[t]);
t--;
break;
default :;
}
}while( p != 0);
}
/* 计算静态链地址 */
int plxw::base(int l)
{
int b1 = b;
int l1 = l;
while(l1 > 0)
{
b1 = s[b1];
l1 = l1 - 1;
}
return b1;
}
void plxw::debug(char *filePath)
{
InFile.open(filePath);
if(!InFile.fail())
{
fillCode();
}else
{
cout<<"the object file is not exist or cann't open it.";
}
}
void plxw::fillCode()
{
int f;
int l;
int a;
int i = 0;
while(true)
{
if(InFile.eof())
{
if(i != 0)
{
this->interpret();
return;
}
}
InFile>>f;
InFile>>l;
InFile>>a;
code[i].f = f;
code[i].l = l;
code[i].a = a;
i++;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -