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

📄 privatefuncs.cpp

📁 MIPS32指令系统的汇编器。 在QUARTUS仿真环境中
💻 CPP
📖 第 1 页 / 共 4 页
字号:
		break;
	case 30:
		retv[0] = retv[1] = retv[2] = retv[3] = '1';
		break;
	case 31:
		retv[0] = retv[1] = retv[2] = retv[3] = retv[4] = '1';
		break;
	default:
		break;
	}
	return retv;
}

char* Assembler::HexToBin( char c )	//将一位十六进制数转化为二进制填入一个4bits的字符串中
{
	static char retv[5] = {'0','0','0','0','\0'};
	for ( int j = 0; j < 5-1; j++ )
		retv[j] = '0';
	switch ( c )
	{
	case '0':
		break;
	case '1':
		retv[3] = '1';
		break;
	case '2':
		retv[2] = '1';
		break;
	case '3':
		retv[2] = retv[3] = '1';
		break;
	case '4':
		retv[1] = '1';
		break;
	case '5':
		retv[1] = retv[3] = '1';
		break;
	case '6':
		retv[1] = retv[2] = '1';
		break;
	case '7':
		retv[1] = retv[2] = retv[3] = '1';
		break;
	case '8':
		retv[0] = '1';
		break;
	case '9':
		retv[0] = retv[3] = '1';
		break;
	case 'a':
	case 'A':
		retv[0] = retv[2] = '1';
		break;
	case 'b':
	case 'B':
		retv[0] = retv[2] = retv[3] = '1';
		break;
	case 'c':
	case 'C':
		retv[0] = retv[1] = '1';
		break;
	case 'd':
	case 'D':
		retv[0] = retv[1] = retv[3] = '1';
		break;
	case 'e':
	case 'E':
		retv[0] = retv[1] = retv[2] = '1';
		break;
	case 'f':
	case 'F':
		retv[0] = retv[1] = retv[2] = retv[3] = '1';
		break;
	default:
		break;
	}
	return retv;
}

int Assembler::AddrToInt( char* cs )	//将由四位十六进制的ADDR转化为十进制,使得用ORG设置指令(数据)地址时方便
{
	int retv = 0;
	for ( int k = 0; k < 4; k++ )		//注意地址是四位哦,四位
	{
		switch ( cs[k] )
		{
		case '0': 
		case '1':
		case '2':
		case '3':
		case '4':
		case '5':
		case '6':
		case '7':
		case '8':
		case '9':
			retv += (cs[k]-48)*pow(16, 3-k);
			break;
		case 'a':
		case 'b':
		case 'c':
		case 'd':
		case 'e':
		case 'f':
			retv += (cs[k]-87)*pow(16, 3-k);
			break;
		case 'A':
		case 'B':
		case 'C':
		case 'D':
		case 'E':
		case 'F':
			retv += (cs[k]-55)*pow(16, 3-k);
			break;
		default:
			break;
		}
	}
	return retv;
}

