⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 translater.cpp

📁 汇编语言的解释器
💻 CPP
📖 第 1 页 / 共 2 页
字号:
				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 + -