`
javasogo
  • 浏览: 1769714 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

SML虚拟计算机语言实现模拟器 C++ 源代码

阅读更多

//2005 蒋彪开发 SML虚拟计算机语言实现模拟器
//SML,全名:SIMPLETRAN计算机,是一种老版本的二进制模拟计算机,执行二进制的机器语言,语言名称:SML
//SML部分基本概念:只有一个寄存器,用以存储相关运算的中间变量和进行运算
//只有100个内存单元,用以储存四位的十进制整数,其中整数前两位是操作符后两位是所运算的内存地址
//SML的操作符简介:
/* 10 从键盘中读取一个字到特定内存
11 从特定内存写一个字到屏幕
20 从特定内存将字装入寄存器
21 将寄存器的值装入指定内存单元
30 将内存单元中的值加上寄存器中的值(结果保留在寄存器中)
31 将内存单元中的值减去寄存器中的值(结果保留在寄存器中)
32 将内存单元中的字除以寄存器中的字(结果保留在寄存器中)
33 将内存单元中的值乘以寄存器中的值(结果保留在寄存器中)
40 转移到指定内存单元
41 如果寄存器中的值是负值,则转移到指定内存
42 如果寄存器中的值是0,则转移到指定内存
43 停机 */
#include<iostream>
using std::cin;
using std::cout;
using std::endl;
int leicun[100]={0};
int counter=0;
int jicunqi=0;
int chaozuoshu=0;
int address=0;
void zhuangru() //这个函数的作用就是读入SML程序,并将它写入由数组虚拟的内存中
{
int i=0;
int chengxu=0;
cout<<"请输入程序,以-9999为结束,并且程序数应该在-9999到9999之间"<<endl;
cout<<"内存地址 "<<"程序数 "<<endl;
do
{
cout<<i<<" ";
cin>>chengxu;
if(chengxu>=9999&&chengxu<=-9999)
{
cout<<"您输入了超出范围的程序数,请您重新输入"<<endl;
break;
}
leicun[i]=chengxu;
i++;
}
while(chengxu!=-9999&&i<=100);
if(i>100)
{
cout<<"您输入了超过100条的程序,你他妈的看不懂说明啊!"<<endl;

}

}
void bianxie() //这个函数的作用就是将数组里面的SML程序翻译成C++,并且运行,好好的牛比一把
{
int flag=1;
while(flag)
{
chaozuoshu=leicun[counter]/100;
address=leicun[counter]%100;
switch(chaozuoshu)
{
case 10:
cout<<"请输入一个数字"<<endl;
cin>>leicun[address];
counter++;
break;
case 11:
cout<<"第"<<address<<"号的内存值是: "<<leicun[address]<<endl;
counter++;
break;
case 20:
jicunqi=leicun[address];
cout<<"我们将内存中的值传入寄存器了"<<endl;
counter++;
break;
case 21:
leicun[address]=jicunqi;
cout<<"我们将寄存器传入内存了"<<endl;
counter++;
break;
case 30:
jicunqi+=leicun[address];
cout<<"我们将寄存器中的值和内存中的值相加"<<endl;
counter++;
break;
case 31:
jicunqi-=leicun[address];
cout<<"我们将寄存器中的值和内存中的值相减"<<endl;
counter++;
break;
case 32:
jicunqi/=leicun[address];
cout<<"我们将寄存器中的值和内存中的值相除"<<endl;
counter++;
break;
case 33:
jicunqi*=leicun[address];
cout<<"我们将寄存器中的值和内存中的值相乘"<<endl;
counter++;
break;
case 40:
counter=address;
cout<<"我们调转了程序执行的方向"<<endl;
break;
case 41:
if(jicunqi<0)
{counter=address;
cout<<"我们调转了程序执行的方向"<<endl;}
else
counter++;

break;
case 42:
if(jicunqi==0)
{counter=address;
cout<<"我们调转了程序执行的方向"<<endl;}
else
counter++;
break;
case 43:
flag=0;
cout<<"机器中止了,同志们,寄存器中的值是:"<<jicunqi<<endl;
break;
default:
cout<<"他妈的你输入的是什么吊操作数,怎么不能识别"<<endl;
}
}
}
void jieshao()//这个函数是用来介绍的
{
cout<<"2005 蒋彪开发 SML虚拟计算机语言实现模拟器"<<endl;
cout<<"SML,全名:SIMPLETRAN计算机,是一种老版本的二进制模拟计算机,执行二进制的机器语言,语言名称:SML"<<endl;
cout<<"SML部分基本概念:只有一个寄存器,用以存储相关运算的中间变量和进行运算"<<endl;
cout<<"只有100个内存单元,用以储存四位的十进制整数,其中整数前两位是操作符后两位是所运算的内存地址"<<endl;
cout<<"//SML的操作符简介:"<<endl;
cout<<" 10 从键盘中读取一个字到特定内存"<<endl;
cout<<" 11 从特定内存写一个字到屏幕 "<<endl;
cout<<" 20 从特定内存将字装入寄存器 "<<endl;
cout<<" 21 将寄存器的值装入指定内存单元"<<endl;
cout<<" 30 将内存单元中的值加上寄存器中的值(结果保留在寄存器中)"<<endl;
cout<<" 31 将内存单元中的值减去寄存器中的值(结果保留在寄存器中)"<<endl;
cout<<" 32 将内存单元中的字除以寄存器中的字(结果保留在寄存器中)"<<endl;
cout<<" 33 将内存单元中的值乘以寄存器中的值(结果保留在寄存器中)"<<endl;
cout<<" 40 转移到指定内存单元"<<endl;
cout<<" 41 如果寄存器中的值是负值,则转移到指定内存"<<endl;
cout<<" 42 如果寄存器中的值是0,则转移到指定内存 "<<endl;
cout<<" 43 停机 "<<endl;
}

int main()
{
cout<<"您已经进入了SML模拟器的天堂,首先欢迎您使用该程序,如果您有什么疑问,请键入h,否则键入d将开始程序!"<<endl;
char s;
//char *t="help";
cin>>s;
if(s=='h')
{jieshao();
cout<<"请键入a开始程序!如果您想看示例程序,请键入b"<<endl;
cin>>s;
if(s=='a'){
zhuangru();
bianxie();}
else if(s=='b')
{
cout<<"1007 从屏幕上面读入一个数并将它存入07号内存"<<endl;
cout<<"1008 从屏幕上面读入一个数并将它存入08号内存"<<endl;
cout<<"2007 将07号内存中的数字存入寄存器中 "<<endl;
cout<<"3008 将寄存器中的值和08号内存中的值相加并将结果存入寄存器中"<<endl;
cout<<"2109 将寄存器中的数字存入09号内存中 "<<endl;
cout<<"1109 将09号内存中的数字输出在屏幕上面 "<<endl;
cout<<"4300 停机 "<<endl;
cout<<"-9999 通知模拟器结束SML程序录入"<<endl;
cout<<"这个程序的作用是从屏幕上面读入两个数字并将他们相加"<<endl;
cout<<"蒋彪开发 2005"<<endl;
cout<<"准备好了吗?兄弟们!开始SML的旅行了"<<endl;
zhuangru();
bianxie();
}
}
else{
zhuangru();
bianxie();
}
return 0;
}


分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics