BUPT大作业C语言——冯诺依曼式CPU模拟器
代码
#include
#include
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);
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);
}
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);
}
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;
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 ;
division(task,objfront,objback,value,code,data,ax,ip,ir,flag);
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");
}
}
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");
}
}
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');
}
if(n==16){
if(sum<=32767)
return sum;
else
return sum-65536;
}
else
return sum;
}
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;
}
}
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
data[ ax[objfront]- 16384 ] = ax[objback] ;
}
}
void task2(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 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;
}
}
}
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;
}
}
}
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;
}
}
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;
}
}
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] );
}
}