挑战:奋战n(n<=3)小时,编台虚拟计算机VM!

本文介绍了一项编程挑战,即使用面向对象方法设计一款虚拟计算机,包括控制器、运算器、存储器、输入和输出设备。该计算机需能执行给定指令集并处理异常输入,同时具备指令集扩展和设备扩展的能力。文章详细展示了各组件的类定义,并给出了计算机运行的基本流程,涉及指令解析、内存操作和算术运算。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

挑战:奋战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;
}


标题

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值