?? cpu.java
字號(hào):
/*************************************************
*功能描述:模擬CPU
*該CPU能接受的指令: ADD:加法指令 reg1+reg2->reg1
SUB:減法指令 reg1-reg2->reg1
MUL:乘法指令 reg1*reg2->reg1
DIV:除法指令 reg1/reg2->reg3 reg1%reg2->reg3
*2004-9-11 編寫者:賴衛(wèi)國(guó)
*************************************************/
package cpu;
import java.lang.*;
import java.lang.String.*;
import myException.*;
public class CPU
{
private static boolean cpu = false;
private ALU alu;
//四個(gè)數(shù)據(jù)寄存器,能存取int,long,float,double,String型數(shù)據(jù)
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; //程序計(jì)數(shù)器,long型,記錄下一條執(zhí)行指令的地址
private static register_ar AR; //地址寄存器,long型,記錄當(dāng)前執(zhí)行指令的地址
private static register_ir IR; //指令寄存器,String型,記錄當(dāng)前執(zhí)行的指令
private static register_data DR; //緩沖寄存器,記錄當(dāng)前指令或數(shù)據(jù)
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();
}
/**************************************************
*功能描述: 向寄存器存入一個(gè)int型的值
*參數(shù)說(shuō)明: 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("沒(méi)有此寄存器,請(qǐng)檢查寄存器是否有錯(cuò)");
}
/**************************************************
*功能描述: 向寄存器存入一個(gè)long型的值
*參數(shù)說(shuō)明: 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("沒(méi)有此寄存器,請(qǐng)檢查寄存器是否有錯(cuò)");
}
/**************************************************
*功能描述: 向寄存器存入一個(gè)float型的值
*參數(shù)說(shuō)明: 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("沒(méi)有此寄存器,請(qǐng)檢查寄存器是否有錯(cuò)");
}
/**************************************************
*功能描述: 向寄存器存入一個(gè)double型的值
*參數(shù)說(shuō)明: 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("沒(méi)有此寄存器,請(qǐng)檢查寄存器是否有錯(cuò)");
}
/**************************************************
*功能描述: 向寄存器存入一個(gè)String型的值
*參數(shù)說(shuō)明: 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("沒(méi)有此寄存器,請(qǐng)檢查寄存器是否有錯(cuò)");
}
/************************************************************
*功能描述: 獲取寄存器的int型值
*參數(shù)說(shuō)明: 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("沒(méi)有此寄存器,請(qǐng)檢查寄存器是否有錯(cuò)");
return result;
}
/************************************************************
*功能描述: 獲取寄存器的long型值
*參數(shù)說(shuō)明: 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("沒(méi)有此寄存器,請(qǐng)檢查寄存器是否有錯(cuò)");
return result;
}
/************************************************************
*功能描述: 獲取寄存器的float型值
*參數(shù)說(shuō)明: 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("沒(méi)有此寄存器,請(qǐng)檢查寄存器是否有錯(cuò)");
return result;
}
/************************************************************
*功能描述: 獲取寄存器的double型值
*參數(shù)說(shuō)明: 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("沒(méi)有此寄存器,請(qǐng)檢查寄存器是否有錯(cuò)");
return result;
}
/************************************************************
*功能描述: 獲取寄存器的String型值
*參數(shù)說(shuō)明: 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("沒(méi)有此寄存器,請(qǐng)檢查寄存器是否有錯(cuò)");
return result;
}
/************************************************************
*功能描述: 程序計(jì)數(shù)器加1
*參數(shù)說(shuō)明: 無(wú)
*返回值: void
*************************************************************/
public void IntPC()
{
PC.incValue();
}
/*************************************************************
*功能描述: 加法運(yùn)算(long型和double型)reg1+reg2->reg1
*參數(shù)說(shuō)明: reg1:源操作數(shù)1/目的操作數(shù) reg2:源操作數(shù)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("加法運(yùn)算中找不到第二個(gè)寄存器,應(yīng)該是拼寫錯(cuò)誤");
}
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("加法運(yùn)算中找不到第二個(gè)寄存器,應(yīng)該是拼寫錯(cuò)誤");
}
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -