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

📄 assembler.cpp

📁 MIPS32指令系统的汇编器。 在QUARTUS仿真环境中
💻 CPP
📖 第 1 页 / 共 5 页
字号:
					case 'b':
					case 'B': if(State==0){State=6;break;}else{State=-1;break;}
					case 'e':
					case 'E': 
						{
							if(State==6){State=7;break;}
							if(State==9){State=10;break;}
							else{State=-1;break;}
						}
					case 'q':
					case 'Q': if(State==7){State=8;break;}else{State=-1;break;}
					case 'n':
					case 'N': 
						{
							if(State==6){State=9;break;}
							if(State==11){State=16;break;}
							else{State=-1;break;}
						}
					case 'a':
					case 'A': if(State==0){State=11;break;}else{State=-1;break;}
					case 'd':
					case 'D': 
						{
							if(State==11){State=12;break;}
							if(State==12){State=13;break;}
							if(State==16){State=17;break;}
							else{State=-1;break;}
						}
					case 'o':
					case 'O': 
						{
							if(State==0){State=19;break;}
							if(State==22){State=23;break;}
							else{State=-1;break;}
						}
					case 'r':
					case 'R': 
						{
							if(State==19){State=20;break;}
							if(State==23){State=24;break;}
							else{State=-1;break;}
						}
					case 'x':
					case 'X': if(State==0){State=22;break;}else{State=-1;break;}
