#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("三地址指令数不合法,请重新输入!!!");
}
#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("三地址指令数不合法,请重新输入!!!");
}