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

📄 privatefuncs.cpp

📁 MIPS32指令系统的汇编器。 在QUARTUS仿真环境中
💻 CPP
📖 第 1 页 / 共 4 页
字号:

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


}

void Assembler::InitRegsAlias()
{
	RegsAlias[0][0] = "$zero";RegsAlias[0][1] = "$0";
	RegsAlias[1][0] = "$at";RegsAlias[1][1] = "$1";
	RegsAlias[2][0] = "$v0";RegsAlias[2][1] = "$2";
	RegsAlias[3][0] = "$v1";RegsAlias[3][1] = "$3";
	RegsAlias[4][0] = "$a0";RegsAlias[4][1] = "$4";
	RegsAlias[5][0] = "$a1";RegsAlias[5][1] = "$5";
	RegsAlias[6][0] = "$a2";RegsAlias[6][1] = "$6";
	RegsAlias[7][0] = "$a3";RegsAlias[7][1] = "$7";
	RegsAlias[8][0] = "$t0";RegsAlias[8][1] = "$8";
	RegsAlias[9][0] = "$t1";RegsAlias[9][1] = "$9";
	RegsAlias[10][0] = "$t2";RegsAlias[10][1] = "$10";
	RegsAlias[11][0] = "$t3";RegsAlias[11][1] = "$11";
	RegsAlias[12][0] = "$t4";RegsAlias[12][1] = "$12";
	RegsAlias[13][0] = "$t5";RegsAlias[13][1] = "$13";
	RegsAlias[14][0] = "$t6";RegsAlias[14][1] = "$14";
	RegsAlias[15][0] = "$t7";RegsAlias[15][1] = "$15";
	RegsAlias[16][0] = "$s0";RegsAlias[16][1] = "$16";
	RegsAlias[17][0] = "$s1";RegsAlias[17][1] = "$17";
	RegsAlias[18][0] = "$s2";RegsAlias[18][1] = "$18";
	RegsAlias[19][0] = "$s3";RegsAlias[19][1] = "$19";
	RegsAlias[20][0] = "$s4";RegsAlias[20][1] = "$20";
	RegsAlias[21][0] = "$s5";RegsAlias[21][1] = "$21";
	RegsAlias[22][0] = "$s6";RegsAlias[22][1] = "$22";
	RegsAlias[23][0] = "$s7";RegsAlias[23][1] = "$23";
	RegsAlias[24][0] = "$t8";RegsAlias[24][1] = "$24";
	RegsAlias[25][0] = "$t9";RegsAlias[25][1] = "$25";
	RegsAlias[26][0] = "$i0";RegsAlias[26][1] = "$26";
	RegsAlias[27][0] = "$i1";RegsAlias[27][1] = "$27";
	RegsAlias[28][0] = "$s9";RegsAlias[28][1] = "$28";
	RegsAlias[29][0] = "$sp";RegsAlias[29][1] = "$29";
	RegsAlias[30][0]= "$s8";RegsAlias[30][1] = "$30";
	RegsAlias[31][0] = "$ra";RegsAlias[31][1] = "$31";
}

