扩展操作码的编程实现

#include <stdio.h>
#include <iostream>
#include<cmath>

void process(int n)
{   
    int tem[4]={0,0,0,0};
    int j=0;
    while (n>=1)
     {
         tem[j]=n%2;
         j=j+1;
         n=n/2;
     }
     for (int m=3;m>=0;m--)
     printf("%d",tem[m]);
     printf(" ");
}

void main()
{
    int a,b,c,d,t1,t2,t3,l31,l32,l33,l41,l42,l43,l44;
    printf("**************************/n");
    printf("    扩展操作码设计方案    /n");
    printf("    作者:       余建安    /n");
    printf("    开源有益  学海无涯   /n");
    printf("**************************/n/n");
    printf("你所需的三地址指令数为多少?/n");
    scanf("%d",&a);
    printf("你所需的双地址指令数为多少?/n");
    scanf("%d",&b);
    printf("你所需的单地址指令数为多少?/n");
    scanf("%d",&c);
    printf("你所需的零地址指令数为多少?/n");
    scanf("%d",&d);
    if (a>16) printf("/n错误:/n三地址指令数超出最大容量,请减少三地址指令数/n");
    else if (a>=0 && a<=16)
    {
        t1=(16-a)*pow(2,4);
        if (t1<b) printf("/n错误:/n双地址指令数超出最大容量,请减少双地址指令数/n");
        else if (b>=0 && b<=t1)
        {
            t2=(t1-b)*pow(2,4);
            if (t2<c) printf("/n错误:/n单地址指令数超出最大容量,请减少单地址指令数/n");
            else if (c<=t2 && c>=0)
            {
                if (d>(t2-c)*pow(2,4)) printf("/n错误:/n零地址指令数超出最大容量,请减少零地址指令数/n");
                else if (d>=0)
                {
                    t3=(t2-c)*pow(2,4)-d; //剩余的指令空间
                   
                    printf("三地址指令的空间如下图/n");//三地址指令的相关操作
                    printf("0000 xxxx xxxx xxxx/n");
                    for (int i=0;i<=2;i++)
                    {
                        printf(":                 :/n");
                    }
                    process(a-1);
                    printf("xxxx xxxx xxxx/n");
                   
                    printf("双地址指令的空间如下图/n");//双地址指令的相关操作
                    process(a);
                    printf("0000 xxxx xxxx/n");
                    for (i=0;i<=2;i++)
                    {
                        printf(":                 :/n");
                    }
                    int beishu1=(b-1)/16;
                    int yushu1=(b-1)%16;
                    process(a+beishu1);
                    process(yushu1);
                    printf("xxxx xxxx/n");
                   
                    printf("单地址指令的空间如下图/n");//单地址指令的相关操作
                    int beishu2=(c-1)/16;
                    int yushu2=(c-1)%16;
                    process(a+beishu1);
                    process(yushu1+1);
                    printf("0000 xxxx/n");
                    for (i=0;i<=2;i++)
                    {
                        printf(":                 :/n");
                    }
                    if (beishu2<=15-yushu1-1)
                    {
                        l31=a+beishu1;
                        l32=yushu1+1+beishu2;
                        l33=yushu2;
                        process(l31);
                        process(l32);
                        process(l33);
                        printf("xxxx/n");
                    }
                    else if (beishu2>15-yushu1-1)
                    {
                        int bugou1=beishu2-(15-yushu1-1);//进到第一列寻求帮助的增量
                        int yushu3=(bugou1-1)%16;//第二列上当前的循环量
                        int beishu3=(bugou1-1)/16+1;
                        l31=a+beishu1+beishu3;
                        l32=yushu3;
                        l33=yushu2;
                        process(l31);
                        process(l32);
                        process(l33);
                        printf("xxxx/n");
                    }
                   
                    printf("零地址指令的空间如下图/n");//零地址指令的相关操作
                    process(l31);
                    process(l32);
                    process(l33+1);
                    printf("0000/n");
                    l41=l31;
                    l42=l32;
                    l43=l33+1;
                    l44=d-1;
                    if (d>16)
                    {
                        l44=(d-1)%16;
                        int add43=(d-1)/16; //从第四位到第三位的进位增量
                        if (add43<=15-l33-1)
                        {
                            l43=l33+add43+1;
                        }
                        else if (add43>15-l33-1)
                        {
                            int yushu4=(add43-(15-l33-1)-1)%16;
                            int beishu4=((add43-(15-l33-1))-1)/16+1;
                            l43=yushu4;
                            if (beishu4<=15-l32-1)
                            {
                                l42=l32+beishu4;
                            }
                            else if (beishu4>15-l32-1)
                            {  
                                int yushu5=(beishu4-(15-l32-1)-1)%16;
                                l42=yushu5;
                                l41=l31+(beishu4-(15-l32-1)-1)/16+1;
                            }
                        }
                                           
                    }
                    for (i=0;i<=2;i++)
                    {
                            printf(":                 :/n");
                    }
                    process(l41);
                    process(l42);
                    process(l43);
                    process(l44);
                    printf ("/n");
                }
                else printf("零地址指令数不合法,请重新输入!!!");
            }
            else printf("单地址指令数不合法,请重新输入!!!");
        }
        else printf("双地址指令数不合法,请重新输入!!!");
    }
    else printf("三地址指令数不合法,请重新输入!!!");
}






  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值