📄 cpu.cpp
字号:
if(a==0)
return psw[0];
if(a==1)
return psw[1];
if(a==2)
return psw[2];
MessageBox(NULL,"调用CpuGetpsw函数的参数超出范围","警告",MB_OK);
return -1;
}
/////////////////////////////////////////////////////////////////////
//设置psw
/////////////////////////////////////////////////////////////////////
void CCpu::CpuSetpsw(int a,int b){ //设置psw的第a个的值
if(a>=0&&a<=2)
psw[a]=b;
else
MessageBox(NULL,"调用CpuSetpsw函数的参数超出范围","警告",MB_OK);
}
//////////////////////////////////////////////////////////////////////
//加法模拟
//////////////////////////////////////////////////////////////////////
void CCpu::CpuAdd(CString a,CString b){
if(a.Compare("ax")&&b.Compare("bx")){
ax=ax+bx;
pdlg->m_strdictate.Format("ADD %s,%s",a,b);
}
else if(a.Compare("ax")&&b.Compare("cx")){
ax=ax+cx;
pdlg->m_strdictate.Format("ADD %s,%s",a,b);
}
else if(a.Compare("bx")&&b.Compare("cx")){
bx=bx+cx;
pdlg->m_strdictate.Format("ADD %s,%s",a,b);
}
else if(a.Compare("bx")&&b.Compare("ax")){
bx=bx+ax;
pdlg->m_strdictate.Format("ADD %s,%s",a,b);
}
else if(a.Compare("cx")&&b.Compare("ax")){
cx=cx+ax;
pdlg->m_strdictate.Format("ADD %s,%s",a,b);
}
else if(a.Compare("cx")&&b.Compare("bx")){
cx=cx+bx;
pdlg->m_strdictate.Format("ADD %s,%s",a,b);
}
pdlg->Updatashow();
}
//////////////////////////////////////////////////////////////////////
void CCpu::CpuAdd(CString a,int b){
if(!a.Compare("ax")){
ax=ax+b;
pdlg->m_strdictate.Format("ADD %s,%d",a,b);
}
else if(!a.Compare("bx")){
bx=bx+b;
pdlg->m_strdictate.Format("ADD %s,%d",a,b);
}
else if(!a.Compare("cx")){
cx=cx+b;
pdlg->m_strdictate.Format("ADD %s,%d",a,b);
}
pdlg->Updatashow();
}
/////////////////////////////////////////////////////////////////////
//减法模拟
/////////////////////////////////////////////////////////////////////
void CCpu::CpuSub(CString a,CString b){
if(!a.Compare("ax")&&b.Compare("bx")){
ax=ax-bx;
pdlg->m_strdictate.Format("SUB %s,%s",a,b);
}
else if(!a.Compare("ax")&&b.Compare("cx")){
ax=ax-cx;
pdlg->m_strdictate.Format("SUB %s,%s",a,b);
}
else if(!a.Compare("bx")&&b.Compare("cx")){
bx=bx-cx;
pdlg->m_strdictate.Format("SUB %s,%s",a,b);
}
else if(!a.Compare("bx")&&b.Compare("ax")){
bx=bx-ax;
pdlg->m_strdictate.Format("SUB %s,%s",a,b);
}
else if(!a.Compare("cx")&&b.Compare("ax")){
cx=cx-ax;
pdlg->m_strdictate.Format("SUB %s,%s",a,b);
}
else if(!a.Compare("cx")&&b.Compare("bx")){
cx=cx-bx;
pdlg->m_strdictate.Format("SUB %s,%s",a,b);
}
pdlg->Updatashow();
}
////////////////////////////////////////////////////////////////////
void CCpu::CpuSub(CString a,int b){
if(!a.Compare("ax")){
ax=ax-b;
pdlg->m_strdictate.Format("SUB %s,%d",a,b);
}
else if(!a.Compare("bx")){
bx=bx-b;
pdlg->m_strdictate.Format("SUB %s,%d",a,b);
}
else if(!a.Compare("cx")){
cx=cx-b;
pdlg->m_strdictate.Format("SUB %s,%d",a,b);
}
pdlg->Updatashow();
}
////////////////////////////////////////////////////////////////////
//模拟乘法指令
////////////////////////////////////////////////////////////////////
void CCpu::CpuMul(CString a){
if(!a.Compare("bx")){
ax=ax*bx;
pdlg->m_strdictate.Format("MUL ax,%s",a);
}
else if(!a.Compare("cx")){
ax=ax*cx;
pdlg->m_strdictate.Format("MUL ax,%s",a);
}
pdlg->Updatashow();
}
///////////////////////////////////////////////////////////////////
//模拟除法指令
///////////////////////////////////////////////////////////////////
void CCpu::CpuDiv(CString a){
if(!a.Compare("bx")){
ax=ax/bx;
pdlg->m_strdictate.Format("DIV ax,%s",a);
}
else if(!a.Compare("cx")){
ax=ax/cx;
pdlg->m_strdictate.Format("DIV ax,%s",a);
}
pdlg->Updatashow();
}
///////////////////////////////////////////////////////////////////
//模拟赋值指令
///////////////////////////////////////////////////////////////////
void CCpu::CpuMov(CString a,CString b){
if(!a.Compare("ax")&&b.Compare("bx")){
ax=bx;
pdlg->m_strdictate.Format("MOV %s,%s",a,b);
}
else if(!a.Compare("ax")&&b.Compare("cx")){
ax=cx;
pdlg->m_strdictate.Format("MOV %s,%s",a,b);
}
else if(!a.Compare("bx")&&b.Compare("cx")){
bx=cx;
pdlg->m_strdictate.Format("MOV %s,%s",a,b);
}
else if(!a.Compare("bx")&&b.Compare("ax")){
bx=ax;
pdlg->m_strdictate.Format("MOV %s,%s",a,b);
}
else if(!a.Compare("cx")&&b.Compare("ax")){
cx=ax;
pdlg->m_strdictate.Format("MOV %s,%s",a,b);
}
else if(!a.Compare("cx")&&b.Compare("bx")){
cx=bx;
pdlg->m_strdictate.Format("MOV %s,%s",a,b);
}
pdlg->Updatashow();
}
////////////////////////////////////////////////////////////////////
void CCpu::CpuMov(CString a,int b){
if(!a.Compare("ax")){
ax=b;
pdlg->m_strdictate.Format("MOV %s,%d",a,b);
}
else if(!a.Compare("bx")){
bx=b;
pdlg->m_strdictate.Format("MOV %s,%d",a,b);
}
else if(!a.Compare("cx")){
cx=b;
pdlg->m_strdictate.Format("MOV %s,%d",a,b);
}
pdlg->Updatashow();
}
///////////////////////////////////////////////////////////////////
//模拟cpu其他指令,显示字符串a
///////////////////////////////////////////////////////////////////
void CCpu::CpuOther(CString a){ //模拟cpu其他指令,显示字符串a
pdlg->m_strdictate.Format("%s",a);
pdlg->Updatashow();
}
/////////////////////////////////////////////////////////////////////
//显示中间结果
/////////////////////////////////////////////////////////////////////
void CCpu::Cpushowregister(){
pdlg->m_strmidresult.Format(_T("AX : %d BX : %d\r\nCX : %d\r\nCS : %d\r\nDS : %d\r\n"),ax,bx,cx,cs,ds);
pdlg->Updatashow();
}
/////////////////////////////////////////////////////////////////////
//cpu进程调用。采用先来先服务的进程调度。
/////////////////////////////////////////////////////////////////////
void CCpu::CpuChooseprocess(CMemory * pmemory){
int i,run; //i循环变量,run运行的进程号
run=0;
for(i=1;i<=10;i++){ //在就绪进程队列中选择一进程运行
if(pmemory->memory.pcb[i].full){ //如果存放有进程
if(pmemory->memory.pcb[i].pcb.istate==1){
if(pmemory->memory.pcb[i].pcb.ID<pmemory->memory.pcb[run].pcb.ID){//时间优先服务
run=i;
}
}
}
}
//运行[run]进程
pmemory->Setm_pro_state(run,2); //设置[run]进程为运行状态
CpuInit(pmemory->memory.pcb[run].pcb);
process=pmemory->memory.pcb[run].pcb; //初始化process(CpuRun()函数使用)
ax=process.isavereg[0];
bx=process.isavereg[1];
cx=process.isavereg[2];
cs=process.isavereg[3];
ds=process.isavereg[4];
psw[0]=0;
//psw[0]=process.isavereg[5]; //是否有中断
psw[1]=process.isavereg[6];
psw[2]=process.isavereg[7]; //初始化寄存器(ax.bx.cx.cs.ds.psw)
Cpushowregister();
pdlg->m_showprocess.Format("%s",pmemory->memory.pcb[run].pcb.strname);
pdlg->m_strdictate.Format("%s",pmemory->memory.pcb[run].pcb.pdictate[0].strename);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -