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

📄 privatefuncs.cpp

📁 MIPS32指令系统的汇编器。 在QUARTUS仿真环境中
💻 CPP
📖 第 1 页 / 共 4 页
字号:
			else if ( TOKEN.TokenName[0] == 'b' || TOKEN.TokenName[0] == 'B' )	//beq,bne
			{
				if ( TOKEN.TokenName[1] == 'e' || TOKEN.TokenName[1] == 'E' ) //beq
					CMD[28] = '1';
				else														  //bne
					CMD[28] = CMD[26] = '1';
			}
			else if ( TOKEN.TokenName[0] == 's' || TOKEN.TokenName[0] == 'S' )	//slti,sltiu
			{
				if ( TOKEN.TokenName[4] == 'u' || TOKEN.TokenName[4] == 'U' ) //sltiu
					CMD[29] = CMD[27] = CMD[26] = '1';
				else														  //slti
					CMD[29] = CMD[27] = '1';
			}
			else																//addi,addiu,andi
			{
				if ( TOKEN.TokenName[1] == 'd' || TOKEN.TokenName[1] == 'D' )	
				{
					if ( TOKEN.TokenName[4] == 'u' || TOKEN.TokenName[4] == 'U' )// addiu
						CMD[29] = CMD[26] = '1';
					else															// addi
						CMD[29] = '1';
				}
				else															// andi
					CMD[29] = CMD[28] = '1';
			}
			return 0;	// 0 表示成功退出
		}
	case T_SICOM:
		{
			CMD[29] = CMD[28] = CMD[27] = CMD[26] = '1';	// lui
			return 0;	// 0 表示成功退出
		}
	case T_LWICOM:
		{
			if ( TOKEN.TokenName[0] == 'l' || TOKEN.TokenName[0] == 'L' )	// lw
				CMD[31] = CMD[27] = CMD[26] = '1';
			else															// sw
				CMD[31] = CMD[29] = CMD[27] = CMD[26] = '1';
			return 0;	// 0 表示成功退出
		}
	case T_JCOM:
		{ 
			if ( TOKEN.TokenName[1] == '\0' )	// j
				CMD[27] = '1';
			else if ( TOKEN.TokenName[1] == 'a' || TOKEN.TokenName[1] == 'A' )															// jal
				CMD[27] = CMD[26] = '1';
			return 0;	// 0 表示成功退出
		}
	case T_RD:
		{
			for ( i = 0; i < 32 && (!StrCmp( TOKEN.TokenName, RegsAlias[i][0] )&&!StrCmp( TOKEN.TokenName, RegsAlias[i][1] )); i++ );
//			cout << "RD: " << i << endl;
			if ( i == 32 )
				return -1;
			else
			{
				char* retv = DecToBin( i );
				for ( i = 0; i < 5; i++ )
					CMD[15-i] = retv[i];
			}
			return 0;	// 0 表示成功退出
		}
	case T_RS:
		{
			for ( i = 0; i < 32 && (!StrCmp( TOKEN.TokenName, RegsAlias[i][0] )&&!StrCmp( TOKEN.TokenName, RegsAlias[i][1] )); i++ );
			if ( i == 32 )
				return -1;
			else
			{
				char* retv = DecToBin( i );
				for ( i = 0; i < 5; i++ )
					CMD[25-i] = retv[i];
			}
			return 0;	// 0 表示成功退出
		}
	case T_RT:
		{
			for ( i = 0; i < 32 && (!StrCmp( TOKEN.TokenName, RegsAlias[i][0] )&&!StrCmp( TOKEN.TokenName, RegsAlias[i][1] )); i++ );
			if ( i == 32 )
				return -1;
			else
			{
				char* retv = DecToBin( i );
				for ( i = 0; i < 5; i++ )
					CMD[20-i] = retv[i];
			}
			return 0;	// 0 表示成功退出
		}
	case T_BRS:
		{	
			char t[6] = {' ',' ',' ',' ','\0'};
			for ( i = 1; TOKEN.TokenName[i] != ')'; i++ )
				t[i-1] = TOKEN.TokenName[i];
			t[i] = '\0';

			for ( i = 0; i < 32 && (!StrCmp( t, RegsAlias[i][0] )!=0&&!StrCmp( t, RegsAlias[i][1] )!=0); i++ )
			{
//				cout << '\t' << t << endl
//					 << RegsAlias[i][0] << '\t' << RegsAlias[i][1] << endl;
			}
//			cout <<  i << endl;
			if ( i == 32 )
				return -1;
			else
			{
				char* retv = DecToBin( i );
				for ( i = 0; i < 5; i++ )
				{
					CMD[25-i] = retv[i];
//					cout << CMD[25-i];
				}
//				cout << endl;
			}
			return 0;	// 0 表示成功退出
		}
	case T_IDNAME:
		{
			int a = VarNameToAddr( TOKEN.TokenName );
			for( i = 0; a != 0 && i < 16; i++ )
			{
				CMD[ i ] = a%2 + 48;//注意char与int的转换
				a = a/2;
			}
			return 0;	// 0 表示成功退出
		}
	case T_PLUS:
		{
			flag = true;
			return 0;
		}
	case T_ADDR:
		{
			char* t;
			for ( i = 0; i < 4; i++ )
			{
				t = HexToBin( TOKEN.TokenName[i] );
				for ( int j = 15-4*i, k = 0; j > 11-4*i && k < 4; k++, j-- )
					CMD[j] = t[k];
			}
			return 0;	// 0 表示成功退出
		}
	case T_IMMEDIATE:
		{	
			//这里需要根据flag来设置立即数,以下的代码需要增加,增加的代码在最前和最后
			char lower16CMD[16];
			int s = 0;
			for ( ; s < 16; s++ )
				lower16CMD[s] = CMD[s];
			//这是先将CMD的低十六位存起来,如果flag为真,则要将其加到新CMD低十六位上面



			int count = 0;
			char a[20];
			int end;
			int num = 0;
//			char * b = ""; //只有在BEQ,BNE中用到,所以在下面用到的时候再声明

			for ( int i = 0; TOKEN.TokenName[i] != '\0'; i++ )
				a[ i ] = TOKEN.TokenName[i];
			
			end = i - 1;
			if( a[ end ] == 'B' || a[ end ] == 'b' )//二进制数
			{
				for( i = end; i >= 0; i-- )
					CMD[ end - i ] = a[ i ];
			}
			else if( a[ end ] == 'O' || a[ end ] == 'o' )//八进制数
			{
				if( end == 6 )
				{
					CMD[15] = a[0];
					for( i = end-1; i > 0; i-- )
					{
						switch( a[i] )
						{
						case '0':{ CMD[ 3*( end - i ) - 1 ] = '0'; CMD[ 3*( end - i ) - 2 ] = '0'; CMD[ 3*( end - i ) - 3 ] = '0'; break;}
						case '1':{ CMD[ 3*( end - i ) - 1 ] = '0'; CMD[ 3*( end - i ) - 2 ] = '0'; CMD[ 3*( end - i ) - 3 ] = '1'; break;}
						case '2':{ CMD[ 3*( end - i ) - 1 ] = '0'; CMD[ 3*( end - i ) - 2 ] = '1'; CMD[ 3*( end - i ) - 3 ] = '0'; break;}
						case '3':{ CMD[ 3*( end - i ) - 1 ] = '0'; CMD[ 3*( end - i ) - 2 ] = '1'; CMD[ 3*( end - i ) - 3 ] = '1'; break;}
						case '4':{ CMD[ 3*( end - i ) - 1 ] = '1'; CMD[ 3*( end - i ) - 2 ] = '0'; CMD[ 3*( end - i ) - 3 ] = '0'; break;}
						case '5':{ CMD[ 3*( end - i ) - 1 ] = '1'; CMD[ 3*( end - i ) - 2 ] = '0'; CMD[ 3*( end - i ) - 3 ] = '1'; break;}
						case '6':{ CMD[ 3*( end - i ) - 1 ] = '1'; CMD[ 3*( end - i ) - 2 ] = '1'; CMD[ 3*( end - i ) - 3 ] = '0'; break;}
						case '7':{ CMD[ 3*( end - i ) - 1 ] = '1'; CMD[ 3*( end - i ) - 2 ] = '1'; CMD[ 3*( end - i ) - 3 ] = '1'; break;}
						}
					}
				}
				else
				{
					for( i = end-1; i >= 0; i-- )
					{
						switch( a[i] )
						{
						case '0':{ CMD[ 3*( end - i ) - 1 ] = '0'; CMD[ 3*( end - i ) - 2 ] = '0'; CMD[ 3*( end - i ) - 3 ] = '0'; break;}
						case '1':{ CMD[ 3*( end - i ) - 1 ] = '0'; CMD[ 3*( end - i ) - 2 ] = '0'; CMD[ 3*( end - i ) - 3 ] = '1'; break;}
						case '2':{ CMD[ 3*( end - i ) - 1 ] = '0'; CMD[ 3*( end - i ) - 2 ] = '1'; CMD[ 3*( end - i ) - 3 ] = '0'; break;}
						case '3':{ CMD[ 3*( end - i ) - 1 ] = '0'; CMD[ 3*( end - i ) - 2 ] = '1'; CMD[ 3*( end - i ) - 3 ] = '1'; break;}
						case '4':{ CMD[ 3*( end - i ) - 1 ] = '1'; CMD[ 3*( end - i ) - 2 ] = '0'; CMD[ 3*( end - i ) - 3 ] = '0'; break;}
						case '5':{ CMD[ 3*( end - i ) - 1 ] = '1'; CMD[ 3*( end - i ) - 2 ] = '0'; CMD[ 3*( end - i ) - 3 ] = '1'; break;}
						case '6':{ CMD[ 3*( end - i ) - 1 ] = '1'; CMD[ 3*( end - i ) - 2 ] = '1'; CMD[ 3*( end - i ) - 3 ] = '0'; break;}
						case '7':{ CMD[ 3*( end - i ) - 1 ] = '1'; CMD[ 3*( end - i ) - 2 ] = '1'; CMD[ 3*( end - i ) - 3 ] = '1'; break;}
						}
					}
				}
			}
			else if( a[ end ] == 'H' || a[ end ] == 'h' )//十六进制 ,考虑0FFFFH
			{
				for( i = end-1; i >= 0 && count <= 3; i-- )
				{
					count++;
					switch( a[i] )
					{
					case '0':{ CMD[ 4*( end - i ) - 1 ] = '0'; CMD[ 4*( end - i ) - 2 ] = '0'; CMD[ 4*( end - i ) - 3 ] = '0'; CMD[ 4*( end - i ) - 4 ] = '0'; break;}
					case '1':{ CMD[ 4*( end - i ) - 1 ] = '0'; CMD[ 4*( end - i ) - 2 ] = '0'; CMD[ 4*( end - i ) - 3 ] = '0'; CMD[ 4*( end - i ) - 4 ] = '1'; break;}
					case '2':{ CMD[ 4*( end - i ) - 1 ] = '0'; CMD[ 4*( end - i ) - 2 ] = '0'; CMD[ 4*( end - i ) - 3 ] = '1'; CMD[ 4*( end - i ) - 4 ] = '0'; break;}
					case '3':{ CMD[ 4*( end - i ) - 1 ] = '0'; CMD[ 4*( end - i ) - 2 ] = '0'; CMD[ 4*( end - i ) - 3 ] = '1'; CMD[ 4*( end - i ) - 4 ] = '1'; break;}
					case '4':{ CMD[ 4*( end - i ) - 1 ] = '0'; CMD[ 4*( end - i ) - 2 ] = '1'; CMD[ 4*( end - i ) - 3 ] = '0'; CMD[ 4*( end - i ) - 4 ] = '0'; break;}
					case '5':{ CMD[ 4*( end - i ) - 1 ] = '0'; CMD[ 4*( end - i ) - 2 ] = '1'; CMD[ 4*( end - i ) - 3 ] = '0'; CMD[ 4*( end - i ) - 4 ] = '1'; break;}
					case '6':{ CMD[ 4*( end - i ) - 1 ] = '0'; CMD[ 4*( end - i ) - 2 ] = '1'; CMD[ 4*( end - i ) - 3 ] = '1'; CMD[ 4*( end - i ) - 4 ] = '0'; break;}
					case '7':{ CMD[ 4*( end - i ) - 1 ] = '0'; CMD[ 4*( end - i ) - 2 ] = '1'; CMD[ 4*( end - i ) - 3 ] = '1'; CMD[ 4*( end - i ) - 4 ] = '1'; break;}
					case '8':{ CMD[ 4*( end - i ) - 1 ] = '1'; CMD[ 4*( end - i ) - 2 ] = '0'; CMD[ 4*( end - i ) - 3 ] = '0'; CMD[ 4*( end - i ) - 4 ] = '0'; break;}
					case '9':{ CMD[ 4*( end - i ) - 1 ] = '1'; CMD[ 4*( end - i ) - 2 ] = '0'; CMD[ 4*( end - i ) - 3 ] = '0'; CMD[ 4*( end - i ) - 4 ] = '1'; break;}
					case 'A':
					case 'a':
					{ CMD[ 4*( end - i ) - 1 ] = '1'; CMD[ 4*( end - i ) - 2 ] = '0'; CMD[ 4*( end - i ) - 3 ] = '1'; CMD[ 4*( end - i ) - 4 ] = '0'; break;}
					case 'B':
					case 'b':
					{ CMD[ 4*( end - i ) - 1 ] = '1'; CMD[ 4*( end - i ) - 2 ] = '0'; CMD[ 4*( end - i ) - 3 ] = '1'; CMD[ 4*( end - i ) - 4 ] = '1'; break;}
					case 'C':
					case 'c':
					{ CMD[ 4*( end - i ) - 1 ] = '1'; CMD[ 4*( end - i ) - 2 ] = '1'; CMD[ 4*( end - i ) - 3 ] = '0'; CMD[ 4*( end - i ) - 4 ] = '0'; break;}
					case 'D':
					case 'd':
					{ CMD[ 4*( end - i ) - 1 ] = '1'; CMD[ 4*( end - i ) - 2 ] = '1'; CMD[ 4*( end - i ) - 3 ] = '0'; CMD[ 4*( end - i ) - 4 ] = '1'; break;}
					case 'E':
					case 'e':
					{ CMD[ 4*( end - i ) - 1 ] = '1'; CMD[ 4*( end - i ) - 2 ] = '1'; CMD[ 4*( end - i ) - 3 ] = '1'; CMD[ 4*( end - i ) - 4 ] = '0'; break;}
					case 'F':
					case 'f':
					{ CMD[ 4*( end - i ) - 1 ] = '1'; CMD[ 4*( end - i ) - 2 ] = '1'; CMD[ 4*( end - i ) - 3 ] = '1'; CMD[ 4*( end - i ) - 4 ] = '1'; break;}
					}
				}
			}
			else
			{
				for( i = 0; i <= end; i++ )
				{
					num += ( a[ i ] - 48 ) * pow( 10, ( end - i ) ); //注意char与int的转换			
				}	
				for( i = 0; num != 0 && i < 16; i++ )
				{
					CMD[ i ] = num%2 + 48;//注意char与int的转换
					num = num/2;
				}
			}

			//处理Beq,Bne两条指令
			if( CMD[29] == '0' && CMD[28] == '1' && CMD[27] == '0' && ( CMD[26] == '0' || CMD[26] == '1' ))
			{
				//cout << "into  beq/bne: \n";
				if ( CMD[0] == '1' || CMD[1] == '1' )	//地址不能被4整除
					return -1;
				char b[32];
				b[31] = '0';
				b[30] = '0';

				for( i = 0; i < 30; i++ )
				{
					b[i] = CMD[ i+2 ];
				}

				for( i = 0; i < 32; i++ )
				{
					CMD[i] = b[i];
				}
			}

			//处理有如BUF+4这样指令的立即数
			if ( flag )
			{//应该是当前立即数除以4加上刚处理的IDNAME的Order,注意IDNAME已经在CMD的低十六位设置好了
				//还应注意,如果当前立即数不能被4整除,那么将返回地址错误
				if ( CMD[0] == '1' || CMD[1] == '1' ) //当前立即数不能被4整除
					return -1;
				char co = '0';		//指示进位位
				for ( s = 0; s < 16-2; s++ )
				{
					if ( (co == '1')&&(lower16CMD[s+2] == '1') )
						co = '1';
					else if ( (co == '0')&&(lower16CMD[s+2] == '0') )
						co = '0';
					else 
					{
						if ( CMD[s+2] == '1' )
						{
							CMD[s] = '0';
							co = '1';
						}
						else
						{
							CMD[s] = '1';
							co = '0';
						}
					}
				}
				if ( co == '1' )
					CMD[14] = '1';
				else 
					CMD[14] = '0';
				CMD[15] = '0';
			}
			
			return 0;	// 0 表示成功退出
		}
	case T_SHAMT:
		{
			int value = 0;
			char* t;
			if (TOKEN.TokenName[1] == '\0' || TOKEN.TokenName[2] == '\0' )
			{
				if ( TOKEN.TokenName[1] == '\0' && TOKEN.TokenName[2] != '\0'  )
					value = TOKEN.TokenName[0]-48;
				else 
					value = (TOKEN.TokenName[0]-48)*10+(TOKEN.TokenName[1]-48);
				t = DecToBin( value );
			}
			else if ( TOKEN.TokenName[5] == 'b'||TOKEN.TokenName[5] == 'B' )
				t = TOKEN.TokenName;
			for ( i = 0; i < 5; i++)
				CMD[10-i] = t[i];
			return 0;	// 0 表示成功退出
		}
	case T_COMMA:
		{
			return 0;	// 0 表示成功退出
		}
	case T_NOP:
		{
			for ( i = 0; i < 31; i++ )
				CMD[i] = '0';	//NOP的指令码为全0
			return 0;	// 0 表示成功退出
		}
	default:	return -1;
	}
	return -1;
}

int Assembler::SegNameToAddr( char* tokenname )  //由SEGID的名称来取出其地址
{
	list<My_SegID>::iterator i, iend;
	i = SEGID.begin();
	iend = SEGID.end();
	while ( i != iend && strcmp(i->Name, tokenname) )
	{
		i++;
	}
	if ( i != iend )
		return i->Order;
	return -1;
}

int Assembler::VarNameToAddr( char* tokenname )  //由VAR的名称来取出其地址
{
	list<My_Var>::iterator i, iend;
	i = VAR.begin();
	iend = VAR.end();
	while ( i != iend && strcmp(i->Name, tokenname) )
	{
		i++;
	}
	if ( i != iend )
		return i->Order;
	return -1;
}


char* Assembler::DecToBin( int v )	//将0~31转化为二进制填入一个5bits的字符串中
{
	static char retv[6] = {'0','0','0','0','0','\0'};
	for ( int j = 0; j < 6-1; j++ )
		retv[j] = '0';
	switch ( v )
	{
	case 0:
		break;
	case 1:
		retv[4] = '1';
		break;
	case 2:
		retv[3] = '1';
		break;
	case 3:
		retv[3] = retv[4] = '1';
		break;
	case 4:
		retv[2] = '1';
		break;
	case 5:
		retv[2] = retv[4] = '1';
		break;
	case 6:
		retv[2] = retv[3] = '1';
		break;
	case 7:
		retv[2] = retv[3] = retv[4] = '1';
		break;
	case 8:
		retv[1] = '1';
		break;
	case 9:
		retv[1] = retv[4] = '1';
		break;
	case 10:
		retv[1] = retv[3] = '1';
		break;
	case 11:
		retv[1] = retv[3] = retv[4] = '1';
		break;
	case 12:
		retv[1] = retv[2] = '1';
		break;
	case 13:
		retv[1] = retv[2] = retv[4] = '1';
		break;
	case 14:
		retv[1] = retv[2] = retv[3] = '1';
		break;
	case 15:
		retv[1] = retv[2] = retv[3] = retv[4] = '1';
		break;
	case 16:
		retv[0] = '1';
		break;
	case 17:
		retv[0] = retv[4] = '1';
		break;
	case 18:
		retv[0] = retv[3] = '1';
		break;
	case 19:
		retv[0] = retv[3] = retv[4] = '1';
		break;
	case 20:
		retv[0] = retv[2] = '1';
		break;
	case 21:
		retv[0] = retv[2] = retv[4] = '1';
		break;
	case 22:
		retv[0] = retv[2] = retv[3] = '1';
		break;
	case 23:
		retv[0] = retv[2] = retv[3] = retv[4] = '1';
		break;
	case 24:
		retv[0] = retv[1] = '1';
		break;
	case 25:
		retv[0] = retv[1] = retv[4] = '1';
		break;
	case 26:
		retv[0] = retv[1] = retv[3] = '1';
		break;
	case 27:
		retv[0] = retv[1] = retv[3] = retv[4] = '1';
		break;
	case 28:
		retv[0] = retv[1] = retv[2] = '1';
		break;
	case 29:
		retv[0] = retv[1] = retv[2] = retv[4] = '1';

⌨️ 快捷键说明

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