📄 cpu.java
字号:
/*************************************************
*功能描述:模拟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 + -