void Assembler::ErrorProcess( int Er )
{
	switch ( Er )
	{
	case ERROR_LEX:				//词法错误
		ErrorLex();
		break;
	case ERROR_SEMANTIC: 		//语法错误,预测表项为空
		{
			cout << "sysmantic error... " << endl
				 << "	probably the corresponding item in ForcastTable is empty." << endl;
			break;
		}
	case ERROR_DEDUCTION:  		//推导错误,栈满
		{
			cout << "deduction error..." << endl;
			break;
		}
	case ERROR_REIDNAME: 		//标号名重复
		{
			cout << "line " << No_TxtLine << ": "
				 << " normal idname is repeatedly defined..." << endl;
			break;
		}
	case ERROR_REIDNAMES:		//开始标号名重复
		{
			cout << "line " << No_TxtLine << ": "
				 << " start idname is repeatedly defined..." << endl;
			break;
		}
	case ERROR_CONCMD:		//指令构造出错
		{
			cout << "line " << No_TxtLine << ": "
				 << " immediate(as addr) connot be divided by 4 or the regalia is not correct..." << endl;
			break;
		}
	case ERROR_CONCMDS: 		//指令串接出错
		{
			cout << "line " << No_TxtLine << ": "
				 << "code addr is out of the maximun addr..." << endl;
			break;
		}
	case ERROR_DEFVAR: 		//变量定义错误
		{
			cout << "line " << No_TxtLine << ": "
				 << "var name is incorrectly defined..." << endl;
			break;
		}
	case ERROR_DATA_ADDR :			//数据地址不能被4整除
		{
			cout << "line " << No_TxtLine << ": " 
				 << "data address cannot be divided by 4..." << endl;
			break;
		}
	case ERROR_CODE_ADDR :			//代码地址不能被4整除
		{
			cout << "line " << No_TxtLine << ": " 
				 << "code address cannot be divided by 4..." << endl;
			break;
		}
	case ERROR_DATA_ADDR_OVERLAPPED:		//地址已被占用
		{
			cout << "data address overlapped: a data ram unit used cannot be written again..." << endl;
			break;
		}
	case ERROR_CODE_ADDR_OVERLAPPED:		//地址已被占用
		{
			cout << "code address overlapped: a code ram unit used cannot be written again..." << endl;
			break;
		}
	case ERROR_NOTEXIST_SEGID:		//有转移指令引用了不存在的指令标号
		{
			cout << "there reference a not-existed SegName..." << endl;
			break;
		}
	default:
		break;
	}
	DeleteFiles();
}

void Assembler::ErrorLex()
{
	switch ( STACK.top() ) 
	{
	case T_CODE:
		{
		cout << "line " << No_TxtLine << " : "
			 << "Error: CODE is incorrect or missing..." << endl;
		break;
		}
	case T_ORG_CODE:
		{
		cout << "line " << No_TxtLine << " : "
			 << "Error: ORG_CODE is incorrect or missing..." << endl;
		break;
		}
	case T_DATA:
		{
		cout << "line " << No_TxtLine << " : "
			 << "Error: DATA is incorrect or missing..." << endl;
		break;
		}
	case T_ORG_DATA: 
		{
		cout << "line " << No_TxtLine << " : "
			 << "Error: ORG_DATA is incorrect or missing..." << endl;
		break;
		}
	case T_END:
		{
		cout << "line " << No_TxtLine << " : "
			 << "Error: END is incorrect or missing..." << endl;
		break;
		}
	case T_DW:
		{
		cout << "line " << No_TxtLine << " : "
			 << "Error: DW is incorrect or missing..." << endl;
		break;
		}
	case T_SEG:
		{
		cout << "line " << No_TxtLine << " : "
			 << "Error: SEG is incorrect or missing..." << endl;
		break;
		}
	case T_ENDS:
		{
		cout << "line " << No_TxtLine << " : "
			 << "Error: ENDS is incorrect or missing..." << endl;
		break;
		}
	case T_ENDL:
		{
		cout << "line " << No_TxtLine << " : "
			 << "Error: ENDL is incorrect or missing..." << endl;
		break;
		}
	case T_IDNAME:
		{
		cout << "line " << No_TxtLine << " : "
			 << "Error: IDNAME is incorrect or missing..." << endl;
		break;
		}
	case T_COMMA:   
		{
		cout << "line " << No_TxtLine << " : "
			 << "Error: COMMA is incorrect or missing..." << endl;
		break;
		}
	case T_COLON:         
		{
		cout << "line " << No_TxtLine << " : "
			 << "Error: COLON is incorrect or missing..." << endl;
		break;
		}
	case T_COMMENT:         
		{
		cout << "line " << No_TxtLine << " : "
			 << "Error: COMMENT is incorrect or missing..." << endl;
		break;
		}
	case T_32NUM:
		{
		cout << "line " << No_TxtLine << " : "
			 << "Error: 32NUM is incorrect or missing..." << endl;
		break;
		}
	case T_SHAMT:
		{
		cout << "line " << No_TxtLine << " : "
			 << "Error: SHAMT is incorrect or missing..." << endl;
		break;
		}
	case T_ADDR:
		{
		cout << "line " << No_TxtLine << " : "
			 << "Error: ADDR(should form as f12ch) is incorrect or missing..." << endl;
		break;
		}
	case T_IMMEDIATE:
		{
		cout << "line " << No_TxtLine << " : "
			 << "Error: IMMEDIATE is incorrect or missing..." << endl;
		break;
		}
	case T_RS:
		{
		cout << "line " << No_TxtLine << " : "
			 << "Error: RS is incorrect or missing..." << endl;
		break;
		}
	case T_RT:
		{
		cout << "line " << No_TxtLine << " : "
			 << "Error: RT is incorrect or missing..." << endl;
		break;
		}
	case T_RD:
		{
		cout << "line " << No_TxtLine << " : "
			 << "Error: RD is incorrect or missing..." << endl;
		break;
		}
	case T_BRS:
		{
		cout << "line " << No_TxtLine << " : "
			 << "Error: BRS is incorrect or missing..." << endl;
		break;
		}
	case T_NOP:
		{
		cout << "line " << No_TxtLine << " : "
			 << "Error: NOP is incorrect or missing..." << endl;
		break;
		}
	case T_RCOM:
		{
		cout << "line " << No_TxtLine << " : "
			 << "Error: RCOM is incorrect or missing..." << endl;
		break;
		}
	case T_SRCOM:
		{
		cout << "line " << No_TxtLine << " : "
			 << "Error: SRCOM is incorrect or missing..." << endl;
		break;
		}
	case T_SLLRCOM:
		{
		cout << "line " << No_TxtLine << " : "
			 << "Error: SLLRCOM is incorrect or missing..." << endl;
		break;
		}
	case T_ICOM:
		{
		cout << "line " << No_TxtLine << " : "
			 << "Error: ICOM is incorrect or missing..." << endl;
		break;
		}
	case T_SICOM:
		{
		cout << "line " << No_TxtLine << " : "
			 << "Error: SICOM is incorrect or missing..." << endl;
		break;
		}
	case T_LWICOM:
		{
		cout << "line " << No_TxtLine << " : "
			 << "Error: LWICOM is incorrect or missing..." << endl;
		break;
		}
	case T_JCOM:
		{
		cout << "line " << No_TxtLine << " : "
			 << "Error: JCOM is incorrect or missing..." << endl;
		break;
		}

	case N_PRO:
		{
		cout << "line " << No_TxtLine << " : "
			 << "Error: N_PRO: should accept \"DATA\" or \"CODE\"..." << endl;
		break;
		}
	case N_DATA:
		{
		cout << "line " << No_TxtLine << " : "
			 << "Error: N_DATA: should accept \"DATA\" or \"CODE\"..." << endl;
		break;
		}
	case N_DATASEG:
		{
		cout << "line " << No_TxtLine << " : "
			 << "Error: N_DATASEG: should accept \"DATA\"..." << endl;
		break;
		}
	case N_ORG_DATA:
		{
		cout << "line " << No_TxtLine << " : "
			 << "Error: N_ORG_DATA: should accept \"ORG_DATA\"..." << endl;
		break;
		}
	case N_VARS:
		{
		cout << "line " << No_TxtLine << " : "
			 << "Error: N_VARS: should accept IDNAME..." << endl;
		break;
		}
	case N_VARSA:
		{
		cout << "line " << No_TxtLine << " : "
			 << "Error: N_VARSA: should accept \"DATA\" or IDNAME..." << endl;
		break;
		}
	case N_VAR:
		{
		cout << "line " << No_TxtLine << " : "
			 << "Error: N_VAR: should accept IDNAME..." << endl;
		break;
		}
	case N_DATAENDS:
		{
		cout << "line " << No_TxtLine << " : "
			 << "Error: N_DATAENDS: should accept \"DATA\"..." << endl;
		break;
		}
	case N_CODE:
		{
		cout << "line " << No_TxtLine << " : "
			 << "Error: N_CODE: should accept \"CODE\"..." << endl;
		break;
		}
	case N_CODESEG:
		{
		cout << "line " << No_TxtLine << " : "
			 << "Error: N_CODESEG: should accept \"CODE\"..." << endl;
		break;
		}
	case N_ORG_CODE:
		{
		cout << "line " << No_TxtLine << " : "
			 << "Error: N_ORG_CODE: should accept \"ORG_CODE\"..." << endl;
		break;
		}
	case N_SEG:
		{
		cout << "line " << No_TxtLine << " : "
			 << "Error: N_SEG: should accept IDNAME..." << endl;
		break;
		}
	case N_STARTSEGID:
		{
		cout << "line " << No_TxtLine << " : "
			 << "Error: N_STARTSEG: should accept IDNAME..." << endl;
		break;
		}
	case N_ORDER:
		{
		cout << "line " << No_TxtLine << " : "
			 << "Error: N_ORDER: should accept correct command code..." << endl;
		break;
		}
	case N_COM:
		{
		cout << "line " << No_TxtLine << " : "
			 << "Error: N_COM: should accept correct command code..." << endl;
		break;
		}
	case N_ORDERS:
		{
		cout << "line " << No_TxtLine << " : "
			 << "Error: N_ORDERS: should accept correct command code..." << endl;
		break;
		}
	case N_SUBSEGID:
		{
		cout << "line " << No_TxtLine << " : "
			 << "Error: N_SUBSEGID: should accept IDNAME..." << endl;
		break;
		}
	case N_ENDSEGID:
		{
		cout << "line " << No_TxtLine << " : "
			 << "Error: N_ENDSEGID: should accept \"END\"..." << endl;
		break;
		}
	case N_CODEENDS:
		{
		cout << "line " << No_TxtLine << " : "
			 << "Error: N_CODEENDS: should accept \"CODE\"..." << endl;
		break;
		}
	case N_COMQ:
		{
		cout << "line " << No_TxtLine << " : "
			 << "Error: N_COMQ: should accept correct ICOM..." << endl;
		break;
		}
	case N_COMQA:
		{
		cout << "line " << No_TxtLine << " : "
			 << "Error: N_COMQA: should accept IMMEDIATE or IDNAME..." << endl;
		break;
		}
	case N_COMD:
		{
		cout << "line " << No_TxtLine << " : "
			 << "Error: N_COMD: should accept correct LWICOM..." << endl;
		break;
		}
	case N_COMDA:
		{
		cout << "line " << No_TxtLine << " : "
			 << "Error: N_COMDA: should accept ADDR or IDNAME..." << endl;
		break;
		}
	case N_COMDB:
		{
		cout << "line " << No_TxtLine << " : "
			 << "Error: N_COMDB: should accept IDNAME..." << endl;
		break;
		}
	case N_COMDC:
		{
		cout << "line " << No_TxtLine << " : "
			 << "Error: N_COMDC: should accept BRS or PLUS(+)..." << endl;
		break;
		}
	default:
		cout << "line " << No_TxtLine << " : "
			 << "Error not known occurs..." << endl;
		break;
	}
	DeleteFiles();
}

void Assembler::DeleteFiles()
{
	fclose(DataFile);		 //关闭数据文件
	fclose(ProgramFile);	 //关闭指令文件
	remove("dmem32.mif");
	remove("prgmip32.mif");
}

⌨️ 快捷键说明

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