void Assembler::InitTwoTables()
{
	/********************Initialize the ForcastTable************************/
	for ( int m = 0, n = 0; m < CountOfVN, n < CountOfVT; m++, n++ )
		ForcastTable[m][n] = 0;

	ForcastTable[N_PRO-30][T_DATA] = 1;
	ForcastTable[N_PRO-30][T_CODE] = 1;
	ForcastTable[N_DATA-30][T_DATA] = 2;
	ForcastTable[N_DATA-30][T_CODE] = 3;
	ForcastTable[N_DATASEG-30][T_DATA] = 4;
	ForcastTable[N_ORG_DATA-30][T_ORG_DATA] = 5;
	ForcastTable[N_VARS-30][T_IDNAME] = 6;
	ForcastTable[N_VARSA-30][T_DATA] = 8;
	ForcastTable[N_VARSA-30][T_IDNAME] = 7;
	ForcastTable[N_VAR-30][T_IDNAME] = 9;
	ForcastTable[N_DATAENDS-30][T_DATA] = 10;
	ForcastTable[N_CODE-30][T_CODE] = 11;
	ForcastTable[N_CODESEG-30][T_CODE] = 12;
	ForcastTable[N_ORG_CODE-30][T_ORG_CODE] = 13;
	ForcastTable[N_SEG-30][T_IDNAME] = 14;
	ForcastTable[N_STARTSEGID-30][T_IDNAME] = 15;
	ForcastTable[N_ORDER-30][T_RCOM] = 16;
	ForcastTable[N_ORDER-30][T_SRCOM] = 16;
	ForcastTable[N_ORDER-30][T_SLLRCOM] = 16;
	ForcastTable[N_ORDER-30][T_ICOM] = 16;
	ForcastTable[N_ORDER-30][T_SICOM] = 16;
	ForcastTable[N_ORDER-30][T_LWICOM] = 16;
	ForcastTable[N_ORDER-30][T_JCOM] = 16;
	ForcastTable[N_ORDER-30][T_NOP] = 16;
	ForcastTable[N_ORDER-30][T_ORG_CODE] = 31;
	ForcastTable[N_COM-30][T_RCOM] = 17;
	ForcastTable[N_COM-30][T_SRCOM] = 18;
	ForcastTable[N_COM-30][T_SLLRCOM] = 19;
	ForcastTable[N_COM-30][T_ICOM] = 20;
	ForcastTable[N_COM-30][T_SICOM] = 21;
	ForcastTable[N_COM-30][T_LWICOM] = 22;
	ForcastTable[N_COM-30][T_JCOM] = 23;
	ForcastTable[N_COM-30][T_NOP] = 30;
	ForcastTable[N_ORDERS-30][T_IDNAME] = 26;
	ForcastTable[N_ORDERS-30][T_ORG_CODE] = 24;
	ForcastTable[N_ORDERS-30][T_RCOM] = 24;
	ForcastTable[N_ORDERS-30][T_SRCOM] = 24;
	ForcastTable[N_ORDERS-30][T_SLLRCOM] = 24;
	ForcastTable[N_ORDERS-30][T_ICOM] = 24;
	ForcastTable[N_ORDERS-30][T_SICOM] = 24;
	ForcastTable[N_ORDERS-30][T_LWICOM] = 24;
	ForcastTable[N_ORDERS-30][T_JCOM] = 24;
	ForcastTable[N_ORDERS-30][T_END] = 25;
	ForcastTable[N_ORDERS-30][T_NOP] = 24;
	ForcastTable[N_SUBSEGID-30][T_IDNAME] = 27;
	ForcastTable[N_ENDSEGID-30][T_END] = 28;
	ForcastTable[N_CODEENDS-30][T_CODE] = 29;

	ForcastTable[N_COMQ-30][T_ICOM] = 34;
	ForcastTable[N_COMQA-30][T_IMMEDIATE] = 35;
	ForcastTable[N_COMQA-30][T_IDNAME] = 36;

	ForcastTable[N_COMD-30][T_LWICOM] = 32;
	ForcastTable[N_COMDA-30][T_ADDR] = 37;
	ForcastTable[N_COMDA-30][T_IDNAME] = 33;
	ForcastTable[N_COMDB-30][T_IDNAME] = 38;
	ForcastTable[N_COMDC-30][T_BRS] = 40;
	ForcastTable[N_COMDC-30][T_PLUS] = 39;

	ForcastTable[N_COMJA-30][T_JCOM] = 41;
	ForcastTable[N_COMJB-30][T_IDNAME] = 42;
	ForcastTable[N_COMJB-30][T_ADDR] = 43;


	
	/********************Initialize the SyntacticRules************************/

	// RULE 1: <N_PRO> -> <N_DATA><N_CODE>
	SyntacticRules[1][0] = N_CODE;
	SyntacticRules[1][1] = N_DATA;
	SyntacticRules[1][2] = 0;

	// RULE 2: <N_DATA> -> <N_DATA SEG><N_ORG_DATA><N_VARS><N_DATA ENDS>
	SyntacticRules[2][0] = N_DATAENDS;
	SyntacticRules[2][1] = N_VARS;
	SyntacticRules[2][2] = N_ORG_DATA;
	SyntacticRules[2][3] = N_DATASEG;
	SyntacticRules[2][4] = 0;

	// RULE 3: <N_DATA> -> NOTHING
	SyntacticRules[3][0] = 0;

	// RULE 4: <N_DATA SEG> -> {T_DATA}{T_SEG}{T_ENDL}
	SyntacticRules[4][0] = T_ENDL;
	SyntacticRules[4][1] = T_SEG;
	SyntacticRules[4][2] = T_DATA;
	SyntacticRules[4][3] = 0;

	// RULE 5: <N_ORG_DATA> -> {T_ORG_DATA}{T_ADDR}{T_ENDL}
	SyntacticRules[5][0] = T_ENDL;
	SyntacticRules[5][1] = T_ADDR;
	SyntacticRules[5][2] = T_ORG_DATA;
	SyntacticRules[5][3] = 0;

	// RULE 6: <N_VARS> -> <N_VAR><N_VARS>'
	SyntacticRules[6][0] = N_VARSA;
	SyntacticRules[6][1] = N_VAR;
	SyntacticRules[6][2] = 0;

	// RULE 7: <N_VARS>' -> <N_VARS>
	SyntacticRules[7][0] = N_VARS;
	SyntacticRules[7][1] = 0;

	// RULE 8: <N_VARS>' -> NOTHING
	SyntacticRules[8][0] = 0;

	// RULE 9: <N_VAR> -> {T_IDNAME}{T_DW}{T_32NUM}{T_COMMA}{T_32NUM}{T_ENDL}
	SyntacticRules[9][0] = T_ENDL;
	SyntacticRules[9][1] = T_32NUM;
	SyntacticRules[9][2] = T_COMMA;
	SyntacticRules[9][3] = T_32NUM;
	SyntacticRules[9][4] = T_DW;
	SyntacticRules[9][5] = T_IDNAME;
	SyntacticRules[9][6] = 0;

	// RULE 10: <N_DATA ENDS> -> {T_DATA}{T_ENDS}{T_ENDL}
	SyntacticRules[10][0] = T_ENDL;
	SyntacticRules[10][1] = T_ENDS;
	SyntacticRules[10][2] = T_DATA;
	SyntacticRules[10][3] = 0;

	// RULE 11: <N_CODE> -> <N_CODE SEG><N_ORG_CODE><N_SEG><N_CODE ENDS>
	SyntacticRules[11][0] = N_CODEENDS;
	SyntacticRules[11][1] = N_SEG;
	SyntacticRules[11][2] = N_ORG_CODE;
	SyntacticRules[11][3] = N_CODESEG;
	SyntacticRules[11][4] = 0;

	// RULE 12: <N_CODE SEG> -> {T_CODE}{T_SEG}{T_ENDL}
	SyntacticRules[12][0] = T_ENDL;
	SyntacticRules[12][1] = T_SEG;
	SyntacticRules[12][2] = T_CODE;
	SyntacticRules[12][3] = 0;

	// RULE 13: <N_ORG_CODE> -> {T_ORG_CODE}{T_ADDR}{T_ENDL}
	SyntacticRules[13][0] = T_ENDL;
	SyntacticRules[13][1] = T_ADDR;
	SyntacticRules[13][2] = T_ORG_CODE;
	SyntacticRules[13][3] = 0;

	// RULE 14: <N_SEG> -> <N_START SEGID><N_ORDER><N_ORDERS><N_ENDSEGID>
	SyntacticRules[14][0] = N_ENDSEGID;
	SyntacticRules[14][1] = N_ORDERS;
	SyntacticRules[14][2] = N_ORDER;
	SyntacticRules[14][3] = N_STARTSEGID;
	SyntacticRules[14][4] = 0;

	// RULE 15: <N_START SEGID> -> {T_IDNAME}{T_COLON}
	SyntacticRules[15][0] = T_COLON;
	SyntacticRules[15][1] = T_IDNAME;
	SyntacticRules[15][2] = 0;

	// RULE 16: <N_ORDER> -> <N_COM>{T_ENDL}
	SyntacticRules[16][0] = T_ENDL;
	SyntacticRules[16][1] = N_COM;
	SyntacticRules[16][2] = 0;

	// RULE 17: <N_COM> -> {T_RCOM}{T_RD}{T_COMMA}{T_RS}{T_COMMA}{T_RT}
	SyntacticRules[17][0] = T_RT;
	SyntacticRules[17][1] = T_COMMA;
	SyntacticRules[17][2] = T_RS;
	SyntacticRules[17][3] = T_COMMA;
	SyntacticRules[17][4] = T_RD;
	SyntacticRules[17][5] = T_RCOM;
	SyntacticRules[17][6] = 0;

	// RULE 18: <N_COM> -> {T_SRCOM}{T_RS}
	SyntacticRules[18][0] = T_RS;
	SyntacticRules[18][1] = T_SRCOM;
	SyntacticRules[18][2] = 0;

	// RULE 19: <N_COM> -> {T_SLLRCOM}{T_RD}{T_COMMA}{T_RT}{T_COMMA}{T_SHAMT}
	SyntacticRules[19][0] = T_SHAMT;
	SyntacticRules[19][1] = T_COMMA;
	SyntacticRules[19][2] = T_RT;
	SyntacticRules[19][3] = T_COMMA;
	SyntacticRules[19][4] = T_RD;
	SyntacticRules[19][5] = T_SLLRCOM;
	SyntacticRules[19][6] = 0;

/*	// RULE 20: <N_COM> -> {T_ICOM}{T_RT}{T_COMMA}{T_RS}{T_COMMA}{T_IMMEDIATE}
	SyntacticRules[20][0] = T_IMMEDIATE;
	SyntacticRules[20][1] = T_COMMA;
	SyntacticRules[20][2] = T_RS;
	SyntacticRules[20][3] = T_COMMA;
	SyntacticRules[20][4] = T_RT;
	SyntacticRules[20][5] = T_ICOM;
	SyntacticRules[20][6] = 0;
*/
	// RULE 20: <N_COM> -> <N_COMQ><N_COMQA>
	SyntacticRules[20][0] = N_COMQA;
	SyntacticRules[20][1] = N_COMQ;
	SyntacticRules[20][2] = 0;

	// RULE 21: <N_COM> -> {T_SICOM}{T_RT}{T_COMMA}{T_IMMEDIATE} 
	SyntacticRules[21][0] = T_IMMEDIATE;
	SyntacticRules[21][1] = T_COMMA;
	SyntacticRules[21][2] = T_RT;
	SyntacticRules[21][3] = T_SICOM;
	SyntacticRules[21][4] = 0;

/*	// RULE 22: <N_COM> -> {T_LWICOM}{T_RT}{T_COMMA}{T_ADDR}{T_BRS}
	SyntacticRules[22][0] = T_BRS;
	SyntacticRules[22][1] = T_ADDR;
	SyntacticRules[22][2] = T_COMMA;
	SyntacticRules[22][3] = T_RT;
	SyntacticRules[22][4] = T_LWICOM;
	SyntacticRules[22][5] = 0;
*/
	// RULE 22: <N_COM> -> <N_COMD><N_COMDA>
	SyntacticRules[22][0] = N_COMDA;
	SyntacticRules[22][1] = N_COMD;
	SyntacticRules[22][2] = 0;

/*	// RULE 23: <N_COM> -> {T_JCOM}{T_IDNAME}
	SyntacticRules[23][0] = T_IDNAME;
	SyntacticRules[23][1] = T_JCOM;
	SyntacticRules[23][2] = 0;
*/
	// RULE 23: <N_COM> -> <N_COMJA><N_COMJB>
	SyntacticRules[23][0] = N_COMJB;
	SyntacticRules[23][1] = N_COMJA;
	SyntacticRules[23][2] = 0;

	// RULE 24: <N_ORDERS> -> <N_ORDER><N_ORDERS>
	SyntacticRules[24][0] = N_ORDERS;
	SyntacticRules[24][1] = N_ORDER;
	SyntacticRules[24][2] = 0;

	// RULE 25: <N_ORDERS> -> NOTHING
	SyntacticRules[25][0] = 0;


	// RULE 26: <N_ORDERS> -> <N_SUBSEGID><N_ORDER><N_ORDERS>
	SyntacticRules[26][0] = N_ORDERS;
	SyntacticRules[26][1] = N_ORDER;
	SyntacticRules[26][2] = N_SUBSEGID;
	SyntacticRules[26][3] = 0;

	// RULE 27: <N_SUBSEGID> -> {T_IDNAME}{T_COLON}
	SyntacticRules[27][0] = T_COLON;
	SyntacticRules[27][1] = T_IDNAME;
	SyntacticRules[27][2] = 0;

	// RULE 28: <N_ENDSEGID> -> {T_END}{T_IDNAME}{T_ENDL}
	SyntacticRules[28][0] = T_ENDL;
	SyntacticRules[28][1] = T_IDNAME;
	SyntacticRules[28][2] = T_END;
	SyntacticRules[28][3] = 0;

	// RULE 29: <N_CODE ENDS> -> {T_CODE}{T_ENDS}{T_ENDL}
	SyntacticRules[29][0] = T_ENDL;
	SyntacticRules[29][1] = T_ENDS;
	SyntacticRules[29][2] = T_CODE;
	SyntacticRules[29][3] = 0;

	// RULE 30: <N_COM> -> {T_NOP}
	SyntacticRules[30][0] = T_NOP;
	SyntacticRules[30][1] = 0;

	// RULE 31: <N_ORDER> -> <N_ORG_CODE>
	SyntacticRules[31][0] = N_ORG_CODE;
	SyntacticRules[31][1] = 0;

/*	// RULE 32: <N_COM> -> {T_LWICOM}{T_RT}{T_COMMA}{T_IDNAME}{T_PLUS}{T_IMMEDIATE}{T_BRS}
	SyntacticRules[32][0] = T_BRS;
	SyntacticRules[32][1] = T_IMMEDIATE;
	SyntacticRules[32][2] = T_PLUS;
	SyntacticRules[32][3] = T_IDNAME;
	SyntacticRules[32][4] = T_COMMA;
	SyntacticRules[32][5] = T_RT;
	SyntacticRules[32][6] = T_LWICOM;
	SyntacticRules[32][7] = 0;

	// RULE 33: <N_COM> -> {T_LWICOM}{T_RT}{T_COMMA}{T_IDNAME}{T_BRS}
	SyntacticRules[33][0] = T_BRS;
	SyntacticRules[33][1] = T_IDNAME;
	SyntacticRules[33][2] = T_COMMA;
	SyntacticRules[33][3] = T_RT;
	SyntacticRules[33][4] = T_LWICOM;
	SyntacticRules[33][5] = 0;

	// RULE 34: <N_COM> -> {T_ICOM}{T_RT}{T_COMMA}{T_RS}{T_COMMA}{T_IDNAME}
	SyntacticRules[34][0] = T_IDNAME;
	SyntacticRules[34][1] = T_COMMA;
	SyntacticRules[34][2] = T_RS;
	SyntacticRules[34][3] = T_COMMA;
	SyntacticRules[34][4] = T_RT;
	SyntacticRules[34][5] = T_ICOM;
	SyntacticRules[34][6] = 0;
*/
	// RULE 32: <N_COMD> -> {T_LWICOM}{T_RT}{T_COMMA}
	SyntacticRules[32][0] = T_COMMA;
	SyntacticRules[32][1] = T_RT;
	SyntacticRules[32][2] = T_LWICOM;
	SyntacticRules[32][3] = 0;

	// RULE 33: <N_COMDA> -> <N_COMDB><N_COMDC>
	SyntacticRules[33][0] = N_COMDC;
	SyntacticRules[33][1] = N_COMDB;
	SyntacticRules[33][2] = 0;

	// RULE 34: <N_COMQ> -> {T_ICOM}{T_RT}{T_COMMA}{T_RS}{T_COMMA}
	SyntacticRules[34][0] = T_COMMA;
	SyntacticRules[34][1] = T_RS;
	SyntacticRules[34][2] = T_COMMA;
	SyntacticRules[34][3] = T_RT;
	SyntacticRules[34][4] = T_ICOM;
	SyntacticRules[34][5] = 0;

	// RULE 35: <N_COMQA> -> {T_IMMEDIATE}
	SyntacticRules[35][0] = T_IMMEDIATE;
	SyntacticRules[35][1] = 0;

	// RULE 36: <N_COMQA> -> {T_IDNAME}
	SyntacticRules[36][0] = T_IDNAME;
	SyntacticRules[36][1] = 0;

	// RULE 37: <N_COMDA> -> {T_ADDR}{T_BRS}
	SyntacticRules[37][0] = T_BRS;
	SyntacticRules[37][1] = T_ADDR;
	SyntacticRules[37][2] = 0;

	// RULE 38: <N_COMDB> -> {T_IDNAME}
	SyntacticRules[38][0] = T_IDNAME;
	SyntacticRules[38][1] = 0;

	// RULE 39: <N_CONDC> -> {T_PLUS}{T_IMMEDIATE}{T_BRS}
	SyntacticRules[39][0] = T_BRS;
	SyntacticRules[39][1] = T_IMMEDIATE;
	SyntacticRules[39][2] = T_PLUS;
	SyntacticRules[39][3] = 0;

	// RULE 40: <N_COMDC> -> {T_BRS}
	SyntacticRules[40][0] = T_BRS;
	SyntacticRules[40][1] = 0;

	// RULE 41: <N_COMJA> -> {T_JCOM}
	SyntacticRules[41][0] = T_JCOM;
	SyntacticRules[41][1] = 0;

	// RULE 42: <N_COMJB> -> {T_IDNAME}
	SyntacticRules[42][0] = T_IDNAME;
	SyntacticRules[42][1] = 0;

⌨️ 快捷键说明

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