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

📄 cpu.cpp

📁 C++实现的模拟操作系统
💻 CPP
📖 第 1 页 / 共 2 页
字号:
// Cpu.cpp: implementation of the CCpu class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "os.h"
#include "Cpu.h"

#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

CCpu::CCpu(CShowosDlg * dlg)
{
	pdlg=dlg;
	ax=bx=cx=cs=ds=0;
	psw[0]=psw[1]=psw[2]=0;
	process.ID=999999;
	process.idictatenum=3;
	process.idictaterun=0;
	process.istate=1;
	process.strname="idle";
	process.waittime=0;
	process.pdictate[0].strename="idle";
	process.pdictate[3]=process.pdictate[2]=process.pdictate[0];
	process.pdictate[1]=process.pdictate[4]=process.pdictate[0];
	process.pdictate[5]=process.pdictate[6]=process.pdictate[0];
	process.pdictate[7]=process.pdictate[8]=process.pdictate[0];
	process.pdictate[9]=process.pdictate[10]=process.pdictate[0];
	process.pdictate[11]=process.pdictate[12]=process.pdictate[0];
}

CCpu::~CCpu()
{

}
//////////////////////////////////////////////////////////////////////
//进程执行完
//////////////////////////////////////////////////////////////////////
void CCpu::CpuRunover(CMemory * pmemory){           //进程执行完
	pdlg->m_strdictate.Format("endl");         //在指令输出中显示endl
	pdlg->Updatashow();	
	pmemory->Destroyprocess((int)process.ID);//删除进程
	CpuChooseprocess(pmemory); //选择进程运行		             
}
//////////////////////////////////////////////////////////////////////
//进程执行完
//////////////////////////////////////////////////////////////////////
void CCpu::CpuParseprocess(CMemory * pmemory){                      //解释运行指令
	CString a="add";
	if(!process.pdictate[process.idictaterun].strename.Compare(a)){ //如果为加法指令
		if(process.pdictate[process.idictaterun].iparstate[2]==1){     //判断参数形式
			CpuAdd(process.pdictate[process.idictaterun].strpar[0],process.pdictate[process.idictaterun].ipar[0]);
		}
		else{
			CpuAdd(process.pdictate[process.idictaterun].strpar[0],process.pdictate[process.idictaterun].strpar[1]);
		}
	}
	else if(!process.pdictate[process.idictaterun].strename.Compare("sub")){   //如果为减法指令
		if(process.pdictate[process.idictaterun].iparstate[2]==1){     //判断参数形式
			CpuSub(process.pdictate[process.idictaterun].strpar[0],process.pdictate[process.idictaterun].ipar[0]);
		}
		else{
			CpuSub(process.pdictate[process.idictaterun].strpar[0],process.pdictate[process.idictaterun].strpar[1]);
		}
	}
	else if(!process.pdictate[process.idictaterun].strename.Compare("mul")){  //如果为乘法指令
		CpuMul(process.pdictate[process.idictaterun].strpar[0]);
	}
	else if(!process.pdictate[process.idictaterun].strename.Compare("mov")){  //如果为转移指令
		if(process.pdictate[process.idictaterun].iparstate[2]==1){     //判断参数形式
			CpuMov(process.pdictate[process.idictaterun].strpar[0],process.pdictate[process.idictaterun].ipar[0]);
		}
		else{
			CpuMov(process.pdictate[process.idictaterun].strpar[0],process.pdictate[process.idictaterun].strpar[1]);
		}
	}
	else if(!process.pdictate[process.idictaterun].strename.Compare("div")){  //如果为除法指令
		CpuDiv(process.pdictate[process.idictaterun].strpar[0]);
	}
	else if(!process.pdictate[process.idictaterun].strename.Compare("needa")){//如果需要设备A
		psw[0]=1;
		psw[1]=HALT_NA;   //设置中断原因为需设备A
		process.idictaterun++;   //指令指向下一条
		CpuOther(process.pdictate[process.idictaterun].strename);            //其他指令
		CpuBlockprocess(pmemory);                 //中断处理
	}
	else if(!process.pdictate[process.idictaterun].strename.Compare("needb")){//如果需要设备B
		psw[0]=1;
		psw[1]=HALT_NB;   //设置中断原因为需设备B
		process.idictaterun++;   //指令指向下一条
		CpuBlockprocess(pmemory);                 //中断处理
		CpuOther(process.pdictate[process.idictaterun].strename);            //其他指令
	}
	else if(!process.pdictate[process.idictaterun].strename.Compare("needc")){//如果需要设备C
		psw[0]=1;
		psw[1]=HALT_NC;   //设置中断原因为需设备C
		process.idictaterun++;   //指令指向下一条
		CpuBlockprocess(pmemory);                 //中断处理
		CpuOther(process.pdictate[process.idictaterun].strename);            //其他指令
	}
	else if(!process.pdictate[process.idictaterun].strename.Compare("needab")){//如果需要设备C
		psw[0]=1;
		psw[1]=HALT_NAB;   //设置中断原因为需设备C
		process.idictaterun++;   //指令指向下一条
		CpuBlockprocess(pmemory);                 //中断处理
		CpuOther(process.pdictate[process.idictaterun].strename);            //其他指令
	}
	else if(!process.pdictate[process.idictaterun].strename.Compare("needac")){//如果需要设备C
		psw[0]=1;
		psw[1]=HALT_NAC;   //设置中断原因为需设备C
		process.idictaterun++;   //指令指向下一条
		CpuBlockprocess(pmemory);                 //中断处理
		CpuOther(process.pdictate[process.idictaterun].strename);            //其他指令
	}
	else if(!process.pdictate[process.idictaterun].strename.Compare("needbc")){//如果需要设备C
		psw[0]=1;
		psw[1]=HALT_NBC;   //设置中断原因为需设备C
		process.idictaterun++;   //指令指向下一条
		CpuBlockprocess(pmemory);                 //中断处理
		CpuOther(process.pdictate[process.idictaterun].strename);            //其他指令
	}
	else if(!process.pdictate[process.idictaterun].strename.Compare("needabc")){//如果需要设备C
		psw[0]=1;
		psw[1]=HALT_NABC;   //设置中断原因为需设备C
		process.idictaterun++;   //指令指向下一条
		CpuBlockprocess(pmemory);                 //中断处理
		CpuOther(process.pdictate[process.idictaterun].strename);            //其他指令
	}
	else if(!process.pdictate[process.idictaterun].strename.Compare("needinput")){//如果需要输入
		psw[0]=1;
		psw[1]=5;   //设置中断原因为等待输入
		process.idictaterun++;   //指令指向下一条
		CpuBlockprocess(pmemory);                 //中断处理
		CpuOther(process.pdictate[process.idictaterun].strename);            //其他指令
	}
	else
		CpuOther(process.pdictate[process.idictaterun].strename);            //其他指令
	process.idictaterun++;                                            //指令指向下一条
	Cpushowregister();

}
//////////////////////////////////////////////////////////////////////
//进程执行完
//////////////////////////////////////////////////////////////////////
void CCpu::CpuBlockprocess(CMemory * pmemory){                //中断处理
	process.isavereg[0]=ax;
	process.isavereg[1]=bx;
	process.isavereg[2]=cx;
	process.isavereg[3]=cs;
	process.isavereg[4]=ds;
	process.isavereg[5]=psw[0];
	process.isavereg[6]=psw[1];
	process.isavereg[7]=psw[2];                      //保护现场
	process.ihaltreasion=psw[1];                     //设置中断原因
	pmemory->Blockprocess(process);                  //进程阻塞
	CpuChooseprocess(pmemory);                       //选择进程
//	CpuSetpsw(0,0);								  	 //设置psw[0]为0 表示已处理完中断
 
}
//////////////////////////////////////////////////////////////////////
//cpu一直运行函数
//////////////////////////////////////////////////////////////////////
void CCpu::CpuRun(CMemory * pmemory){         //cpu一直运行函数
	
	if(psw[0]==0){     //如果无中断
		if(process.idictaterun>=process.idictatenum){//如果运行完
			//if(process.strname!="idle")
				CpuRunover(pmemory);
				CpuParseprocess(pmemory);                   //解释运行指令
		}
		else{
			CpuParseprocess(pmemory);                     //解释运行指令
			
		}
		
	}
	else{
		CpuBlockprocess(pmemory);                 //中断处理
		CpuParseprocess(pmemory);                     //解释运行指令
	}
	pdlg->Updatashow();
}

