资源简介
一个简单的MIPS模拟器实例 是入门模拟器开发的很好实例相信对大家有帮助
代码片段和文件信息
#include
#include“huibian.h“
#include
#include
#define MAXMUM 100
#define ISNUM 20
int instruction[ISNUM][32]inst[32]Memory[MAXMUM];
int pcoprsrtrdshmtfuncdataflag=0PCmax;
long int addr;
long reg[32];
FILE *fp3;
int btot(int h int t)
{
int ij;
long int sum=0;
j=t-h;
for(i=h;i<=t;i++)
sum+=inst[i]*(int)pow(2j--);
return sum;
}
void decode()
{
op=btot(05);
rs=btot(610);
rt=btot(1115);
rd=btot(1620);
shmt=btot(2125);
func=btot(2631);
data=btot(1631);
addr=btot(631);
}
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[rd]=1;
else reg[rd]=0;
}
void jr()
{
pc=reg[rs];
}
void sll()
{
reg[rd]=reg[rt]< }
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=0j=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 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“ireg[i]);
if((i+1)%4==0)fprintf(fp3“\n“);
}
for(i=0;i fprintf
属性 大小 日期 时间 名称
----------- --------- ---------- ----- ----
目录 0 2007-05-22 17:16 MIPS\
文件 5744 2007-05-07 16:44 MIPS\asm.h
文件 99 2007-05-13 15:54 MIPS\MathineCode.txt
文件 4876 2007-05-13 19:33 MIPS\MIPS.txt
文件 159 2007-05-13 17:59 MIPS\ReadMe.txt
文件 49 2007-05-07 17:54 MIPS\sourse.txt
文件 5135 2007-05-13 15:54 MIPS\statu.txt
文件 31232 2007-05-13 18:08 MIPS\新建 Microsoft Word 文档.doc
目录 0 2007-05-22 17:16 MIPS\模拟机\
文件 5744 2007-05-07 16:44 MIPS\模拟机\huibian.h
文件 49 2007-05-07 17:54 MIPS\模拟机\huibianma.txt
文件 102 2007-05-07 18:13 MIPS\模拟机\jiqima.txt
文件 5473 2007-05-07 18:13 MIPS\模拟机\state.txt
文件 3725 2007-05-07 18:12 MIPS\模拟机\模拟机.cpp
- 上一篇:music算法esprit算法
- 下一篇:MIMO雷达比幅单脉冲测角精度分析
评论
共有 条评论