📄 模拟机.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]®[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 + -