计导大作业:冯诺依曼式CPU模拟器
A:概要设计书
B:单核版
C:双核版
如果有这个资源的大大,请速度留言我!!!秒确认
计导大作业:冯诺依曼式CPU模拟器
A:概要设计书
B:单核版
C:双核版
如果有这个资源的大大,请速度留言我!!!秒确认
/*主函数main
1>取指令,保存到寄存器
2>分析指令,执行指令
3>输出代码,数据
代码 code []
数据 data []
指令 寄存器 ir 前 16位
程序 寄存器 ip +4
标志 寄存器 flag (程序计数器
4个数据 寄存器 ax1 暂时粗存
4个地址 寄存器 ax5 存放位置,eg:16384->0
ax[i] 第 i 个寄存器
*/
#include<stdio.h>
#include<stdlib.h>
void read(char code[]);//读取指令
void analyze(char code[],int data[],int ax[],int *ip,int *ir,int *flag);//分析
void division(int task,int objfront,int objback,int value
,char code[],int data[],int ax[],int *ip,int *ir,int *flag);//task分工
void output(int *ip,char code[],int data[]);//输出
int binary(char code[],int start,int n);//二进制转十进制
void task1 (int task,int objfront,int objback,int value
,char code[],int data[],int ax[],int *ip,int *ir,int *flag);//数据传送
void task2 (int task,int objfront,int objback,int value
,char code[],int data[],int ax[],int *ip,int *ir,int *flag); //算数
void task6 (int task,int objfront,int objback,int value
,char code[],int data[],int ax[],int *ip,int *ir,int *flag);//逻辑
void task9 (int task,int objfront,int objback,int value
,char code[],int data[],int ax[],int *ip,int *ir,int *flag);//比较
void task10 (int task,int objfront,int objback,int value
,char code[],int data[],int ax[],int *ip,int *ir,int *flag);//跳转
void task11 (int task,int objfront,int objback,int value
,char code[],int data[],int ax[],int *ip,int *ir,int *flag);//输入输出
main()
{
char code[16384+10];
int data[32768+10]={0},ax[9]={0};
int ip=0,flag=0,ir=0;
read(code); //读取指令
analyze(code,data,ax,&ip,&ir,&flag); //分析
output(&ip,code,data);
}
//读取指令
/*
参数 代码 code[]
功能 从文件中读取 二进制 指令
返回值 NULL
*/
void read(char code[])
{
int i=0;
FILE *fPtr=fopen("dict.txt","r") ;
if(fPtr==NULL){
printf("error\n");
}
else{
for(i=0;!feof(fPtr);i++)
{
code[i]=getc(fPtr);
}
}
code[i]=NULL;
puts(code);
printf("code[i]中的i %d\n",i);
}
//分析
//指令 寄存器 ir 前 16位
//程序 寄存器 ip +4
/*
参数 代码——数据——ax寄存器——
code[] data[] ax[]
指令指针or程序计数器—— 指令寄存—— 标志寄存
*ip *ir *flag
功能 分析 各个元素(操作task 对象objfront & objback 立即数) 根据task 分工
返回值 NULL
*/
void analyze(char code[],int data[],int ax[],int *ip,int *ir,int *flag)
{
int i,start,cnt;
int task=1,objfront,objback,value;
while(task!=0){
start=(*ip)/4*33; //start 开始翻译的位置
task=binary(code,start,8); //操作码
start=(*ip)/4*33+8;
objfront=binary(code,start,4); //前对象
start=(*ip)/4*33+8+4;
objback=binary(code,start,4); //后对象
start=(*ip)/4*33+16;
value=binary(code,start,16); //立即数
*ip=(*ip)+4; //标志寄存器 更新
*ir=task*256 + objfront*16 + objback ; //指令寄存器 16 bit
division(task,objfront,objback,value,code,data,ax,ip,ir,flag);//分工
//updata更新
printf("ip = %d\nflag = %d\nir = %d\n",*ip,*flag,*ir);
for(i=1;i<=4;i++){
printf("ax%d = %d ",i,ax[i]);
}
printf("\n");
for(i=5;i<=8;i++){
printf("ax%d = %d ",i,ax[i]);
}
printf("\n");
}
}
//代码,数据,输出
/*
参数 指令指针—— 代码——数据
*ip code[] data[]
功能 输出8*16代码,16*16数据 (以十进制)
返回值 NULL
*/
void output(int *ip,char code[],int data[])
{
int cnt,task,start,i;
task=1;
cnt=0;
*ip=0;
//代码段
printf("\ncodeSegment :\n");
while(task!=0){
start=(*ip)/4*33;
task=binary(code,start,32);
printf("%d ",task);
*ip=(*ip)+4;
cnt++;
if(cnt%8==0)
printf("\n");
}
for(i=16*8-cnt;i>0;i--){
printf("0 ");
cnt++;
if(cnt%8==0)
printf("\n");
}
//数据段
printf("\ndataSegment :\n");
cnt=0;
for(i=0;i<= 16*16-1;i++){
printf("%d ",data[i]);
cnt++;
if(cnt%16==0)
printf("\n");
}
}
//二进制 转 十进制
/*
参数 代码——开始 位置——转换 n 位数
code[] start n
功能 将 n 位 二进制数 转化为 十进制
返回值 十进制数
*/
int binary(char code[],int start,int n)
{
int sum,i;
for(i=start,sum=0;i<start+n;i++){
sum=(sum)*2+(code[i]-'0');
}
// printf("%d\n",sum);
//立即数需要判断,是否为负数
if(n==16){
if(sum<=32767)
return sum;
else
return sum-65536;
}
else
return sum;
}
//分工
/*
参数 任务——前操作对象——后操作对象——立即数
task objfront objback value
代码——数据——寄存器
code[] data[] ax[]
指令指针or程序计数器-- 指令寄存-- 标志寄存
*ip *ir *flag
功能 根据task 进行 相应的操作
返回值 NULL
*/
void division(int task,int objfront,int objback,int value
,char code[],int data[],int ax[],int *ip,int *ir,int *flag)
{
switch(task){
case 1://数据传送
task1(task,objfront,objback,value,code,data,ax,ip,ir,flag);
break;
case 2:case 3:case 4:case 5://算术运算
task2(task,objfront,objback,value,code,data,ax,ip,ir,flag);
break;
case 6:case 7:case 8://逻辑运算
task6(task,objfront,objback,value,code,data,ax,ip,ir,flag);
break;
case 9://比较
task9(task,objfront,objback,value,code,data,ax,ip,ir,flag);
break;
case 10://跳转
task10(task,objfront,objback,value,code,data,ax,ip,ir,flag);
break;
case 11:case 12://输入输出
task11(task,objfront,objback,value,code,data,ax,ip,ir,flag);
break;
default:
break;
}
}
/*
数据传送
参数——同division函数的参数
*/
void task1(int task,int objfront,int objback,int value
,char code[],int data[],int ax[],int *ip,int *ir,int *flag)
{
//立即数 的传递
if(objback==0){
ax[objfront]= value;
}
//寄存器 之间的传递
else{
if(objfront<=4)
ax[objfront]= data[ ax[objback]- 16384 ];
else//objfront >= 5
data[ ax[objfront]- 16384 ] = ax[objback] ;
}
}
/*
算数运算指令
参数——同division函数的参数
*/
void task2(int task,int objfront,int objback,int value
,char code[],int data[],int ax[],int *ip,int *ir,int *flag)
{
//立即数 value 的传递
if(objback==0){
switch(task){
case 2:ax[objfront] += value;break;
case 3:ax[objfront] -= value;break;
case 4:ax[objfront] *= value;break;
case 5:ax[objfront] /= value;break;
}
}
//寄存器 之间的传递
else{
switch(task){
case 2:ax[objfront] += data[ ax[objback]- 16384 ];break;
case 3:ax[objfront] -= data[ ax[objback]- 16384 ];break;
case 4:ax[objfront] *= data[ ax[objback]- 16384 ];break;
case 5:ax[objfront] /= data[ ax[objback]- 16384 ];break;
}
}
}
/*
逻辑运算指令
参数——同division函数的参数
*/
void task6(int task,int objfront,int objback,int value
,char code[],int data[],int ax[],int *ip,int *ir,int *flag)
{
//立即数 的传递
if(objback==0){
switch(task){
case 6:
if(ax[objfront] && value)
ax[objfront] = 1;
else
ax[objfront] = 0;
break;
case 7:
if(ax[objfront] || value)
ax[objfront] = 1;
else
ax[objfront] = 0;
break;
case 8:
ax[objfront] = ! ax[objfront] ;
break;
}
}
//寄存器 之间的传递
else{
switch(task){
case 6:
if(ax[objfront] && data[ ax[objback]- 16384 ] )
ax[objfront] = 1;
else
ax[objfront] = 0;
break;
case 7:
if(ax[objfront] || data[ ax[objback]- 16384 ] )
ax[objfront] = 1;
else
ax[objfront] = 0;
break;
case 8:
data[ ax[objback]- 16384 ] = ! data[ ax[objback]- 16384 ];
break;
}
}
}
/*
比较指令
参数——同division函数的参数
*/
void task9(int task,int objfront,int objback,int value
,char code[],int data[],int ax[],int *ip,int *ir,int *flag)
{
//立即数 的传递
if(objback==0){
if( ax[objfront] > value)
*flag=1;
if( ax[objfront] == value)
*flag=0;
if( ax[objfront] < value)
*flag=-1;
}
//寄存器 之间的传递
else{
if( ax[objfront] > data[ ax[objback]- 16384 ] )
*flag=1;
if( ax[objfront] == data[ ax[objback]- 16384 ] )
*flag=0;
if( ax[objfront] < data[ ax[objback]- 16384 ] )
*flag=-1;
}
}
/*
跳转指令
参数——同division函数的参数
*/
void task10(int task,int objfront,int objback,int value
,char code[],int data[],int ax[],int *ip,int *ir,int *flag)
{
if(objback == 0){
*ip += value-4;
}
if(objback == 1){
if(*flag == 0)
*ip += value-4;
}
if(objback == 2){
if(*flag == 1)
*ip += value-4;
}
if(objback == 3){
if(*flag == -1)
*ip += value-4;
}
}
/*
输入输出
参数——同division函数的参数
*/
void task11(int task,int objfront,int objback,int value
,char code[],int data[],int ax[],int *ip,int *ir,int *flag)
{
switch(task){
case 11:
printf("in:\n");
scanf("%d", &ax[objfront] );
break;
case 12:
printf("out:\n");
printf("%d\n", ax[objfront] );
}
}