天恩小朋友 2021-05-18 20:26 采纳率: 50%
浏览 319
已结题

求冯诺依曼式CPU模拟器!!!

计导大作业:冯诺依曼式CPU模拟器

A:概要设计书

B:单核版

C:双核版

如果有这个资源的大大,请速度留言我!!!秒确认

  • 写回答

6条回答 默认 最新

  • 流某人 2021-05-18 22:35
    关注

    /*主函数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] );
        } 
    }

    评论

报告相同问题?

悬赏问题

  • ¥15 彩灯控制电路,会的加我QQ1482956179
  • ¥200 相机拍直接转存到电脑上 立拍立穿无线局域网传
  • ¥15 (关键词-电路设计)
  • ¥15 如何解决MIPS计算是否溢出
  • ¥15 vue中我代理了iframe,iframe却走的是路由,没有显示该显示的网站,这个该如何处理
  • ¥15 操作系统相关算法中while();的含义
  • ¥15 CNVcaller安装后无法找到文件
  • ¥15 visual studio2022中文乱码无法解决
  • ¥15 关于华为5g模块mh5000-31接线问题
  • ¥15 keil L6007U报错