bupt 大作业C语言 ——冯诺依曼式CPU模拟器

bupt 大作业C语言 ——冯诺依曼式CPU模拟器

/*
作者:bupt
时间:2021.7.10

主函数main
 1>取指令,保存到寄存器
 2>分析指令,执行指令
 3>输出代码,数据 
 
代码 code [] 
数据 data [] 
指令 寄存器 ir 	前 16位 
程序 寄存器 ip 	+4 
标志 寄存器 flag   		       (程序计数器 
4个数据 寄存器 ax1 暂时粗存 
4个地址 寄存器 ax5 存放位置,eg:16384->0 
ax[i]  第 i 个寄存器 
*/
————————————————————————————
#include <stdio.h>
#include <stdlib.h>

void read_in_opcode(char code[]);//读入函数
void analyse(char code[],int data[],int ax[],int *ip,int *flag,int *ir);//分析指令并进行操作
void output_function(int *ip,char code[],int data[]);//输出函数 
int binary(char code[],int start,int n);//二进制转十进制 (code 为代码段,start为从什么时候开始翻译,n转换位数)
int cut(int num);//剪切函数,剪切多余部分 (处理溢出数据)


void task1_teleport(int front,int back,int immediate_count,int data[],int ax[]);//数据传输指令 
void task2_calculate_plus(int front,int back,int immediate_count,int data[],int ax[]);//计算加指令 
void task3_calculate_minus(int front,int back,int immediate_count,int data[],int ax[]);//计算减指令 
void task4_calculate_times(int front,int back,int immediate_count,int data[],int ax[]);//计算乘指令 
void task5_calculate_divise(int front,int back,int immediate_count,int data[],int ax[]);//计算整除指令 
void task6_logical_and(int front,int back,int immediate_count,int data[],int ax[]);//逻辑与指令 
void task7_logical_or(int front,int back,int immediate_count,int data[],int ax[]);//逻辑或指令 
void task8_logical_non(int front,int back,int immediate_count,int data[],int ax[]);//逻辑非指令 
void task9_compare(int front,int back,int immediate_count,int data[],int ax[],int *flag);//比较指令
void task10_jump(int front,int back,int immediate_count,int *ip,int *flag);//跳转指令
void task11_input(int front,int ax[],int data[]);//输入指令
void task12_output(int front,int ax[],int data[]);//输出指令 



int main(int argc, char *argv[])
{	
	char code[16400]={0};//代码段(输入的指令) 
	int data[32800]={0};//数据段
	int ax[9]={0};//前四个数据寄存器,后四个地址寄存器 
	int ip=0;//程序计数器
	int flag=0;//标志寄存器
	int ir=0;//指令寄存器

	read_in_opcode(code);//读取指令
	analyse(code,data,ax,&ip,&flag,&ir);//分析指令并进行操作 
	output_function(&ip,code,data);//输出 
	return 0;
}

//将文件中的指令读入 
void read_in_opcode(char code[])//读入函数
{
	int i=0;
	FILE *fPtr=fopen("dict.dic","r") ;
	for(i=0;!feof(fPtr);i++)
	{
		code[i]=getc(fPtr);
	}
} 


void analyse(char code[],int data[],int ax[],int *ip,int *flag,int *ir)//分析指令并进行操作
{
	int i,start;
	int task=1,front_antecedent_instruction,back_post_instruction,immediate_count;
	while (task>=1&&task<=12)
	{
		start=(*ip)/4*33;
		task=binary(code,start,8);
		start=(*ip)/4*33+8;
		front_antecedent_instruction=binary(code,start,4);
		start=(*ip)/4*33+12;
		back_post_instruction=binary(code,start,4);
		start=(*ip)/4*33+16;
		immediate_count=binary(code,start,16);
		
		*ip=(*ip)+4;//标志寄存器 
		*ir=task*256+front_antecedent_instruction*16+back_post_instruction;//指令寄存器更新 
		
		//接下来进行操作 
		switch(task)
		{
			case 1:
				task1_teleport(front_antecedent_instruction,back_post_instruction,immediate_count,data,ax);
				break;
			case 2:
				task2_calculate_plus(front_antecedent_instruction,back_post_instruction,immediate_count,data,ax);
				break;
			case 3:
				task3_calculate_minus(front_antecedent_instruction,back_post_instruction,immediate_count,data,ax);
				break;
			case 4:
				task4_calculate_times(front_antecedent_instruction,back_post_instruction,immediate_count,data,ax);
				break;
			case 5:
				task5_calculate_divise(front_antecedent_instruction,back_post_instruction,immediate_count,data,ax);
				break;
			case 6:
				task6_logical_and(front_antecedent_instruction,back_post_instruction,immediate_count,data,ax);
				break;
			case 7:
				task7_logical_or(front_antecedent_instruction,back_post_instruction,immediate_count,data,ax);
				break;
			case 8:
				task8_logical_non(front_antecedent_instruction,back_post_instruction,immediate_count,data,ax);
				break;
			case 9:
				task9_compare(front_antecedent_instruction,back_post_instruction,immediate_count,data,ax,flag);
				break;
			case 10:
				task10_jump(front_antecedent_instruction,back_post_instruction,immediate_count,ip,flag);
				break;
			case 11:
				task11_input(front_antecedent_instruction,ax,data);
				break;
			case 12:
				task12_output(front_antecedent_instruction,ax,data);
				break;
			default:
				break;
		} 
		
		
		printf("ip = %d\nflag = %d\nir = %d\n",*ip,*flag,*ir);
		for (i=1;i<=4;i++)
		{
			printf("ax%d = %d ",i,ax[i]);
		}
		printf("\n");
		for(i=5;i<=8;i++)
		{
			printf("ax%d = %d ",i,ax[i]);
		}
		printf("\n");
		
		/*
		printf("\ntask:%d\n",task);
		
		printf("\ndataSegment :\n");
		int count=0;
		for(i=0;i<16*16;i++)
		{
			printf("%d ",data[i]);
			count++;
			if(count%16==0)
			printf("\n");
		}*/
	}
}

int binary(char code[],int start,int n)//二进制转十进制 (code 为代码段,start为从什么时候开始翻译,n转换位数)
{
	int sum,i;
	sum=0;
	for (i=start;i<start+n;i++)
	{
		sum=sum*2+(code[i]-'0');
	}
	
	if(n==16)
	{
		if(sum>32767)
			sum=sum-65536;
	}
	return sum;
}

int cut(int num)
{
	num=num%65536;
	if(num>32767)
		num=num-65536;
	if(num<-32767)
		num=65536+num;
	return num;
} 

void output_function(int *ip,char code[],int data[])//输出函数 
{
	int count,flag1,start,i;
	flag1=1;
	count=0;
	*ip=0;
	printf("\ncodeSegment :\n");
	while (flag1!=0)
	{
		start=(*ip)/4*33;
		flag1=binary(code,start,32);
		printf("%d ",flag1);
		*ip=(*ip)+4;
		count++;
		if(count%8==0)
			printf("\n");
	}
	for(i=16*8-count;i>0;i--){
		printf("0 ");
		count++;
		if(count%8==0)
			printf("\n");
	} 
	
	printf("\ndataSegment :\n");
	count=0;
	for(i=0;i<16*16;i++)
	{
		printf("%d ",data[i]);
		count++;
		if(count%16==0)
			printf("\n");
	} 
}

void task1_teleport(int front,int back,int immediate_count,int data[],int ax[])//数据传输指令
{
	if(back==0)
	{ 
		ax[front]=immediate_count;
	}
	else if(back<=4)
	{
		if(front>4)
			data[(ax[front]-16384)/2]=ax[back]; 
		else if(front<=4)
			ax[front]=ax[back];
	} 
	else if(back>4)
	{	
		if(front<=4)
			ax[front]=data[(ax[back]-16384)/2];
		else if(front>4)
			data[(ax[front]-16384)/2]=data[(ax[back]-16384)/2];
	}
} 


void task2_calculate_plus(int front,int back,int immediate_count,int data[],int ax[])//计算加指令
{
	if(back==0)
	{	
		if(front<=4)
		{
			ax[front]+=immediate_count;
			ax[front]=cut(ax[front]);
		}

		else if(front>4)
		{
			data[(ax[front]-16384)/2]+=immediate_count;
			data[(ax[front]-16384)/2]=cut(data[(ax[front]-16384)/2]);	
		}
	}
	else if(back>4)
		{
			if(front<=4){
				ax[front]+=data[(ax[back]-16384)/2];
				ax[front]=cut(ax[front]);
			}
			else if(front>4){
				data[(ax[front]-16384)/2]+=data[(ax[back]-16384)/2];
				data[(ax[front]-16384)/2]=cut(data[(ax[front]-16384)/2]);
			}
		}
	else if(back<=4)
		{
			if(front<=4){
				ax[front]+=ax[back];
				ax[front]=cut(ax[front]);
			}
			else if (front>4){
				data[(ax[front]-16384)/2]+=ax[back];
				data[(ax[front]-16384)/2]=cut(data[(ax[front]-16384)/2]);
			}

		}
} 


void task3_calculate_minus(int front,int back,int immediate_count,int data[],int ax[])//计算减指令 
{
	if(back==0)
	{	
		if(front<=4)
		{
			ax[front]-=immediate_count;
			ax[front]=cut(ax[front]);
		}

		else if(front>4)
		{
			data[(ax[front]-16384)/2]-=immediate_count;
			data[(ax[front]-16384)/2]=cut(data[(ax[front]-16384)/2]);	
		}
	}
	else if(back>4)
		{
			if(front<=4){
				ax[front]-=data[(ax[back]-16384)/2];
				ax[front]=cut(ax[front]);
			}
			else if(front>4){
				data[(ax[front]-16384)/2]-=data[(ax[back]-16384)/2];
				data[(ax[front]-16384)/2]=cut(data[(ax[front]-16384)/2]);
			}
		}
	else if(back<=4)
		{
			if(front<=4){
				ax[front]-=ax[back];
				ax[front]=cut(ax[front]);
			}
			else if (front>4){
				data[(ax[front]-16384)/2]-=ax[back];
				data[(ax[front]-16384)/2]=cut(data[(ax[front]-16384)/2]);
			}

		}
} 


void task4_calculate_times(int front,int back,int immediate_count,int data[],int ax[])//计算乘指令 
{
	if(back==0)
	{	
		if(front<=4)
		{
			ax[front]*=immediate_count;
			ax[front]=cut(ax[front]);
		}

		else if(front>4)
		{
			data[(ax[front]-16384)/2]*=immediate_count;
			data[(ax[front]-16384)/2]=cut(data[(ax[front]-16384)/2]);	
		}
	}
	else if(back>4)
		{
			if(front<=4){
				ax[front]*=data[(ax[back]-16384)/2];
				ax[front]=cut(ax[front]);
			}
			else if(front>4){
				data[(ax[front]-16384)/2]*=data[(ax[back]-16384)/2];
				data[(ax[front]-16384)/2]=cut(data[(ax[front]-16384)/2]);
			}
		}
	else if(back<=4)
		{
			if(front<=4){
				ax[front]*=ax[back];
				ax[front]=cut(ax[front]);
			}
			else if (front>4){
				data[(ax[front]-16384)/2]*=ax[back];
				data[(ax[front]-16384)/2]=cut(data[(ax[front]-16384)/2]);
			}

		}
} 


void task5_calculate_divise(int front,int back,int immediate_count,int data[],int ax[])//计算整除指令 
{
	if(back==0)
	{	
		if(front<=4)
		{
			ax[front]/=immediate_count;
			ax[front]=cut(ax[front]);
		}

		else if(front>4)
		{
			data[(ax[front]-16384)/2]/=immediate_count;
			data[(ax[front]-16384)/2]=cut(data[(ax[front]-16384)/2]);	
		}
	}
	else if(back>4)
		{
			if(front<=4){
				ax[front]/=data[(ax[back]-16384)/2];
				ax[front]=cut(ax[front]);
			}
			else if(front>4){
				data[(ax[front]-16384)/2]/=data[(ax[back]-16384)/2];
				data[(ax[front]-16384)/2]=cut(data[(ax[front]-16384)/2]);
			}
		}
	else if(back<=4)
		{
			if(front<=4){
				ax[front]/=ax[back];
				ax[front]=cut(ax[front]);
			}
			else if (front>4){
				data[(ax[front]-16384)/2]/=ax[back];
				data[(ax[front]-16384)/2]=cut(data[(ax[front]-16384)/2]);
			}

		}
} 


void task6_logical_and(int front,int back,int immediate_count,int data[],int ax[])//逻辑与指令 
{
	if(back==0)
	{
		if(front<=4)
		{
			int a;
			if (ax[front]<0)
				a=ax[front]+65536;
			else
				a=ax[front];
				
			if ((a&immediate_count)==0)
				ax[front]=0;
			else
				ax[front]=1;
		}
		else if (front>4)
		{
			int a;
			if (data[(ax[front]-16384)/2]<0)
				a=data[(ax[front]-16384)/2]+65536;
			else 
				a=data[(ax[front]-16384)/2];
			if((a&immediate_count)==0)
				data[(ax[front]-16384)/2]=0;
			else
				data[(ax[front]-16384)/2]=1;
		}

	}
	else if(back<=4)
	{
		if(front<=4)
		{
			int a;
			if (ax[front]<0)
				a=ax[front]+65536;
			else
				a=ax[front];
			int b;
			if (ax[back]<0)
				b=ax[back]+65536;
			else
				b=ax[back];
				
			if((a&b)==0)
				ax[front]=0;
			else
				ax[front]=1;
		}
		else if(front>4)
		{
			int a;
			if (data[(ax[front]-16384)/2]<0)
				a=data[(ax[front]-16384)/2]+65536;
			else 
				a=data[(ax[front]-16384)/2];
				
			int b;
			if (ax[back]<0)
				b=ax[back]+65536;
			else
				b=ax[back];
				
			if((a&b)==0)
				data[(ax[front]-16384)/2]=0;
			else 
				data[(ax[front]-16384)/2]=1;
		}
	}
	else if(back>4)
	{
		if(front<5)
		{
			int a;
			if (ax[front]<0)
				a=ax[front]+65536;
			else
				a=ax[front];
			
			int b;
			if (data[(ax[back]-16384)/2]<0)
				b=data[(ax[back]-16384)/2]+65536;
			else 
				b=data[(ax[back]-16384)/2];
				
			if((a&b)==0)
				ax[front]=0;
			else
				ax[front]=1;
		}
		else if (front>4)
		{
			int a;
			if (data[(ax[front]-16384)/2]<0)
				a=data[(ax[front]-16384)/2]+65536;
			else 
				a=data[(ax[front]-16384)/2];
				
			int b;
			if (data[(ax[back]-16384)/2]<0)
				b=data[(ax[back]-16384)/2]+65536;
			else 
				b=data[(ax[back]-16384)/2];
			
			if((a&b)==0)
				data[(ax[front]-16384)/2]=0;
			else
				data[(ax[front]-16384)/2]=1;
		}
	}
}


void task7_logical_or(int front,int back,int immediate_count,int data[],int ax[])//逻辑或指令 
{
	if(back==0)
	{
		if(front<=4)
		{
			int a;
			if (ax[front]<0)
				a=ax[front]+65536;
			else
				a=ax[front];
			if ((a|immediate_count)==0)
				ax[front]=0;
			else
				ax[front]=1;
		}
		else if (front>4)
		{
			int a;
			if (data[(ax[front]-16384)/2]<0)
				a=data[(ax[front]-16384)/2]+65536;
			else 
				a=data[(ax[front]-16384)/2];
			if((a|immediate_count)==0)
				data[(ax[front]-16384)/2]=0;
			else
				data[(ax[front]-16384)/2]=1;
		}

	}
	else if(back<=4)
	{
		if(front<=4)
		{
			int a;
			if (ax[front]<0)
				a=ax[front]+65536;
			else
				a=ax[front];
				
			int b;
			if (ax[back]<0)
				b=ax[back]+65536;
			else
				b=ax[back];
				
			if((a|b)==0)
				ax[front]=0;
			else
				ax[front]=1;
		}
		else if(front>4)
		{
			int a;
			if (data[(ax[front]-16384)/2]<0)
				a=data[(ax[front]-16384)/2]+65536;
			else 
				a=data[(ax[front]-16384)/2];
				
			int b;
			if (ax[back]<0)
				b=ax[back]+65536;
			else
				b=ax[back];
				
			if((a|b)==0)
				data[(ax[front]-16384)/2]=0;
			else 
				data[(ax[front]-16384)/2]=1;
		}
	}
	else if(back>4)
	{
		if(front<5)
		{
			int a;
			if (ax[front]<0)
				a=ax[front]+65536;
			else
				a=ax[front];
			
			int b;
			if (data[(ax[back]-16384)/2]<0)
				b=data[(ax[back]-16384)/2]+65536;
			else 
				b=data[(ax[back]-16384)/2];
				
			if((a|b)==0)
				ax[front]=0;
			else
				ax[front]=1;
		}
		else if (front>4)
		{
			int a;
			if (data[(ax[front]-16384)/2]<0)
				a=data[(ax[front]-16384)/2]+65536;
			else 
				a=data[(ax[front]-16384)/2];
				
			int b;
			if (data[(ax[back]-16384)/2]<0)
				b=data[(ax[back]-16384)/2]+65536;
			else 
				b=data[(ax[back]-16384)/2];
			
			if((a|b)==0)
				data[(ax[front]-16384)/2]=0;
			else
				data[(ax[front]-16384)/2]=1;
		}
	}
}


void task8_logical_non(int front,int back,int immediate_count,int data[],int ax[])//逻辑非指令 
{
	if(front==0)
	{
		if(back>4)
		{
			if((!data[(ax[back]-16384)/2])==0)
				data[(ax[back]-16384)/2]=0;
			else
				data[(ax[back]-16384)/2]=1;
		}
		else if (back<=4)
		{
			if(!ax[back]==0)
				ax[back]=0;
			else
				ax[back]=1;
		}
	}
	else if(back==0)
	{
		if(front<=4)
		{
			if((!ax[front])==0)
				ax[front]=0;
			else
				ax[front]=1;
		}
		else if(front>4)
		{
			if((!data[(ax[front]-16384)/2])==0)
				data[(ax[front]-16384)/2]=0;
			else
				data[(ax[front]-16384)/2]=1;
		}
	}
}


void task9_compare(int front,int back,int immediate_count,int data[],int ax[],int *flag)//比较指令
{
	if(back==0)
	{
		if(front<=4)
		{
			if(ax[front]>immediate_count)
				*flag=1;
			if(ax[front]==immediate_count)
				*flag=0;
			if(ax[front]<immediate_count)
				*flag=-1;
		}
		else if (front>4)
		{
			if(data[(ax[front]-16384)/2]>immediate_count)
				*flag=1;
			if(data[(ax[front]-16384)/2]==immediate_count)
				*flag=0;
			if(data[(ax[front]-16384)/2]<immediate_count)
				*flag=-1;
		}
	}
	else if(back<=4)
	{
		if (front<=4)
		{
			if(ax[front]>ax[back])
				*flag=1;
			if(ax[front]==ax[back])
				*flag=0;
			if(ax[front]<ax[back])
				*flag=-1;
		}
		else if(front>4)
		{
			if(data[(ax[front]-16384)/2]>ax[back])
				*flag=1;
			if(data[(ax[front]-16384)/2]==ax[back])
				*flag=0;
			if(data[(ax[front]-16384)/2]<ax[back])
				*flag=-1;
		}
	}
	else if(back>4)
	{
		if (front<=4)
		{
			if(ax[front]>data[(ax[back]-16384)/2])
				*flag=1;
			if(ax[front]==data[(ax[back]-16384)/2])
				*flag=0;
			if(ax[front]<data[(ax[back]-16384)/2])
				*flag=-1;
		}
		else if(front>4)
		{
			if(data[(ax[front]-16384)/2]>data[(ax[back]-16384)/2])
				*flag=1;
			if(data[(ax[front]-16384)/2]==data[(ax[back]-16384)/2])
				*flag=0;
			if(data[(ax[front]-16384)/2]<data[(ax[back]-16384)/2])
				*flag=-1;
		}
	}
}


void task10_jump(int front,int back,int immediate_count,int *ip,int *flag)//跳转指令
{
	if(back==0)
	{
		*ip=*ip+immediate_count-4;
	}
	if(back==1)
	{
		if(*flag==0)
			*ip=*ip+immediate_count-4;
	}
	if(back==2)
	{
		if(*flag==1)
			*ip=*ip+immediate_count-4;
	}
	if(back==3)
	{
		if(*flag==-1)
			*ip=*ip+immediate_count-4;
	}
}


void task11_input(int front,int ax[],int data[])//输入指令
{
	printf("in:\n");
	if(front<=4)
		scanf("%d",&ax[front]);
	else 
		scanf("%d",&data[(ax[front]-16384)/2]);
}

void task12_output(int front,int ax[],int data[])//输出指令
{
	printf("out: ");
	if(front<=4)
		printf("%d\n",ax[front]);
	else
		printf("%d\n",data[(ax[front]-16384)/2]);
} 


该代码通过北邮oj 4个测试。

实用工具:
北邮19级大作业CPU模拟器指令生成及执行工具.

jray的测试用例

文本对比网站

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值