bupt 大作业C语言 ——冯诺依曼式CPU模拟器

/*
作者:bupt
时间:2021.7.10主函数main1>取指令,保存到寄存器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_in_opcode(char code[]);//读入函数
void analyse(char code[],int data[],int ax[],int *ip,int *flag,int *ir);//分析指令并进行操作
void output_function(int *ip,char code[],int data[]);//输出函数
int binary(char code[],int start,int n);//二进制转十进制 (code 为代码段,start为从什么时候开始翻译,n转换位数)
int cut(int num);//剪切函数,剪切多余部分 (处理溢出数据)void task1_teleport(int front,int back,int immediate_count,int data[],int ax[]);//数据传输指令
void task2_calculate_plus(int front,int back,int immediate_count,int data[],int ax[]);//计算加指令
void task3_calculate_minus(int front,int back,int immediate_count,int data[],int ax[]);//计算减指令
void task4_calculate_times(int front,int back,int immediate_count,int data[],int ax[]);//计算乘指令
void task5_calculate_divise(int front,int back,int immediate_count,int data[],int ax[]);//计算整除指令
void task6_logical_and(int front,int back,int immediate_count,int data[],int ax[]);//逻辑与指令
void task7_logical_or(int front,int back,int immediate_count,int data[],int ax[]);//逻辑或指令
void task8_logical_non(int front,int back,int immediate_count,int data[],int ax[]);//逻辑非指令
void task9_compare(int front,int back,int immediate_count,int data[],int ax[],int *flag);//比较指令
void task10_jump(int front,int back,int immediate_count,int *ip,int *flag);//跳转指令
void task11_input(int front,int ax[],int data[]);//输入指令
void task12_output(int front,int ax[],int data[]);//输出指令 int main(int argc, char *argv[])
{   char code[16400]={0};//代码段(输入的指令) int data[32800]={0};//数据段int ax[9]={0};//前四个数据寄存器,后四个地址寄存器 int ip=0;//程序计数器int flag=0;//标志寄存器int ir=0;//指令寄存器read_in_opcode(code);//读取指令analyse(code,data,ax,&ip,&flag,&ir);//分析指令并进行操作 output_function(&ip,code,data);//输出 return 0;
}//将文件中的指令读入
void read_in_opcode(char code[])//读入函数
{int i=0;FILE *fPtr=fopen("dict.dic","r") ;for(i=0;!feof(fPtr);i++){code[i]=getc(fPtr);}
} void analyse(char code[],int data[],int ax[],int *ip,int *flag,int *ir)//分析指令并进行操作
{int i,start;int task=1,front_antecedent_instruction,back_post_instruction,immediate_count;while (task>=1&&task<=12){start=(*ip)/4*33;task=binary(code,start,8);start=(*ip)/4*33+8;front_antecedent_instruction=binary(code,start,4);start=(*ip)/4*33+12;back_post_instruction=binary(code,start,4);start=(*ip)/4*33+16;immediate_count=binary(code,start,16);*ip=(*ip)+4;//标志寄存器 *ir=task*256+front_antecedent_instruction*16+back_post_instruction;//指令寄存器更新 //接下来进行操作 switch(task){case 1:task1_teleport(front_antecedent_instruction,back_post_instruction,immediate_count,data,ax);break;case 2:task2_calculate_plus(front_antecedent_instruction,back_post_instruction,immediate_count,data,ax);break;case 3:task3_calculate_minus(front_antecedent_instruction,back_post_instruction,immediate_count,data,ax);break;case 4:task4_calculate_times(front_antecedent_instruction,back_post_instruction,immediate_count,data,ax);break;case 5:task5_calculate_divise(front_antecedent_instruction,back_post_instruction,immediate_count,data,ax);break;case 6:task6_logical_and(front_antecedent_instruction,back_post_instruction,immediate_count,data,ax);break;case 7:task7_logical_or(front_antecedent_instruction,back_post_instruction,immediate_count,data,ax);break;case 8:task8_logical_non(front_antecedent_instruction,back_post_instruction,immediate_count,data,ax);break;case 9:task9_compare(front_antecedent_instruction,back_post_instruction,immediate_count,data,ax,flag);break;case 10:task10_jump(front_antecedent_instruction,back_post_instruction,immediate_count,ip,flag);break;case 11:task11_input(front_antecedent_instruction,ax,data);break;case 12:task12_output(front_antecedent_instruction,ax,data);break;default:break;} 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");/*printf("\ntask:%d\n",task);printf("\ndataSegment :\n");int count=0;for(i=0;i<16*16;i++){printf("%d ",data[i]);count++;if(count%16==0)printf("\n");}*/}
}int binary(char code[],int start,int n)//二进制转十进制 (code 为代码段,start为从什么时候开始翻译,n转换位数)
{int sum,i;sum=0;for (i=start;i<start+n;i++){sum=sum*2+(code[i]-'0');}if(n==16){if(sum>32767)sum=sum-65536;}return sum;
}int cut(int num)
{num=num%65536;if(num>32767)num=num-65536;if(num<-32767)num=65536+num;return num;
} void output_function(int *ip,char code[],int data[])//输出函数
{int count,flag1,start,i;flag1=1;count=0;*ip=0;printf("\ncodeSegment :\n");while (flag1!=0){start=(*ip)/4*33;flag1=binary(code,start,32);printf("%d ",flag1);*ip=(*ip)+4;count++;if(count%8==0)printf("\n");}for(i=16*8-count;i>0;i--){printf("0 ");count++;if(count%8==0)printf("\n");} printf("\ndataSegment :\n");count=0;for(i=0;i<16*16;i++){printf("%d ",data[i]);count++;if(count%16==0)printf("\n");}
}void task1_teleport(int front,int back,int immediate_count,int data[],int ax[])//数据传输指令
{if(back==0){ ax[front]=immediate_count;}else if(back<=4){if(front>4)data[(ax[front]-16384)/2]=ax[back]; else if(front<=4)ax[front]=ax[back];} else if(back>4){  if(front<=4)ax[front]=data[(ax[back]-16384)/2];else if(front>4)data[(ax[front]-16384)/2]=data[(ax[back]-16384)/2];}
} void task2_calculate_plus(int front,int back,int immediate_count,int data[],int ax[])//计算加指令
{if(back==0){ if(front<=4){ax[front]+=immediate_count;ax[front]=cut(ax[front]);}else if(front>4){data[(ax[front]-16384)/2]+=immediate_count;data[(ax[front]-16384)/2]=cut(data[(ax[front]-16384)/2]);    }}else if(back>4){if(front<=4){ax[front]+=data[(ax[back]-16384)/2];ax[front]=cut(ax[front]);}else if(front>4){data[(ax[front]-16384)/2]+=data[(ax[back]-16384)/2];data[(ax[front]-16384)/2]=cut(data[(ax[front]-16384)/2]);}}else if(back<=4){if(front<=4){ax[front]+=ax[back];ax[front]=cut(ax[front]);}else if (front>4){data[(ax[front]-16384)/2]+=ax[back];data[(ax[front]-16384)/2]=cut(data[(ax[front]-16384)/2]);}}
} void task3_calculate_minus(int front,int back,int immediate_count,int data[],int ax[])//计算减指令
{if(back==0){ if(front<=4){ax[front]-=immediate_count;ax[front]=cut(ax[front]);}else if(front>4){data[(ax[front]-16384)/2]-=immediate_count;data[(ax[front]-16384)/2]=cut(data[(ax[front]-16384)/2]);  }}else if(back>4){if(front<=4){ax[front]-=data[(ax[back]-16384)/2];ax[front]=cut(ax[front]);}else if(front>4){data[(ax[front]-16384)/2]-=data[(ax[back]-16384)/2];data[(ax[front]-16384)/2]=cut(data[(ax[front]-16384)/2]);}}else if(back<=4){if(front<=4){ax[front]-=ax[back];ax[front]=cut(ax[front]);}else if (front>4){data[(ax[front]-16384)/2]-=ax[back];data[(ax[front]-16384)/2]=cut(data[(ax[front]-16384)/2]);}}
} void task4_calculate_times(int front,int back,int immediate_count,int data[],int ax[])//计算乘指令
{if(back==0){ if(front<=4){ax[front]*=immediate_count;ax[front]=cut(ax[front]);}else if(front>4){data[(ax[front]-16384)/2]*=immediate_count;data[(ax[front]-16384)/2]=cut(data[(ax[front]-16384)/2]);  }}else if(back>4){if(front<=4){ax[front]*=data[(ax[back]-16384)/2];ax[front]=cut(ax[front]);}else if(front>4){data[(ax[front]-16384)/2]*=data[(ax[back]-16384)/2];data[(ax[front]-16384)/2]=cut(data[(ax[front]-16384)/2]);}}else if(back<=4){if(front<=4){ax[front]*=ax[back];ax[front]=cut(ax[front]);}else if (front>4){data[(ax[front]-16384)/2]*=ax[back];data[(ax[front]-16384)/2]=cut(data[(ax[front]-16384)/2]);}}
} void task5_calculate_divise(int front,int back,int immediate_count,int data[],int ax[])//计算整除指令
{if(back==0){ if(front<=4){ax[front]/=immediate_count;ax[front]=cut(ax[front]);}else if(front>4){data[(ax[front]-16384)/2]/=immediate_count;data[(ax[front]-16384)/2]=cut(data[(ax[front]-16384)/2]);  }}else if(back>4){if(front<=4){ax[front]/=data[(ax[back]-16384)/2];ax[front]=cut(ax[front]);}else if(front>4){data[(ax[front]-16384)/2]/=data[(ax[back]-16384)/2];data[(ax[front]-16384)/2]=cut(data[(ax[front]-16384)/2]);}}else if(back<=4){if(front<=4){ax[front]/=ax[back];ax[front]=cut(ax[front]);}else if (front>4){data[(ax[front]-16384)/2]/=ax[back];data[(ax[front]-16384)/2]=cut(data[(ax[front]-16384)/2]);}}
} void task6_logical_and(int front,int back,int immediate_count,int data[],int ax[])//逻辑与指令
{if(back==0){if(front<=4){int a;if (ax[front]<0)a=ax[front]+65536;elsea=ax[front];if ((a&immediate_count)==0)ax[front]=0;elseax[front]=1;}else if (front>4){int a;if (data[(ax[front]-16384)/2]<0)a=data[(ax[front]-16384)/2]+65536;else a=data[(ax[front]-16384)/2];if((a&immediate_count)==0)data[(ax[front]-16384)/2]=0;elsedata[(ax[front]-16384)/2]=1;}}else if(back<=4){if(front<=4){int a;if (ax[front]<0)a=ax[front]+65536;elsea=ax[front];int b;if (ax[back]<0)b=ax[back]+65536;elseb=ax[back];if((a&b)==0)ax[front]=0;elseax[front]=1;}else if(front>4){int a;if (data[(ax[front]-16384)/2]<0)a=data[(ax[front]-16384)/2]+65536;else a=data[(ax[front]-16384)/2];int b;if (ax[back]<0)b=ax[back]+65536;elseb=ax[back];if((a&b)==0)data[(ax[front]-16384)/2]=0;else data[(ax[front]-16384)/2]=1;}}else if(back>4){if(front<5){int a;if (ax[front]<0)a=ax[front]+65536;elsea=ax[front];int b;if (data[(ax[back]-16384)/2]<0)b=data[(ax[back]-16384)/2]+65536;else b=data[(ax[back]-16384)/2];if((a&b)==0)ax[front]=0;elseax[front]=1;}else if (front>4){int a;if (data[(ax[front]-16384)/2]<0)a=data[(ax[front]-16384)/2]+65536;else a=data[(ax[front]-16384)/2];int b;if (data[(ax[back]-16384)/2]<0)b=data[(ax[back]-16384)/2]+65536;else b=data[(ax[back]-16384)/2];if((a&b)==0)data[(ax[front]-16384)/2]=0;elsedata[(ax[front]-16384)/2]=1;}}
}void task7_logical_or(int front,int back,int immediate_count,int data[],int ax[])//逻辑或指令
{if(back==0){if(front<=4){int a;if (ax[front]<0)a=ax[front]+65536;elsea=ax[front];if ((a|immediate_count)==0)ax[front]=0;elseax[front]=1;}else if (front>4){int a;if (data[(ax[front]-16384)/2]<0)a=data[(ax[front]-16384)/2]+65536;else a=data[(ax[front]-16384)/2];if((a|immediate_count)==0)data[(ax[front]-16384)/2]=0;elsedata[(ax[front]-16384)/2]=1;}}else if(back<=4){if(front<=4){int a;if (ax[front]<0)a=ax[front]+65536;elsea=ax[front];int b;if (ax[back]<0)b=ax[back]+65536;elseb=ax[back];if((a|b)==0)ax[front]=0;elseax[front]=1;}else if(front>4){int a;if (data[(ax[front]-16384)/2]<0)a=data[(ax[front]-16384)/2]+65536;else a=data[(ax[front]-16384)/2];int b;if (ax[back]<0)b=ax[back]+65536;elseb=ax[back];if((a|b)==0)data[(ax[front]-16384)/2]=0;else data[(ax[front]-16384)/2]=1;}}else if(back>4){if(front<5){int a;if (ax[front]<0)a=ax[front]+65536;elsea=ax[front];int b;if (data[(ax[back]-16384)/2]<0)b=data[(ax[back]-16384)/2]+65536;else b=data[(ax[back]-16384)/2];if((a|b)==0)ax[front]=0;elseax[front]=1;}else if (front>4){int a;if (data[(ax[front]-16384)/2]<0)a=data[(ax[front]-16384)/2]+65536;else a=data[(ax[front]-16384)/2];int b;if (data[(ax[back]-16384)/2]<0)b=data[(ax[back]-16384)/2]+65536;else b=data[(ax[back]-16384)/2];if((a|b)==0)data[(ax[front]-16384)/2]=0;elsedata[(ax[front]-16384)/2]=1;}}
}void task8_logical_non(int front,int back,int immediate_count,int data[],int ax[])//逻辑非指令
{if(front==0){if(back>4){if((!data[(ax[back]-16384)/2])==0)data[(ax[back]-16384)/2]=0;elsedata[(ax[back]-16384)/2]=1;}else if (back<=4){if(!ax[back]==0)ax[back]=0;elseax[back]=1;}}else if(back==0){if(front<=4){if((!ax[front])==0)ax[front]=0;elseax[front]=1;}else if(front>4){if((!data[(ax[front]-16384)/2])==0)data[(ax[front]-16384)/2]=0;elsedata[(ax[front]-16384)/2]=1;}}
}void task9_compare(int front,int back,int immediate_count,int data[],int ax[],int *flag)//比较指令
{if(back==0){if(front<=4){if(ax[front]>immediate_count)*flag=1;if(ax[front]==immediate_count)*flag=0;if(ax[front]<immediate_count)*flag=-1;}else if (front>4){if(data[(ax[front]-16384)/2]>immediate_count)*flag=1;if(data[(ax[front]-16384)/2]==immediate_count)*flag=0;if(data[(ax[front]-16384)/2]<immediate_count)*flag=-1;}}else if(back<=4){if (front<=4){if(ax[front]>ax[back])*flag=1;if(ax[front]==ax[back])*flag=0;if(ax[front]<ax[back])*flag=-1;}else if(front>4){if(data[(ax[front]-16384)/2]>ax[back])*flag=1;if(data[(ax[front]-16384)/2]==ax[back])*flag=0;if(data[(ax[front]-16384)/2]<ax[back])*flag=-1;}}else if(back>4){if (front<=4){if(ax[front]>data[(ax[back]-16384)/2])*flag=1;if(ax[front]==data[(ax[back]-16384)/2])*flag=0;if(ax[front]<data[(ax[back]-16384)/2])*flag=-1;}else if(front>4){if(data[(ax[front]-16384)/2]>data[(ax[back]-16384)/2])*flag=1;if(data[(ax[front]-16384)/2]==data[(ax[back]-16384)/2])*flag=0;if(data[(ax[front]-16384)/2]<data[(ax[back]-16384)/2])*flag=-1;}}
}void task10_jump(int front,int back,int immediate_count,int *ip,int *flag)//跳转指令
{if(back==0){*ip=*ip+immediate_count-4;}if(back==1){if(*flag==0)*ip=*ip+immediate_count-4;}if(back==2){if(*flag==1)*ip=*ip+immediate_count-4;}if(back==3){if(*flag==-1)*ip=*ip+immediate_count-4;}
}void task11_input(int front,int ax[],int data[])//输入指令
{printf("in:\n");if(front<=4)scanf("%d",&ax[front]);else scanf("%d",&data[(ax[front]-16384)/2]);
}void task12_output(int front,int ax[],int data[])//输出指令
{printf("out: ");if(front<=4)printf("%d\n",ax[front]);elseprintf("%d\n",data[(ax[front]-16384)/2]);
} 

