資源簡介
一個簡單的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雷達比幅單脈沖測角精度分析
評論
共有 條評論