挑战:奋战n(n<=3)小时,编台虚拟计算机VM!
**实验:**用面向对象的方法,设计一代虚拟计算机。包括:控制器(CU),运算器(ALU),存储器(Memory),输入、输出部件。
**要求:**能够正确执行给定指令集的指令序列,输出正确结果。
**高阶要求:**能应对异常输入,可扩展指令集、设备等。
冯诺依曼计算机逻辑结构五部分:
控制器CU:根据指令指针(PC, Program Counter,保存当前运行的指令的地址,初值为0。假设指令从0号单元开始存放。在执行完一条指令后,PC默认指向下一条指令)。控制器指挥各个部件共同完成运行。它依次读取每条指令、译指、通知各个部件完成相应任务,直到读到HALT停机指令。
运算器ALU:能执行指定指令集的运算,有累加器(AC, accumulator)寄存器。
存储器Memory:一块连续的空间,可以存储数据和指令,可按初始化参数指定大小。
输入设备:可从标准控制台输入设备接收输入指令序列
输出设备:可从标准控制台输出设备输结果
#include<iostream>
#include<string>
using namespace std;
class QD_CU{
public:
int i;
string name;
QD_CU(string name,int i=0):name(name),i(i){
}//通过在构造函数中加一个string实现 Computer_1 mycomputer1("青芯CU0","青芯ALU0",512,"青入设备0","青出设备0");
};
class QD_ALU{
public:
int add1;
string name;
int add(int a,int b){
return a+b;
}
int sub(int a,int b){
return a-b;
}
int mul(int a,int b){
return a*b;
}
int div(int a,int b){
return a/b;
}
QD_ALU(string name,int add1=0):name(name),add1(add1){}
};
class QD_Memory{
public:
int n;
int *a;
QD_Memory(int n):n(n){
a=new int[n+1];
}
};
class QD_In{
public:
string name;
int ccin(){
// int now;
cin>>now;
// return now;
}
int now;
QD_In(string name):name(name){
}
};
class QD_Out{
public:
string name;
void ccout(int a){
cout<<a<<endl;
}
QD_Out(string name):name(name){
}
};
class Computer_1{
private:
QD_CU cu;
QD_ALU alu;
QD_Memory memory;
QD_In in;
QD_Out out;
public:
Computer_1(string s1,string s2,int n,string s3,string s4):cu(s1),alu(s2),memory(n),in(s3),out(s4){
// cu=QD_CU ccu(s1);
// cu.name=s1;
// alu=QD_ALU aalu(s2);
// memory=QD_Memory(n);
// in=QD_In(s3);
// out=QD_Out(s4); 已经在数据成员中声明类的对象,就不需要再通过一个对象赋值进行初始化
}
void run();
// void chuansong(){
// (this->memory).a[this->cu.i]=this->in.now;
// }
};
void Computer_1::run(){
while(1){
cout<<"请输入指令:" ;
// cout<<memory.a[7]<<" "<<memory.a[8]<<endl;
in.ccin();
// chuansong();
(this->memory).a[this->cu.i]=this->in.now;//逻辑理清了吗? 我这种方法错在哪里?
// [Error] cannot convert 'QD_In::ccin' from type 'int (QD_In::)()' to type 'int'
//cout<<cu.i<<' '<<memory.a[cu.i]<<endl;
if(memory.a[cu.i]/100==10) {
cout<<"请输入需要存到内存单元为"<<memory.a[cu.i]%100<<"的整数:" ;
in.ccin();
memory.a[memory.a[cu.i]%100]=in.now;
cu.i++;
// cout<<"10"<<endl;
}
if(memory.a[cu.i]/100==11) {
cout<<"内存单元"<<memory.a[cu.i]%100<<"存的内容为:" ;
out.ccout(memory.a[memory.a[cu.i]%100]);
cu.i++;
// cout<<"11"<<endl;
}
if(memory.a[cu.i]/100==20) {
alu.add1=memory.a[memory.a[cu.i]%100];
cout<<"已经将"<<memory.a[cu.i]%100<<"号单元的内容存入运算器中的累加器"<<endl;
cu.i++;
// cout<<"20"<<endl;
}
if(memory.a[cu.i]/100==21) {
memory.a[memory.a[cu.i]%100]=alu.add1;
cout<<"已经将累加器的内容存入"<<memory.a[cu.i]%100<<"号单元"<<endl;
cu.i++;
// cout<<"21"<<endl;
}
if(memory.a[cu.i]/100==30) {
alu.add1=alu.add(alu.add1,memory.a[memory.a[cu.i]%100]);
cout<<"已经将"<<memory.a[cu.i]%100<<"号单元的内容与累加器的内容相加"<<endl;
cu.i++;
// cout<<"30"<<endl;cout<<alu.add1<<endl;
}
if(memory.a[cu.i]/100==31) {
alu.add1=alu.sub(alu.add1,memory.a[memory.a[cu.i]%100]);
cout<<"已经将累加器的内容减去"<<memory.a[cu.i]%100<<"号单元的内容"<<endl;
cu.i++;
// cout<<"31"<<endl;cout<<alu.add1<<endl;
}
if(memory.a[cu.i]/100==32) {
alu.add1=alu.mul(alu.add1,memory.a[memory.a[cu.i]%100]);
cout<<"已经将"<<memory.a[cu.i]%100<<"号单元的内容与累加器的内容相乘"<<endl;
cu.i++;
// cout<<"32"<<endl;cout<<alu.add1<<endl;
}
if(memory.a[cu.i]/100==33) {
alu.add1=alu.div(alu.add1,memory.a[memory.a[cu.i]%100]);
cout<<"已经将累加器的内容除以"<<memory.a[cu.i]%100<<"号单元的内容"<<endl;
cu.i++;
// cout<<"33"<<endl;cout<<alu.add1<<endl;
}
if(memory.a[cu.i]/100==40) {
cu.i=memory.a[cu.i]%100;
cout<<"已将指令计数器设置为:"<<cu.i<<endl<<"";
// cout<<"40"<<endl;
}
if(memory.a[cu.i]/100==41){
if(alu.add1=0){
cu.i=memory.a[cu.i]%100;
cout<<"已将指令计数器设置为:"<<cu.i<<endl;"";
// cout<<"41"<<endl;
}
}
if(memory.a[cu.i]/100==43){
// cout<<" hhh"<<endl;
cout<<"程序终止!" ;
break;
}
}
}
int main(){
// QD_CU cu0;
// QD_ALU alu0;
// QD_Memory memory0(512);
// QD_In in0;
// QD_Out out0;
// Computer_1 mycomputer1(cu0,alu0,memory0,in0,out0); //内存可存512条指令
Computer_1 mycomputer1("青芯CU0","青芯ALU0",512,"青入设备0","青出设备0"); //内存可存512条指令
//通过参数表判断构造函数的参数是什么样子的,然后再通过这个参数对被组合的类进行初始化,进而判断被组合的类的构造函数是什么样子的
//cout<<" hdh"<<endl; debug
mycomputer1.run();
//cout<<" hhh"<<endl; debug判断出自己的错误是无限循环
return 0;
}