该代码通过北邮oj 4个测试。

实用工具:
北邮19级大作业CPU模拟器指令生成及执行工具.

jray的测试用例

文本对比网站

bupt 大作业C语言 ——冯诺依曼式CPU模拟器相关推荐

  1. 编译原理大作业-PL0语言编译器

    编译原理大作业-PL0语言编译器 一.实验目的 二.源码说明 1.头文件pl0.h (1 词法分析主要数据结构(通过enum symbol类实现) 1.保留字(13+4个): 2.运算符及界符(16+ ...

  2. HTML5期末大作业:网站——响应式网络游戏官网HTML+CSS+JavaScript ~ 学生HTML个人网页作业作品下载 ~ web课程设计网页规划与设计 ~大学生个人网站作业模板 ~简单个人网页

    HTML5期末大作业:网站--响应式网络游戏官网HTML+CSS+JavaScript ~ 学生HTML个人网页作业作品下载 ~ web课程设计网页规划与设计 ~大学生个人网站作业模板 ~简单个人网页 ...

  3. python2048小游戏程序设计大作业_C语言大作业报告——2048小游戏程序

    大作业题目 类型 游戏 班 号 学 号 所在院系 学 期 2020 年春季学期 任课教师 实验类型 综合设计型 实验目的:  掌握程序设计的基本算法和简单数据结构基础,能够综合运用基本控制语句.算法 ...

  4. c语言程序设计创新大作业,C语言程序设计大作业报告.pdf

    C语言程序设计大作业报告 课程设计(大作业)报告 课程名称: C 语言程序设计 设计题目: 实验设备管理系统 院 系: 信息技术学院 班 级: 2015级物联网工程 1班 设 计 者: 何盛 高陶 王 ...

  5. 合肥学院C语言大作业,C语言实践课程综合大作业..doc

    C语言实践课程综合大作业. 昆明理工大学 <程序设计基础>课程 综合设计实践教学课题报告 课程名称: C语言程序设计综合大作业 课题名称:数学计算工具程序设计 组长:学号 20131040 ...

  6. noj大作业c语言扫雷,noj大作业概要.doc

    noj大作业概要 作业名称:算法演示程序学 院:航海学院班 级:学 号:2013300951姓 名:苏和团队组成: 西北工业大学 2015年11月11日 1.问题与背景(描述程序所要解决的问题或应用背 ...

  7. noj大作业c语言扫雷,noj大作业.doc

    作业名称:算法演示程序学 院:航海学院班 级:学 号:2013300951姓 名:苏和团队组成: 西北工业大学 2015年11月11日 1.问题与背景(描述程序所要解决的问题或应用背景) C语言经过几 ...

  8. noj大作业c语言扫雷,noj大作业简介.doc

    作业名称:算法演示程序学 院:航海学院班 级:学 号:2013300951姓 名:苏和团队组成: 西北工业大学 2015年11月11日 1.问题与背景(描述程序所要解决的问题或应用背景) C语言经过几 ...

  9. C语言涉及数组的大作业,c语言大作业_基于数组的学生信息管理系统.doc

    . . word完美格式 <C语言程序设计实训1>报告 设 计 题 目: 基于数组的学生信息管理系统 学 院 名 称: 科学技术学院 专 业: 软件工程 班 级: 108班 姓 名: 大神 ...

最新文章

  1. C语言打印字符串的所有排列组合(附完整源码)
  2. mysql explain中的type列含义和extra列的含义
  3. true,false组合问题
  4. CSS3实现烟花特效 --web前端
  5. 星梦缘陈彦妃_浙江舟山80后女演员,2003年出演偶像剧《星梦缘》,还是专业模特...
  6. 字符三角形(信息学奥赛一本通-T1004)
  7. java程序实验总结_Java实验报告一及作业总结二
  8. Linux如何自定义屏幕分辨率,Linux手动设置屏幕分辨率的办法
  9. 天下极品女人-----海上闻人
  10. 5分钟,教你创建在线聊天营销机器人
  11. 兴华永恒公司CSO仙果:Flash之殇—漏洞之王Flash Player的末路
  12. FCPX插件:15种棱镜折射图文展示介绍动画效果 Prism Slideshow
  13. RGB和YUV视频存储格式
  14. 二、浙江专升本高等数学考点-极限
  15. 计算机网络:网间互联协议
  16. JAR包与JAD反编译
  17. numpy(逻辑函数与数学函数)
  18. 智课雅思词汇---四、clos和cap和ced是什么意思
  19. 分枝限界法求解流水线作业调度问题
  20. Microsoft Office Visio 2007打开总是显示Windows正在配置...请稍后解决办法

热门文章

  1. 勾股定理一日一证连载86
  2. Unity2017使用Google.Protobuf.dll(.NET3.5版本)
  3. 清华NLP机器翻译论文精华汇总
  4. 2021-ICDM-Hyper Meta-Path Contrastive Learning for Multi-Behavior Recommendation | 精读
  5. java拖拽式开发,最全指南
  6. 【vue2】使用vue常见的业务流程与实现思路
  7. 关于Git本地的使用
  8. 弱监督目标检测相关论文阅读笔记
  9. H5导航栏被IOS系统状态栏覆盖问题解决
  10. php countif函数,countif是什么函数