//////////////////////////////////////////////////////////////////////
//初始化寄存器
//////////////////////////////////////////////////////////////////////
void CCpu::CpuInit(int iax,int ibx,int icx,int ics,int ids,int ipsw[3]){
    ax=iax;
	bx=ibx;
	cx=icx;
	cs=ics;
	ds=ids;
	psw[0]=ipsw[0];
	psw[1]=ipsw[1];
	psw[2]=ipsw[3];
	Cpushowregister();

}
//////////////////////////////////////////////////////////////////////
void CCpu::CpuInit(int iax,int ibx,int icx,int ics,int ids,int ipsw1,int ipsw2,int ipsw3){
     int ips[3];
	 ips[0]=ipsw1;
	 ips[1]=ipsw2;
	 ips[2]=ipsw3;
	 CpuInit(iax,ibx,icx,ics,ids,ips);
	 Cpushowregister();
}
///////////////////////////////////////////////////////////////////////
void CCpu::CpuInit(Sprocess process){      //初始化寄存器
	CpuInit(process.isavereg[0],process.isavereg[1],process.isavereg[2],process.isavereg[3],
		process.isavereg[4],process.isavereg[5],process.isavereg[6],process.isavereg[7]);
}
//////////////////////////////////////////////////////////////////////
//得到寄存器的值
//////////////////////////////////////////////////////////////////////
int CCpu::CpuGetax(){   //得到ax的值
	return ax;
}
int CCpu::CpuGetbx(){   //得到bx的值
	return bx;
}
int CCpu::CpuGetcx(){   //得到cx的值
	return cx;
}
int CCpu::CpuGetcs(){   //得到cs的值
	return cs;
}
int CCpu::CpuGetds(){   //得到ds的值
	return ds;
}
int CCpu::CpuGetpsw(int a){   //得到psw 的第a个的值

⌨️ 快捷键说明

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