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

📄 模拟机.cpp

📁 初学者
💻 CPP
字号:
#include<stdio.h>
#include"huibian.h"
#include<math.h>
#include<ctype.h>

#define MAXMUM 100
#define ISNUM 20
int instruction[ISNUM][32],inst[32],Memory[MAXMUM];
int pc,op,rs,rt,rd,shmt,func,data,flag=0,PCmax;
long int addr;
long reg[32];
FILE *fp3;

int btot(int h, int t)
{
	int i,j;
	long int sum=0;
	j=t-h;
	for(i=h;i<=t;i++)
		sum+=inst[i]*(int)pow(2,j--);
	return sum;
}

void decode()
{
	op=btot(0,5);
	rs=btot(6,10);
	rt=btot(11,15);
	rd=btot(16,20);
	shmt=btot(21,25);
	func=btot(26,31);
	data=btot(16,31);
	addr=btot(6,31);
}

void add()
{
	reg[rd]=reg[rs]+reg[rt];
}
void sub()
{
	reg[rd]=reg[rs]-reg[rt];
}
void and()
{
	reg[rd]=reg[rs]&reg[rt];
}
void or()
{
	reg[rd]=reg[rs]|reg[rt];
}
void nor()
{
	reg[rd]=reg[rs]^reg[rt];
}
void slt()
{	
	if(reg[rs]<reg[rt])
		reg[rd]=1;
	else reg[rd]=0;
}
void jr()
{
	pc=reg[rs];
}
void sll()
{
	reg[rd]=reg[rt]<<shmt;
}
void srl()
{
	reg[rd]=reg[rt]>>shmt;
}
void beq()
{
	if(reg[rs]==reg[rt])
	{
		pc=pc+data;
		flag=1;
	}
}
void bne()
{
	if(reg[rs]!=reg[rt])
	{
		pc=pc+data;
		flag=1;
	}
}
void lw()
{
	int p;
	p=reg[rs]+data;
	reg[rt]=Memory[p];
}
void sw()
{
	int p;
	p=reg[rs]+data;
	Memory[p]=reg[rt];
}
void addi()
{
	reg[rd]=reg[rs]+data;
}
void andi()
{
	reg[rd]=reg[rs]&data;
}
void ori()
{
	reg[rd]=reg[rs]|data;
}
void lui()
{
	reg[rd]=reg[rs]&data;
}
void slti()
{
	reg[rd]=reg[rs]&data;
}
void j()
{
	pc=addr;
	flag=1;
}
void jal()
{
	pc=addr;
	flag=1;
}

void exec()
{
	switch(op){
	case 0:         //R-format
		switch(func){
		case 32: add();		break;
//		case 33: addu();	break;
		case 34: sub();		break;
//		case 35: subu();	break;
		case 36: and();		break;
		case 37: or();		break;
		case 39: nor();		break;
		case 42: slt();		break;
//		case 43: sltu();	break;
		case  8: jr();		break;
		case  0: sll();		break;
		case  2: srl();		break;
		} break;
	case 4:		beq();	break;
	case 5:		bne();	break;
	case 35:	lw();	break;	
	case 43:	sw();	break;	
//	case 40:	sb();	break;	
//	case 41:	sh();	break;	
//	case 36:	lbu();	break;	
//	case 37:	lhu();	break;	
	case 8:		addi(); break; 
//	case 9:		addiu();break;
	case 12:	andi(); break;	
	case 15:	lui();	break;
	case 10:	slti(); break; 
//	case 11:	sltiu();break;
	case 13:	ori();	break;  
	case 2:		j();	break;	
	case 3:		jal();	break;	
	}
}
		
void read()
{
	int i=0,j=0;
	while(!feof(fp2))
	{
		for(j=0;j<32;j++)
		{
			if((ch=fgetc(fp2))=='1')	instruction[i][j]=1;
			else instruction[i][j]=0;
		}
		i++;
		fgetc(fp2);
	}
	PCmax=i-1;
	for(i=0;i<MAXMUM;i++)
		Memory[i]=i;
}

void moni()
{
	for(i=0;i<32;i++)
		inst[i]=instruction[pc][i];
	decode();
	exec();
	if(flag==0) pc++;
	flag=0;
}

void display()
{
	fprintf(fp3,"pc=%d\t\n",pc*4);	
	for(i=0;i<32;i++)
	{
		fprintf(fp3,"Reg[%d]=%ld\t",i,reg[i]);
		if((i+1)%4==0)fprintf(fp3,"\n");
	}
	for(i=0;i<MAXMUM;i++)
		fprintf(fp3,"Memory[%d]=%d\n",i,Memory[i]);
	fprintf(fp3,"\n\n");
}
void initialize()
{
	for(i=0;i<32;i++)
		reg[i]=0;
	pc=0;
	reg[17]=8;
	reg[18]=9;
	reg[19]=3;
	reg[20]=4;
}

void main()
{
	if((fp1=fopen("huibianma.txt","r"))==NULL)
	{
		printf("can not open huibianma.txt\n");
	}
	if((fp2=fopen("jiqima.txt","w+"))==NULL)
	{
		printf("can not open jiqima.txt\n");
	}
	if((fp3=fopen("state.txt","w"))==NULL)
	{
		printf("can not open state.txt\n");
	}
	while(!feof(fp1))
	{
		i=0;
		while(isalpha(ch=fgetc(fp1)))
			opp[i++]=ch;opp[i]='\0';
		execc();
	}
	rewind(fp2);
	initialize();
	read();
	fprintf(fp3,"%d instructions:\n",PCmax);
	while(pc<PCmax)
	{
		moni();
		display();
	}
}

⌨️ 快捷键说明

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