📄 translater.cpp
字号:
if (Address >= 0 && Address <= 15)
{
SrcReg_P[i-1][7]=Address%2;
SrcReg_P[i-1][6]=(int)(Address/2.0)%2;
SrcReg_P[i-1][5]=(int)(Address/4.0)%2;
SrcReg_P[i-1][4]=(int)(Address/8.0)%2;
SrcReg_P[i-1][3]=(int)(Address/16.0)%2;
SrcReg_P[i-1][2]=(int)(Address/32.0)%2;
SrcReg_P[i-1][1]=(int)(Address/64.0)%2;
SrcReg_P[i-1][0]=(int)(Address/128.0)%2;
}
else
return true;
SRC_ERRO_FLAG = SwzSrc(SwzSrc_P[i-1],Comma,Dot,Input,i);
if(SRC_ERRO_FLAG)
return true;
SrcBank_P[i-1][2]=0;
SrcBank_P[i-1][1]=0;
SrcBank_P[i-1][0]=0;
break;
case 'R':
if(Dot[i]!=0)
{
int length = Dot[i]-Pos-1; //[]内数字位数/////
if (length == 0 || length > 2)/////
return true;
else
{
if(length == 1)
Address=Input[Dot[i]-1]-48;
else
Address=(Input[Dot[i]-1]-48)+(Input[Dot[i]-2]-48)*10;
}
}
else
{
int length = Comma[i+1]-Pos-1; //[]内数字位数//////
if (length == 0 || length > 2)/////
return true;
else
{
if(length == 1)
Address=Input[Comma[i+1]-1]-48;
else
Address=(Input[Comma[i+1]-1]-48)+(Input[Comma[i+1]-2]-48)*10;
}
}
if (Address >= 0 && Address <= 11)
{
SrcReg_P[i-1][7]=Address%2;
SrcReg_P[i-1][6]=(int)(Address/2.0)%2;
SrcReg_P[i-1][5]=(int)(Address/4.0)%2;
SrcReg_P[i-1][4]=(int)(Address/8.0)%2;
SrcReg_P[i-1][3]=(int)(Address/16.0)%2;
SrcReg_P[i-1][2]=(int)(Address/32.0)%2;
SrcReg_P[i-1][1]=(int)(Address/64.0)%2;
SrcReg_P[i-1][0]=(int)(Address/128.0)%2;
}
else
return true;
SRC_ERRO_FLAG = SwzSrc(SwzSrc_P[i-1],Comma,Dot,Input,i);
if(SRC_ERRO_FLAG)
return true;
SrcBank_P[i-1][2]=1;
SrcBank_P[i-1][1]=1;
SrcBank_P[i-1][0]=0;
break;
case 'C':
if(CV_EXIST[0]==0)
CV_EXIST[0]=1;
else
return true;
if (Input[Pos+2]!='A')
{
SrcBank_P[i-1][2]=0;
SrcBank_P[i-1][1]=1;
SrcBank_P[i-1][0]=0;
if(Dot[i]!=0)
{
int length = Dot[i]-Pos-3; //[]内数字位数
if (Input[Pos+1]!='[' || Input[Dot[i]-1]!=']' || length == 0 || length > 2)
return true;
else
{
if(length == 1)
Address=Input[Dot[i]-2]-48;
else
Address=(Input[Dot[i]-2]-48)+(Input[Dot[i]-3]-48)*10;
}
}
else
{
int length = Comma[i+1]-Pos-3; //[]内数字位数
if (Input[Pos+1]!='[' || Input[Comma[i+1]-1]!=']')
return true;
else
{
if(length == 1)
Address=Input[Comma[i+1]-2]-48;
else
Address=(Input[Comma[i+1]-2]-48)+(Input[Comma[i+1]-3]-48)*10;
}
}
if (Address >= 0 && Address <= 95)
{
SrcReg_P[i-1][7]=Address%2;
SrcReg_P[i-1][6]=(int)(Address/2.0)%2;
SrcReg_P[i-1][5]=(int)(Address/4.0)%2;
SrcReg_P[i-1][4]=(int)(Address/8.0)%2;
SrcReg_P[i-1][3]=(int)(Address/16.0)%2;
SrcReg_P[i-1][2]=(int)(Address/32.0)%2;
SrcReg_P[i-1][1]=(int)(Address/64.0)%2;
SrcReg_P[i-1][0]=(int)(Address/128.0)%2;
}
else
return true;
}
SRC_ERRO_FLAG = SwzSrc(SwzSrc_P[i-1],Comma,Dot,Input,i);
if(SRC_ERRO_FLAG)
return true;
break;
default:
return true;
}
}
return false;
}
//**********************************************
//---------------------编译函数-----------------
void Compile(char *Code,char *Input,int *Comma,int *Dot){
int i;
InitUp();
printf("Code:");
for(i=0;i<3;i++){
printf("%c",Code[i]);
}
printf("\n");
if(charcmp(Code,"NOP ")){
Update();
return;
}
if(charcmp(Code,"ADD ")){
UpOpCode[7]=1;
if(SrcNum == 2)
SRC_ERRO_FLAG = Src(2, Comma, Dot, Input);
else
SRC_ERRO_FLAG = true;
if(SRC_ERRO_FLAG)
{
fprintf(fpw,"ERROR ON SRC!\n");
return;
}
Update();
return;
}
if(charcmp(Code,"ARL ")){
UpOpCode[6]=1;
Update();
return;
}
if(charcmp(Code,"DP3 ")){
UpOpCode[6]=1;
UpOpCode[7]=1;
Update();
return;
}
if(charcmp(Code,"DP4 ")){
UpOpCode[5]=1;
Update();
return;
}
if(charcmp(Code,"DST ")){
UpOpCode[5]=1;
UpOpCode[7]=1;
Update();
return;
}
if(charcmp(Code,"EXP ")){
UpOpCode[5]=1;
UpOpCode[6]=1;
Update();
return;
}
if(charcmp(Code,"LIT ")){
UpOpCode[5]=1;
UpOpCode[6]=1;
UpOpCode[7]=1;
Update();
return;
}
if(charcmp(Code,"LOG ")){
UpOpCode[4]=1;
Update();
return;
}
if(charcmp(Code,"MAD ")){
UpOpCode[4]=1;
UpOpCode[7]=1;
Update();
return;
}
if(charcmp(Code,"MAX ")){
UpOpCode[4]=1;
UpOpCode[6]=1;
Update();
return;
}
if(charcmp(Code,"MIN ")){
UpOpCode[4]=1;
UpOpCode[6]=1;
UpOpCode[7]=1;
Update();
return;
}
if(charcmp(Code,"MOV ")){
UpOpCode[4]=1;
UpOpCode[5]=1;
Update();
return;
}
if(charcmp(Code,"MUL ")){
UpOpCode[4]=1;
UpOpCode[5]=1;
UpOpCode[7]=1;
Update();
return;
}
if(charcmp(Code,"RCP ")){
UpOpCode[4]=1;
UpOpCode[5]=1;
UpOpCode[6]=1;
Update();
return;
}
if(charcmp(Code,"RSQ ")){
UpOpCode[4]=1;
UpOpCode[5]=1;
UpOpCode[6]=1;
UpOpCode[7]=1;
Update();
return;
}
if(charcmp(Code,"SEG ")){
UpOpCode[3]=1;
Update();
return;
}
if(charcmp(Code,"SLT ")){
UpOpCode[3]=1;
UpOpCode[7]=1;
Update();
return;
}
if(charcmp(Code,"END ")){
UpOpCode[7]=1;
UpOpCode[6]=1;
UpOpCode[5]=1;
UpOpCode[4]=1;
UpOpCode[3]=1;
UpOpCode[2]=1;
UpOpCode[1]=1;
UpOpCode[0]=1;
Update();
return;
}
fprintf(fpw,"操作码错误!");
CODE_ERRO_FLAG=true;
return;
}
void main(){
int i;
char Input[50];
char Code[5];
int Comma[5]; //Comma[0]为comma总数(含最终的回车),之后为相应的相对位置
int Dot[4]; //每个操作数中dot的相对位置,无显示为0
if(!(fpw=fopen("MCode.txt","w+"))){
printf("Can't Open MCode.txt!\n");
}
if(!(fpr=fopen("ASM.txt","r+"))){
fprintf(fpw,"Can't Open ASM.txt!\n");
}
while(!EXIT_FLAG){
//------------初始化-----------
for(i=0;i<MCodeLength;i++){
Output[i]=0;
}
for(i=0;i<50;i++){
Input[i]='\0';
}
for(i=0;i<5;i++){
Code[i]='\0';
}
for (i=0;i<5;i++)
{
Comma[i] = 0;
}
for (i=0;i<4;i++)
{
Dot[i] = 0;
}
//-------------获得指令--------
AsmLength=0;
while(1){
if(fscanf(fpr,"%c",&Input[++AsmLength-1])==-1){//文件结束
EXIT_FLAG=true;
break;
}
if(Input[AsmLength-1]==' '&&AsmLength>5){ //删除无用的空格
AsmLength--;
}
if(Input[AsmLength-1]==';'||Input[AsmLength-1]=='\n')
{
NOTE_FLAG=true;
}
if (NOTE_FLAG)
{
if (Input[AsmLength-1]=='\n')
{
Comma[0]++;
Comma[Comma[0]]=AsmLength-1;
NOTE_FLAG=false;
break;
}
AsmLength--;
continue;
}
if (Input[AsmLength-1]==',')
{
Comma[0]++;
Comma[Comma[0]]=AsmLength-1;
}
SrcNum = Comma[0];
if (Input[AsmLength-1]=='.')
{
if(Dot[Comma[0]]==0)
Dot[Comma[0]]=AsmLength-1;
else
{
CODE_ERRO_FLAG=true;
EXIT_FLAG=true;
break;
}
}
if(Input[AsmLength-1]<='z'&&Input[AsmLength-1]>='a')
Input[AsmLength-1]-=32; //统一为大写
}
//------------编译-------------
for(i=0;i<4;i++){
Code[i]=Input[i];
}
Compile(Code,Input,Comma,Dot);
//------------输出-------------
if(!CODE_ERRO_FLAG && !SRC_ERRO_FLAG){
for(i=0;i<MCodeLength;i++){
printf("%d",Output[i]);
fprintf(fpw,"%d",Output[i]);
if((i+1)%32==0){
printf("\n");
fprintf(fpw,"\n");
}
}
}
printf("\n");
}
fclose(fpw);
fclose(fpr);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -