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

📄 alu.cpp

📁 实现各种算数逻辑运算 根据输入的指令不同
💻 CPP
字号:
#include "iostream.h"
//#include "stdafx.h"
//using namespace std;
int C=0,Z=0,V=0,S=0;   
int y[16]={0};
int SST,SSH,SCI,i8_6,i5_3,i2_0;
int q[16]={0},port[16][16]={0};
int f[16]={0};
int a=0,b=0;
int i[9]={0};
int r[16]={0},s[16]={0};
int ctemp=0,cyr=0,ov=0,f15=0,zr=0;
int c_r=0,c_l=0;
int sum;
int c0;


void move()
{	
	switch(SSH)
	{
	case 0:if(i8_6==5)port[b][0]=false;
		else if(i8_6==7)port[b][15]=false;break;
	case 1:if(i8_6==5)port[b][0]=C;
		else if(i8_6==7)port[b][15]=C;break;
	case 2:if(i8_6==4){port[b][0]=f[15];q[0]=port[b][15];}
		else if(i8_6==6){port[b][15]=q[0];q[15]=f[0];}break;
	case 3:if(i8_6==4){port[b][0]=f[0];q[0]=port[b][15];}break;
	}
}  

int Cal(int *d,int *cntl)
{
	
	int sst[3],ssh[2],sci[2];
	int m;
	for(m=0;m<=8;m++)
	{
		if(cntl[m]==0) i[8-m]=0;
		else i[8-m]=1;
	}
	for(m=9;m<=11;m++)
	{
		if(cntl[m]==0) sst[11-m]=0;
		else sst[11-m]=1;
	}
	if(cntl[12]==0) sci[1]=0;else sci[1]=1;
	if(cntl[13]==0) sci[0]=0;else sci[0]=1;
	if(cntl[14]==0) ssh[1]=0;else ssh[1]=1;
	if(cntl[15]==0) ssh[0]=0;else ssh[0]=1;
    a=cntl[16]*8+cntl[17]*4+cntl[18]*2+cntl[19];
	b=cntl[20]*8+cntl[21]*4+cntl[22]*2+cntl[23];//处理数据
	SST = sst[2]*4+sst[1]*2+sst[0];
	SSH = ssh[1]*2+ssh[0];
	SCI = sci[1]*2+sci[0];
	i8_6 = i[8]*4+i[7]*2+i[6];
	i5_3 = i[5]*4+i[4]*2+i[3];
	i2_0 = i[2]*4+i[1]*2+i[0];
	
	int cin;
	switch(SCI)
	{
	case 0:cin=0;break;
	case 1:cin=1;break;
	case 2:cin=C;break;
	case 3:cin=c0;break;
	}
    

	int k;
    switch(i2_0)
	{
	case 0:for(k=0;k<=15;k++)
		   {
			   r[k]=port[a][k];s[k]=q[k];
		   }break;
	case 1:for(k=0;k<=15;k++)
		   {
			   r[k]=port[a][k];s[k]=port[b][k];
		   }break;
	case 2:for(k=0;k<=15;k++)
		   {
			   r[k]=0;s[k]=q[k];
		   }break;
	case 3:for(k=0;k<=15;k++)
		   {
			   r[k]=0;s[k]=port[b][k];
		   }break;
	case 4:for(k=0;k<=15;k++)
		   {
			   r[k]=0;s[k]=port[a][k];
		   }break;
	case 5:for(k=0;k<=15;k++)
		   {
			   r[k]=d[k];s[k]=port[a][k];
		   }break;
	case 6:for(k=0;k<=15;k++)
		   {
			   r[k]=d[k];s[k]=q[k];
		   }break;
	case 7:for(k=0;k<=15;k++)
		   {
			   r[k]=d[k];s[k]=0;
		   }break;
	}


	sum=0;

	switch(i5_3)
	{
	case 0:
		for(k=15;k>=0;k--)
		{
			ctemp=cin;
			f[k]=r[k]+s[k]+cin;
			if(f[k]>=2)
			{
				f[k]=f[k]-2;cin=1;
			}
			else cin =0;
			if(k==3) c0=cin;
		}
		cyr=cin;
		if(ctemp==cin) ov=0;
		else ov=1;
		f15=f[0];
		for(k=0;k<16;k++)  sum+=f[k];
			   if(sum==0) zr=1;
			   else zr=0;break;
	case 1:f[15]=s[15]-r[15]-(1-cin);
			   if(f[15]<0){ f[15]=f[15]+2;cin=1;}
			   else cin=0;
			   for(k=14;k>=0;k--)
			   {
				   ctemp=cin;
				   f[k]=s[k]-r[k]-cin;
				   if(f[k]<0){ f[k]=f[k]+2;cin=1;}
				   else cin=0;
				   if(k==3) c0=cin;
			   }
			   cyr=1-cin;
			   if(cin==ctemp) ov=0;
			   else ov=1;
			   f15=f[0];
			   for(k=0;k<16;k++)  sum+=f[k];
			   if(sum==0) zr=1;
			   else zr=0;break;
	case 2:f[15]=r[15]-s[15]-(1-cin);
			   if(f[15]<0){ f[15]=f[15]+2;cin=1;}
			   else cin=0;
			   for(k=14;k>=0;k--)
			   {
				   ctemp=cin;
				   f[k]=r[k]-s[k]-cin;
				   if(f[k]<0){ f[k]=f[k]+2;cin=1;}
				   else cin=0;
				   if(k==3) c0=cin;
			   }
			   cyr=1-cin;
			   if(cin==ctemp) ov=0;
			   else ov=1;
			   f15=f[0];
			   for(k=0;k<16;k++)  sum+=f[k];
			   if(sum==0) zr=1;
			   else zr=0;break;
	case 3:for(k=15;k>=0;k--)
		   {
			   f[k]=r[k]|s[k];
		   }
		   ov=0;
		   cyr=0;
		   f15=f[0];
		   for(k=0;k<16;k++)  sum+=f[k];
		   if(sum==0) zr=1;
		   else zr=0;
		   break;
	case 4:for(k=15;k>=0;k--)
		   {
			   f[k]=r[k]&s[k];
		   }
		   ov=0;
		   cyr=0;
		   f15=f[0];
		   for(k=0;k<16;k++)  sum+=f[k];
		   if(sum==0) zr=1;
		   else zr=0;break;
	case 5:for(k=15;k>=0;k--)
		   {
			   f[k]=(~r[k])&s[k];
		   }
		   ov=0;
		   cyr=0;
		   f15=f[0];
		   for(k=0;k<16;k++)  sum+=f[k];
		   if(sum==0) zr=1;
		   else zr=0;break;
	case 6:for(k=15;k>=0;k--)
		   {
			   f[k]=r[k]^s[k];
		   }
		   ov=0;
		   cyr=0;
		   f15=f[0];
		   for(k=0;k<16;k++)  sum+=f[k];
		   if(sum==0) zr=1;
		   else zr=0;break;
	case 7:for(k=15;k>=0;k--)
		   {
			   f[k]=!(r[k]^s[k]);
		   }
		   ov=0;
		   cyr=0;
		   f15=f[0];
		   for(k=0;k<16;k++)  sum+=f[k];
		   if(sum==0) zr=1;
		   else zr=0;break;
	}


	switch(i8_6)
	{
	case 0:for(k=0;k<=15;k++)
		   {
			q[k]=f[k];y[k]=f[k];
		   }break;
	case 1:for(k=0;k<=15;k++)
		   {
			   y[k]=f[k];
		   }break;
	case 2:for(k=0;k<=15;k++)
		   {
			   port[b][k]=f[k];y[k]=port[a][k];
		   }break;
	case 3:for(k=0;k<=15;k++)
		   {
			   port[b][k]=f[k];y[k]=f[k];
		   }break;
	case 4:c_r=q[15];
		   for(k=15;k>0;k--)
		   {
			   port[b][k]=f[k-1];
			   q[k]=q[k-1];y[k]=f[k];
		   }
		   y[0]=f[0];
		   move();break;
	case 5:c_r=port[b][15];
		   for(k=15;k>0;k--)
		   {
			   port[b][k]=f[k-1];y[k]=f[k];
		   }
		   y[0]=f[0];
		   move();break;
	case 6:c_l=port[b][0];
		   for(k=0;k<15;k++)
		   {
			   port[b][k]=f[k+1];
			   q[k]=q[k+1];
			   y[k]=f[k];
		   }
		   y[15]=f[15];
		   move();
		   break;
	case 7:c_l=port[b][0];
		   for(k=0;k<15;k++)
		   {
			   port[b][k]=f[k+1];
			   y[k]=f[k];
		   }
		   y[15]=f[15];
		   move();
		   break;
	}

	switch(SST)
	{
	case 0:break;
	case 1:C=cyr;Z=zr;V=ov;S=f15;break;
	case 2:C=0;Z=0;V=0;S=0;break;
	case 3:C=false;break;
	case 4:C=true;break;
	case 5:C=c_r;break;
	case 6:C=c_l;break;
	case 7:C=c_r;break;
	}
    return 0;
}