//					case '\n':
					case '\t':
					case ' ': if(State==4||State==5||State==8||State==10||State==14||State==15||State==18||State==21||State==25)
								{ret[--i]='\0';TOKEN.TokenID=9;TOKEN.TokenName=ret;return 0;}
							  else{State=-1;break;} 
					default: {State=-1;break;}
					}
					if ( State == -1 )
						break;
					ch = getc(SourceFileName);
					if ( ch == '\n' )
					{
						No_TxtLine++;
						times++;
					}
					ret[i++] = ch;
				}
				rewind(SourceFileName);
				if ( fseek(SourceFileName, Length, SEEK_CUR) == 1 )
					return -1;
				i = 0;
				ch = ReadOneChar(SourceFileName);
				No_TxtLine -= times;
				times = 0;
				if ( ch == '\n' )
				{
					No_TxtLine++;
					times = 1;
				}
				ret[i++] = ch;
				State = 0;
				/**********************RCOM**************************/
				while ( 1 )
				{
					switch ( ch )
					{
					case 'a':
					case 'A':
						{
							if(State==0){State=1;break;}
							if(State==21){State=22;break;}
							else{State=-1;break;}
						}
					case 'd':
					case 'D':
						{
							if(State==1){State=2;break;}
							if(State==2){State=3;break;}
							if(State==5){State=6;break;}
							else{State=-1;break;}
						}
					case 'u':
					case 'U':
						{
							if(State==3){State=4;break;}
							if(State==17){State=18;break;}
							if(State==15){State=26;break;}
							if(State==27){State=28;break;}
							else{State=-1;break;}
						}
					case 'n':
					case 'N': 
						{
							if(State==0){State=7;break;}
							if(State==1){State=5;break;}
							else{State=-1;break;}
						}
					case 'o':
					case 'O':
						{
							if(State==0){State=10;break;}
							if(State==7){State=8;break;}
							if(State==12){State=13;break;}
							else{State=-1;break;}
						}
					case 'r':
					case 'R':
						{
							if(State==8){State=9;break;}
							if(State==10){State=11;break;}
							if(State==13){State=14;break;}
							if(State==15){State=21;break;}
							else{State=-1;break;}
						}
					case 'x':
					case 'X': if(State==0){State=12;break;}else{State=-1;break;}
					case 's':
					case 'S': if(State==0){State=15;break;}else{State=-1;break;}
					case 'l':
					case 'L':
						{
							if(State==15){State=16;break;}
							if(State==16){State=19;break;}
							if(State==21){State=24;break;}
							else{State=-1;break;}
						}
					case 't':
					case 'T': if(State==16){State=17;break;}else{State=-1;break;}
					case 'v':
					case 'V':
						{
							if(State==19){State=20;break;}
							if(State==22){State=23;break;}
							if(State==24){State=25;break;}
							else{State=-1;break;}
						}
					case 'b':
					case 'B': if(State==26){State=27;break;}else{State=-1;break;}
//					case '\n':
					case '\t':
					case ' ': if(State==3||State==4||State==6||State==9||State==11||State==14||State==17||State==18||State==20||State==23||State==25||State==27||State==28)
								{ret[--i]='\0';TOKEN.TokenID=6;TOKEN.TokenName=ret;return 0;}
							  else{State=-1;break;} 
					default: {State=-1;break;}
					}
					if ( State == -1 )
						break;
					ch = getc(SourceFileName);
					if ( ch == '\n' )
					{
						No_TxtLine++;
						times++;
					}
					ret[i++] = ch;
				}
				rewind(SourceFileName);
				if ( fseek(SourceFileName, Length, SEEK_CUR) == 1 )
					return -1;
				i = 0;
				ch = ReadOneChar(SourceFileName);
				No_TxtLine -= times;
				times = 0;
				if ( ch == '\n' )
				{
					No_TxtLine++;
					times = 1;
				}
				ret[i++] = ch;
				State = 0;
				/**********************SICOM**************************/
				while ( 1 )
				{
					switch ( ch )
					{
					case 'l':
					case 'L': if(State==0){State=1;break;}else{State=-1;break;}
					case 'u':
					case 'U': if(State==1){State=2;break;}else{State=-1;break;}
					case 'i':
					case 'I': if(State==2){State=3;break;}else{State=-1;break;}
//					case '\n':
					case '\t':
					case ' ': if(State==3){ret[--i]='\0';TOKEN.TokenID=10;TOKEN.TokenName=ret;return 0;}else{State=-1;break;}
					default: {State=-1;break;}
					}
					if ( State == -1 )
						break;
					ch = getc(SourceFileName);
					if ( ch == '\n' )
					{
						No_TxtLine++;
						times++;
					}
					ret[i++] = ch;
				}
				rewind(SourceFileName);
				if ( fseek(SourceFileName, Length, SEEK_CUR) == 1 )
					return -1;
				i = 0;
				ch = ReadOneChar(SourceFileName);
				No_TxtLine -= times;
				times = 0;
				if ( ch == '\n' )
				{
					No_TxtLine++;
					times = 1;
				}
				ret[i++] = ch;
				State = 0;
				/**********************LWICOM**************************/
				while ( 1 )
				{
					switch ( ch )
					{
					case 'l':
					case 'L': if(State==0){State=1;break;}else{State=-1;break;}
					case 's':
					case 'S': if(State==0){State=3;break;}else{State=-1;break;}
					case 'w':
					case 'W':
						{
							if(State==1){State=2;break;}
							if(State==3){State=4;break;}
							else{State=-1;break;}
						}
//					case '\n':
					case '\t':
					case ' ': if(State==2||State==4){ret[--i]='\0';TOKEN.TokenID=11;TOKEN.TokenName=ret;return 0;}else{State=-1;break;}
					default: {State=-1;break;}
					}
					if ( State == -1 )
						break;
					ch = getc(SourceFileName);
					if ( ch == '\n' )
					{
						No_TxtLine++;
						times++;
					}
					ret[i++] = ch;
				}
				rewind(SourceFileName);
				if ( fseek(SourceFileName, Length, SEEK_CUR) == 1 )
					return -1;
				i = 0;
				ch = ReadOneChar(SourceFileName);
				No_TxtLine -= times;
				times = 0;
				if ( ch == '\n' )
				{
					No_TxtLine++;
					times = 1;
				}
				ret[i++] = ch;
				State = 0;
				/**********************JCOM**************************/
				while ( 1 )
				{
					switch ( ch )
					{
					case 'j':
					case 'J': if(State==0){State=1;break;}else{State=-1;break;}
					case 'a':
					case 'A': if(State==1){State=2;break;}else{State=-1;break;}
					case 'l':
					case 'L': if(State==2){State=3;break;}else{State=-1;break;}
//					case '\n':
					case '\t':
					case ' ': if(State==1||State==3){ret[--i]='\0';TOKEN.TokenID=12;TOKEN.TokenName=ret;return 0;}else{State=-1;break;}
					default: {State=-1;break;}
					}
					if ( State == -1 )
						break;
					ch = getc(SourceFileName);
					if ( ch == '\n' )
					{
						No_TxtLine++;
						times++;
					}
					ret[i++] = ch;
				}
				rewind(SourceFileName);
				if ( fseek(SourceFileName, Length, SEEK_CUR) == 1 )
					return -1;
				i = 0;
				ch = ReadOneChar(SourceFileName);
				No_TxtLine -= times;
				times = 0;
				if ( ch == '\n' )
				{
					No_TxtLine++;
					times = 1;
				}
				ret[i++] = ch;
				State = 0;
				/**********************IDNAME**************************/
				while ( 1 )
				{
					if ( ((ch>='a'&&ch<='z')||(ch>='A'&&ch<='Z')) && (State==0||State==1) )
					{
						State = 1;
						ch = getc( SourceFileName );
						if ( ch == '\n' )
							No_TxtLine++;
						ret[i++] = ch;
						continue;
					}
					if ( (ch>='0'&&ch<='9') && State == 1 )
					{
						State = 1;
						ch = getc( SourceFileName );
						if ( ch == '\n' )
							No_TxtLine++;
						ret[i++] = ch;
						continue;
					}
					if ( State == 1 )
						if ( ungetc(ch, SourceFileName) )
							{
								if ( ch == '\n' )
									No_TxtLine--;
								ret[--i]='\0';TOKEN.TokenID=3;TOKEN.TokenName=ret;return 0;
							}
						else
							return -1;
					else 
						return -1;
				}
				break;
			}
		case 19:			//当前栈顶为<N_END SEGID>
			{					//应该扫描END单词
				char ch = ReadOneChar(SourceFileName);
				if ( ch == '\n' )
					No_TxtLine++;
				while ( 1 )
				{
					switch ( ch )
					{
					case 'e':
					case 'E': if(State==0){State=1;break;}else{State=-1;break;}
					case 'n':
					case 'N': if(State==1){State=2;break;}else{State=-1;break;}
					case 'd':
					case 'D': if(State==2){State=3;break;}else{State=-1;break;}
//					case '\n':
					case '\t':
					case ' ': if(State==3){TOKEN.TokenID=13;TOKEN.TokenName="END";return 0;}else{State=-1;break;}
					default: {State=-1;break;}
					}
					if ( State == -1 ) return -1;
					ch = getc(SourceFileName);
					if ( ch == '\n' )
						No_TxtLine++;
				}
				break;
			}
		case 21:	//当前栈顶为N_COMQ,需要识别T_ICOM
			{
				i = 0;
				char ch = ReadOneChar(SourceFileName);
				if ( ch == '\n' )
					No_TxtLine++;
				ret[i++] = ch;
				while ( 1 )
				{
					switch ( ch )
					{
					case 's':
					case 'S': if(State==0){State=1;break;} else{State=-1;break;}
					case 'l':
					case 'L': if(State==1){State=2;break;} else{State=-1;break;}
					case 't':
					case 'T': if(State==2){State=3;break;} else{State=-1;break;}
					case 'i':
					case 'I': 
						{
							if(State==3){State=4;break;}
							if(State==13){State=14;break;}
							if(State==17){State=18;break;}
							if(State==20){State=21;break;}
							if(State==24){State=25;break;}
							else{State=-1;break;}
						}
					case 'u':
					case 'U': 
						{
							if(State==4){State=5;break;}
							if(State==14){State=15;break;}
							else{State=-1;break;}
						}
					case 'b':
					case 'B': if(State==0){State=6;break;}else{State=-1;break;}
					case 'e':
					case 'E': 
						{
							if(State==6){State=7;break;}
							if(State==9){State=10;break;}
							else{State=-1;break;}
						}
					case 'q':
					case 'Q': if(State==7){State=8;break;}else{State=-1;break;}
					case 'n':
					case 'N':
						{
							if(State==6){State=9;break;}
							if(State==11){State=16;break;}
							else{State=-1;break;}
						}
					case 'a':
					case 'A': if(State==0){State=11;break;}else{State=-1;break;}
					case 'd':
					case 'D': 
						{
							if(State==11){State=12;break;}
							if(State==12){State=13;break;}
							if(State==16){State=17;break;}
							else{State=-1;break;}
						}
					case 'o':
					case 'O': 
						{
							if(State==0){State=19;break;}
							if(State==22){State=23;break;}
							else{State=-1;break;}
						}
					case 'r':
					case 'R': 
						{
							if(State==19){State=20;break;}
							if(State==23){State=24;break;}
							else{State=-1;break;}
						}
					case 'x':
					case 'X': if(State==0){State=22;break;}else{State=-1;break;}
//					case '\n':
					case '\t':
					case ' ': if(State==4||State==5||State==8||State==10||State==14||State==15||State==18||State==21||State==25)
								{ret[--i]='\0';TOKEN.TokenID=9;TOKEN.TokenName=ret;return 0;}
							  else{State=-1;break;} 
					default: {State=-1;break;}
					}
					ch = getc(SourceFileName);
					if ( ch == '\n' )
						No_TxtLine++;
					ret[i++] = ch;
				}
				break;
			}
		case 22:	//当前栈顶为N_COMQA,需要识别T_IMMEDIATE或者T_IDNAME
			{
				int Length = ftell(SourceFileName);
				char ch = ReadOneChar(SourceFileName);
				char temp[20];
				i = 0;
				bool token = false;
				while ((ch>='a'&&ch<='f')||(ch>='A'&&ch<='F')||(ch>='0'&&ch<='9')||(ch=='o'||ch=='O')||(ch=='h'||ch=='H'))
				{
					temp[i++] = ch;
				//	ret[i++] = ch;
					ch = getc(SourceFileName);
					if ( ch == '\n' )
						No_TxtLine++;
					token = true;
				}

//				if ( ungetc(ch, SourceFileName) == 0 ) return -1; //注意fgets在不超过缓冲区长度的情况下也包含了'\n'和自动添加的'\0'
				if ( token == true )
				{
					i = 0;
					while ( (i<18) && ((temp[i]>='a'&&temp[i]<='f')||(temp[i]>='A'&&temp[i]<='F')||(temp[i]>='0'&&temp[i]<='9')) )
					{
						ret[i] = temp[i];
						i++;
					}
					if (i<18)
					{
	//				if ( ungetc('\n', SourceFileName) == 0 ) return -1;
						int l = 0;
						if (temp[i]=='o'||temp[i]=='O'||temp[i]=='h'||temp[i]=='H') 
						{
							if ( temp[i] == 'h' || temp[i] == 'H' )	//十六进制立即数
							{
								if ( i > 5 )
								{
									break;
								}
								else if ( i == 5 )
								{
									if ( 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -