bupt 大作业C语言 ——冯诺依曼式CPU模拟器
/*
作者:bupt
时间:2021.7.10
主函数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_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;
else
a=ax[front];
if ((a&immediate_count)==0)
ax[front]=0;
else
ax[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;
else
data[(ax[front]-16384)/2]=1;
}
}
else if(back<=4)
{
if(front<=4)
{
int a;
if (ax[front]<0)
a=ax[front]+65536;
else
a=ax[front];
int b;
if (ax[back]<0)
b=ax[back]+65536;
else
b=ax[back];
if((a&b)==0)
ax[front]=0;
else
ax[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;
else
b=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;
else
a=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;
else
ax[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;
else
data[(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;
else
a=ax[front];
if ((a|immediate_count)==0)
ax[front]=0;
else
ax[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;
else
data[(ax[front]-16384)/2]=1;
}
}
else if(back<=4)
{
if(front<=4)
{
int a;
if (ax[front]<0)
a=ax[front]+65536;
else
a=ax[front];
int b;
if (ax[back]<0)
b=ax[back]+65536;
else
b=ax[back];
if((a|b)==0)
ax[front]=0;
else
ax[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;
else
b=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;
else
a=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;
else
ax[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;
else
data[(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;
else
data[(ax[back]-16384)/2]=1;
}
else if (back<=4)
{
if(!ax[back]==0)
ax[back]=0;
else
ax[back]=1;
}
}
else if(back==0)
{
if(front<=4)
{
if((!ax[front])==0)
ax[front]=0;
else
ax[front]=1;
}
else if(front>4)
{
if((!data[(ax[front]-16384)/2])==0)
data[(ax[front]-16384)/2]=0;
else
data[(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]);
else
printf("%d\n",data[(ax[front]-16384)/2]);
}
该代码通过北邮oj 4个测试。
实用工具:
北邮19级大作业CPU模拟器指令生成及执行工具.