📄 mips.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]®[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 + -