void reset()
{
	C=0,Z=0,V=0,S=0;
	for(int n=0;n<=15;n++)
	{
		y[n]=0;	f[n]=0;
		q[n]=0; i[n]=0;
		r[n]=0; s[n]=0;
	}
	SST=0,SSH=0,SCI=0,i8_6=0,i5_3=0,i2_0=0;
	for(int m=0;m<=15;m++)
		for (n=0;n<=15;n++)
			port[m][n]=0;
    ctemp=0,cyr=0,ov=0,f15=0,zr=0;
	c_r=0,c_l=0;
	cin=0;
	c0=0;
	sum=0;
}

int main()
{
	int j;
	char cp,lop;
	char input_d;
	int count=0;
	int d[16]={0},cntl[24]={0};
do{
	cout<<"是否输入D?(y or n)";
	cin>>input_d;
	if(input_d=='y'||input_d=='Y')
	{
		cout<<"输入16位二进制数D:";
		char temp1[16];
		cin >> temp1;
		for (int i = 0; i < 16; i++)
			d[i] = temp1[i] - 48;
	}


    cout<<"输入24位控制位:(依次为I8-I0,sst2-sst0,sci1-sci0,ssh1-ssh0,A口,B口)"<<endl;
	 char temp2[30];
		cin >> temp2;
		for (int i = 0; i < 24; i++)
			cntl[i] = temp2[i] - 48;
    cout<<endl;
	
	do{
		int tempc=cyr,tempz=zr,tempv=ov,temps=f15;
        Cal(d,cntl);
		count++;
		cout<<endl;
		if(count<2) {C=tempc; Z=tempz; V=tempv; S=temps;}
		cout<<"CZVS:"<<C<<Z<<V<<S<<endl;
		cout<<"ALU输出:";
		for(j=0;j<=15;j++)
		{
			cout<<y[j];
		}
		cout<<endl;

		cout<<"是否start?(y or n)";
		cin>>cp;
	}while(cp=='y'||cp=='Y');
    count=0;
	cout<<"是否继续?(y or n)";
	cin>>lop;
}while(lop=='y'||lop=='Y');

	return 0;
}

⌨️ 快捷键说明

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