转化v8cpu代码
本代码旨在转化为一种 v 8 c p u v8cpu v8cpu的代码。这种v8cpu的运行规则在http://v8cpu.qinyue.world/instruction-set.html上可以见到。
描述:输入指令的截止地址和指令代码,输出每一个指令对应的代码。
输入:
第一行:两个一位十六进制整数
X
,
Y
X,Y
X,Y,表示输入指令的截止地址为0xXY。
接下来输入
(
X
−
1
)
∗
16
+
Y
+
1
(X-1)*16+Y+1
(X−1)∗16+Y+1组二位十六进制整数ST,表示每个地址的存储数值。
输出:
对每一个四位指令,输出一行该指令对应的代码。
下面是代码。
#include<bits/stdc++.h>
using namespace std;
#define MAXN 20
#define re register int
char c[MAXN][MAXN][3];//Memory 0xXY
const int n=16;
int x,y;
void init(){for(re i=0;i<n;i++)for(re j=0;j<n;j++)c[i][j][0]=c[i][j][1]='0';}
int zh(char x){return x<='9'&&x>='0'?int(x-'0'):int(x-'A'+10);}
char fz(int x){return x<=9&&x>=0?x+'0':x-10+'A';}
char read(){char x=getchar();return (x=='\n'||x==' ')?read():x;}
void work(char a1,char a2,char a3,char a4){
int u=zh(a1),v=zh(a2),s=zh(a3),t=zh(a4);
switch(u){
case 1:printf("LOADM R%c,0x%c%c\n",a2,a3,a4);break;
case 2:printf("LOADB R%c,%d\n",a2,s*16+t);break;
case 3:printf("STOREM R%c,0x%c%c\n",a2,a3,a4);break;
case 4:printf("MOVE R%c,R%c\n",a4,a3);break;
case 5:printf("ADDI R%c,R%c,R%c\n",a2,a3,a4);break;
case 6:printf("ADDF R%c,R%c,R%c\n",a2,a3,a4);break;
case 7:printf("OR R%c,R%c,R%c\n",a2,a3,a4);break;
case 8:printf("AND R%c,R%c,R%c\n",a2,a3,a4);break;
case 9:printf("XOR R%c,R%c,R%c\n",a2,a3,a4);break;
case 10:printf("ROT R%c,%d\n",a2,zh(a4));break;
case 11:printf("JUMP R%c,0x%c%c\n",a2,a3,a4);break;
case 12:printf("HALT\n");break;
}
}
void in(int u,int v){
for(re i=0;i<u;i++)for(re j=0;j<n;j++)c[i][j][0]=read(),c[i][j][1]=read();
for(re i=0;i<=v;i++)c[u][i][0]=read(),c[u][i][1]=read();
}
int main(){
init();
scanf("%d%d",&x,&y);
in(x,y);
for(re i=0;i<x;i++)for(re j=0;j<n;j+=2)work(c[i][j][0],c[i][j][1],c[i][j+1][0],c[i][j+1][1]);
for(re j=0;j<=y;j+=2)work(c[u][j][0],c[u][j][1],c[u][j+1][0],c[u][j+1][1]);
}