⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cpu.java

📁 这是一份标准的课程设计文档
💻 JAVA
📖 第 1 页 / 共 2 页
字号:
/*************************************************
*功能描述:模拟CPU
*该CPU能接受的指令:	ADD:加法指令	reg1+reg2->reg1
					SUB:减法指令	reg1-reg2->reg1
					MUL:乘法指令	reg1*reg2->reg1
					DIV:除法指令	reg1/reg2->reg3	reg1%reg2->reg3
*2004-9-11		编写者:赖卫国
*************************************************/
package cpu;
import java.lang.*;
import java.lang.String.*;
import myException.*;
public class CPU
{
	private static boolean	cpu	=	false;
	private ALU				alu;
	//四个数据寄存器,能存取int,long,float,double,String型数据
	private static register_data	AX;
	private	static register_data	BX;
	private	static register_data	CX;
	private	static register_data	DX;

	private	static register_pc		PC;	//程序计数器,long型,记录下一条执行指令的地址
	private	static register_ar		AR;	//地址寄存器,long型,记录当前执行指令的地址
	private	static register_ir		IR;	//指令寄存器,String型,记录当前执行的指令
	private static register_data	DR;	//缓冲寄存器,记录当前指令或数据

	public CPU()
		throws OnlyOneCPUException
	{
		if(!cpu)
		{
			cpu	=	true;
			try
			{
				alu	=	new	ALU();

				AX	=	(register_data)registerFactory.factory("data");
				BX	=	(register_data)registerFactory.factory("data");
				CX	=	(register_data)registerFactory.factory("data");
				DX	=	(register_data)registerFactory.factory("data");

				DR	=	(register_data)registerFactory.factory("data");

				PC	=	(register_pc)registerFactory.factory("pc");
				AR	=	(register_ar)registerFactory.factory("ar");
				IR	=	(register_ir)registerFactory.factory("ir");
			}
			catch(NoSuchRegistException	e){}
			catch(OnlyOneALUException	e1){}
		}
		else throw new OnlyOneCPUException();
	}
	/**************************************************
	*功能描述:	向寄存器存入一个int型的值
	*参数说明:	reg:寄存器名(AX(ax),BX(bx),CX(cx),DX(dx),DR(dr))
				value:要存入的值
	*返回值:	void
	***************************************************/
	public void setRegister(String	reg,int value)
		throws NoSuchRegistException
	{
		if(reg.equals("AX")||reg.equals("ax"))
			AX.setValue(value);
		else if(reg.equals("BX")||reg.equals("bx"))
			BX.setValue(value);
		else if(reg.equals("CX")||reg.equals("cx"))
			CX.setValue(value);
		else if(reg.equals("DX")||reg.equals("dx"))
			DX.setValue(value);
		else if(reg.equals("DR")||reg.equals("dr"))
			DR.setValue(value);
		else if(reg.equals("PC")||reg.equals("pc"))
			PC.setValue(value);
		else if(reg.equals("AR")||reg.equals("ar"))
			AR.setValue(value);
		else throw  new NoSuchRegistException("没有此寄存器,请检查寄存器是否有错");
	}
	/**************************************************
	*功能描述:	向寄存器存入一个long型的值
	*参数说明:	reg:寄存器名(AX(ax),BX(bx),CX(cx),DX(dx),DR(dr),PC(pc),AR(ar))
				value:要存入的值
	*返回值:	void
	***************************************************/
	public void setRegister(String	reg,long value)
		throws NoSuchRegistException
	{
		if(reg.equals("AX")||reg.equals("ax"))
			AX.setValue(value);
		else if(reg.equals("BX")||reg.equals("bx"))
			BX.setValue(value);
		else if(reg.equals("CX")||reg.equals("cx"))
			CX.setValue(value);
		else if(reg.equals("DX")||reg.equals("dx"))
			DX.setValue(value);
		else if(reg.equals("DR")||reg.equals("dr"))
			DR.setValue(value);
		else if(reg.equals("PC")||reg.equals("pc"))
			PC.setValue(value);
		else if(reg.equals("AR")||reg.equals("ar"))
			AR.setValue(value);
		else throw  new NoSuchRegistException("没有此寄存器,请检查寄存器是否有错");
	}
	/**************************************************
	*功能描述:	向寄存器存入一个float型的值
	*参数说明:	reg:寄存器名(AX(ax),BX(bx),CX(cx),DX(dx),DR(dr))
				value:要存入的值
	*返回值:	void
	***************************************************/
	public void setRegister(String	reg,float value)
		throws NoSuchRegistException
	{
		if(reg.equals("AX")||reg.equals("ax"))
			AX.setValue(value);
		else if(reg.equals("BX")||reg.equals("bx"))
			BX.setValue(value);
		else if(reg.equals("CX")||reg.equals("cx"))
			CX.setValue(value);
		else if(reg.equals("DX")||reg.equals("dx"))
			DX.setValue(value);
		else if(reg.equals("DR")||reg.equals("dr"))
			DR.setValue(value);
		else throw  new NoSuchRegistException("没有此寄存器,请检查寄存器是否有错");
	}
	/**************************************************
	*功能描述:	向寄存器存入一个double型的值
	*参数说明:	reg:寄存器名(AX(ax),BX(bx),CX(cx),DX(dx),DR(dr))
				value:要存入的值
	*返回值:	void
	***************************************************/
	public void setRegister(String	reg,double value)
		throws NoSuchRegistException
	{
		if(reg.equals("AX")||reg.equals("ax"))
			AX.setValue(value);
		else if(reg.equals("BX")||reg.equals("bx"))
			BX.setValue(value);
		else if(reg.equals("CX")||reg.equals("cx"))
			CX.setValue(value);
		else if(reg.equals("DX")||reg.equals("dx"))
			DX.setValue(value);
		else if(reg.equals("DR")||reg.equals("dr"))
			DR.setValue(value);
		else throw  new NoSuchRegistException("没有此寄存器,请检查寄存器是否有错");
	}
	/**************************************************
	*功能描述:	向寄存器存入一个String型的值
	*参数说明:	reg:寄存器名(AX(ax),BX(bx),CX(cx),DX(dx),DR(dr),IR(ir))
				value:要存入的值
	*返回值:	void
	***************************************************/
	public void setRegister(String	reg,String value)
		throws NoSuchRegistException
	{
		if(reg.equals("AX")||reg.equals("ax"))
			AX.setValue(value);
		else if(reg.equals("BX")||reg.equals("bx"))
			BX.setValue(value);
		else if(reg.equals("CX")||reg.equals("cx"))
			CX.setValue(value);
		else if(reg.equals("DX")||reg.equals("dx"))
			DX.setValue(value);
		else if(reg.equals("DR")||reg.equals("dr"))
			DR.setValue(value);
		else if(reg.equals("IR")||reg.equals("ir"))
			IR.setValue(value);
		else throw  new NoSuchRegistException("没有此寄存器,请检查寄存器是否有错");
	}
	/************************************************************
	*功能描述:	获取寄存器的int型值
	*参数说明:	reg:寄存器名(AX(ax),BX(bx),CX(cx),DX(dx),DR(dr))
	*返回值:	int
	*************************************************************/
	public int getInt(String reg)
		throws NoSuchRegistException
	{
		int result	=	0;
		if(reg.equals("AX")||reg.equals("ax"))
			result	=	AX.get_int();
		else if(reg.equals("BX")||reg.equals("bx"))
			result	=	BX.get_int();
		else if(reg.equals("CX")||reg.equals("cx"))
			result	=	CX.get_int();
		else if(reg.equals("DX")||reg.equals("dx"))
			result	=	DX.get_int();
		else if(reg.equals("DR")||reg.equals("dr"))
			result	=	DR.get_int();
		else if(reg.equals("PC")||reg.equals("pc"))
			result	=	PC.getInt();
		else if(reg.equals("AR")||reg.equals("ar"))
			result	=	AR.getInt();
		else throw  new NoSuchRegistException("没有此寄存器,请检查寄存器是否有错");
		return result;
	}
	/************************************************************
	*功能描述:	获取寄存器的long型值
	*参数说明:	reg:寄存器名(AX(ax),BX(bx),CX(cx),DX(dx),DR(dr),PC(pc),AR(ar))
	*返回值:	long
	*************************************************************/
	public long getLong(String reg)
		throws NoSuchRegistException
	{
		long result	=	0;
		if(reg.equals("AX")||reg.equals("ax"))
			result	=	AX.get_long();
		else if(reg.equals("BX")||reg.equals("bx"))
			result	=	BX.get_long();
		else if(reg.equals("CX")||reg.equals("cx"))
			result	=	CX.get_long();
		else if(reg.equals("DX")||reg.equals("dx"))
			result	=	DX.get_long();
		else if(reg.equals("DR")||reg.equals("dr"))
			result	=	DR.get_long();
		else if(reg.equals("PC")||reg.equals("pc"))
			result	=	PC.getLong();
		else if(reg.equals("AR")||reg.equals("ar"))
			result	=	AR.getLong();
		else throw  new NoSuchRegistException("没有此寄存器,请检查寄存器是否有错");
		return result;
	}
	/************************************************************
	*功能描述:	获取寄存器的float型值
	*参数说明:	reg:寄存器名(AX(ax),BX(bx),CX(cx),DX(dx),DR(dr))
	*返回值:	float
	*************************************************************/
	public float getFloat(String reg)
		throws NoSuchRegistException
	{
		float result	=	0;
		if(reg.equals("AX")||reg.equals("ax"))
			result	=	AX.get_float();
		else if(reg.equals("BX")||reg.equals("bx"))
			result	=	BX.get_float();
		else if(reg.equals("CX")||reg.equals("cx"))
			result	=	CX.get_float();
		else if(reg.equals("DX")||reg.equals("dx"))
			result	=	DX.get_float();
		else if(reg.equals("DR")||reg.equals("dr"))
			result	=	DR.get_float();
		else throw  new NoSuchRegistException("没有此寄存器,请检查寄存器是否有错");
		return result;
	}
	/************************************************************
	*功能描述:	获取寄存器的double型值
	*参数说明:	reg:寄存器名(AX(ax),BX(bx),CX(cx),DX(dx),DR(dr))
	*返回值:	double
	*************************************************************/
	public double getDouble(String reg)
		throws NoSuchRegistException
	{
		double result	=	0;
		if(reg.equals("AX")||reg.equals("ax"))
			result	=	AX.get_double();
		else if(reg.equals("BX")||reg.equals("bx"))
			result	=	BX.get_double();
		else if(reg.equals("CX")||reg.equals("cx"))
			result	=	CX.get_double();
		else if(reg.equals("DX")||reg.equals("dx"))
			result	=	DX.get_double();
		else if(reg.equals("DR")||reg.equals("dr"))
			result	=	DR.get_double();
		else throw  new NoSuchRegistException("没有此寄存器,请检查寄存器是否有错");
		return result;
	}
	/************************************************************
	*功能描述:	获取寄存器的String型值
	*参数说明:	reg:寄存器名(AX(ax),BX(bx),CX(cx),DX(dx),IR(ir),DR(dr))
	*返回值:	String
	*************************************************************/
	public String getString(String reg)
		throws NoSuchRegistException
	{
		String result	=	null;
		if(reg.equals("AX")||reg.equals("ax"))
			result	=	AX.get_string();
		else if(reg.equals("BX")||reg.equals("bx"))
			result	=	BX.get_string();
		else if(reg.equals("CX")||reg.equals("cx"))
			result	=	CX.get_string();
		else if(reg.equals("DX")||reg.equals("dx"))
			result	=	DX.get_string();
		else if(reg.equals("IR")||reg.equals("ir"))
			result	=	IR.getString();
		else if(reg.equals("DR")||reg.equals("dr"))
			result	=	DR.get_string();
		else throw  new NoSuchRegistException("没有此寄存器,请检查寄存器是否有错");
		return result;
	}
	/************************************************************
	*功能描述:	程序计数器加1
	*参数说明:	无
	*返回值:	void
	*************************************************************/
	public void IntPC()
	{
		PC.incValue();
	}
	/*************************************************************
	*功能描述:	加法运算(long型和double型)reg1+reg2->reg1
	*参数说明:	reg1:源操作数1/目的操作数 reg2:源操作数2
	**************************************************************/
	public	void ADD(String reg1,String reg2)
		throws myException
	{
//		try{
			if(reg1.equals("AX")||reg1.equals("ax"))
			{
				if(reg2.equals("BX")||reg2.equals("bx"))
					alu.ADD(AX,BX);
				else if(reg2.equals("CX")||reg2.equals("cx"))
					alu.ADD(AX,CX);
				else if(reg2.equals("DX")||reg2.equals("dx"))
					alu.ADD(AX,DX);
				else throw new myException("加法运算中找不到第二个寄存器,应该是拼写错误");
			}
			else if (reg1.equals("BX")||reg1.equals("bx"))
			{
				if(reg2.equals("AX")||reg2.equals("ax"))
					alu.ADD(BX,AX);
				else if(reg2.equals("CX")||reg2.equals("cx"))
					alu.ADD(BX,CX);
				else if(reg2.equals("DX")||reg2.equals("dx"))
					alu.ADD(BX,DX);
				else throw new myException("加法运算中找不到第二个寄存器,应该是拼写错误");
			}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -