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

📄 mips.txt

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

//定义使用函数
int change(int m, int n);
void decode();
void add();
void sub();
void And();
void Or();
void nor();
void slt();
void jr();
void sll();
void srl();
void beq();
void bne();
void lw();
void sw();
void addi();
void andi();
void ori();
void lui();
void slti();
void j();
void jal();
void exec();
void read();
void move();
void display();
void initialize();

#define MEM 100	        //定义内存大小
#define NUMBER 20	//最大指令条数
int instruction[NUMBER][32],inst[32],Memory[MEM];
int pc,op,rs,rt,rd,shmt,func,data,flag=0,PCMAX;
long int addr;	        //定义地址总数
long reg[32];	        //寄存器位数
FILE *fp3;

int main()
           {                //对源文件进行录入代码
	if((fp1=fopen("sourse.txt","r"))==NULL){
		printf("can not open sourse.txt\n");
	}	           //写入机器码前,检查文件
	if((fp2=fopen("MathineCode.txt","w+"))==NULL){
		printf("can not open MathineCode.txt\n");
	}	           //状态字存储
	if((fp3=fopen("statu.txt","w"))==NULL){
		printf("can not open statu.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){
		move();
		display();
	}	return 0;
}     
      
//从文件读入汇编代码,送入instruction[i][j]
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<MEM;i++)
		Memory[i]=i;
}

//指令执行的指针移动,每次执行后指针加一
void move(){
	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<MEM;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;
}

//代码的执行,按照操作码代号调用asm.h
void exec(){
	switch(op){
		case 0:         //R-format
		switch(func){
		case 32: add();		break;
		case 34: sub();		break;
		case 36: And();		break;
		case 37: Or();		break;
		case 39: nor();		break;
		case 42: slt();		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 8:		addi(); break; 
		case 12:	andi(); break;	
		case 15:	lui();	break;
		case 10:	slti(); break; 
		case 13:	ori();	break;  
		case 2:		j();	break;	
		case 3:		jal();	break;	
	}
}

//进行操作码到比特指令转换
int change(int m, int n){
	int i = 0,j = 0;
	long int sum = 0;
	j = n - m;
	for(i=m-1;i<n;i++)
		sum+=inst[i]*((int)pow(2,j--));
	return sum;
}

//对操作码调用change()进行解码
void decode(){
	op=change(0,5);
	rs=change(6,10);
	rt=change(11,15);
	rd=change(16,20);
	shmt=change(21,25);
	func=change(26,31);
	data=change(16,31);
	addr=change(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;
}
//跳转到rs
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;
	}
}
//加载一个(32位)字
void lw(){
	int p;
	p=reg[rs]+data;
	reg[rt]=Memory[p];
}
//存储一个(32位)字
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;
}
//跳转,跳转后flg位置一
void j(){
	pc=addr;
	flag=1;
}
//返回地址的宏指令
void jal(){
	pc=addr;
	flag=1;
}

		

⌨️ 快捷键说明

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