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

📄 pass2.cpp

📁 虚拟机设计与实现——C/C++
💻 CPP
📖 第 1 页 / 共 4 页
字号:
	sprintf(lineNumber,"%lu",(*tptr).line);

	strcpy(listing,(*tptr).text);
	strcat(listing," ");
	encoded[0]=opcode;

	bret = (*toker).match(&t,TOK_INT_REG);
	if(bret==TRUE)
	{
		strcat(listing,t.text);
		encoded[1]=(U1)t.val;
	}
	else{ return; }
					
	bret = (*toker).match(&t,TOK_COMMA);
	if(bret==TRUE){ strcat(listing,t.text); }
	else{ return; }
					
	bret = (*toker).match(&t,TOK_INT_REG);
	if(bret==TRUE)
	{
		strcat(listing,t.text);
		encoded[2]=(U1)t.val;
	}
	else{ return; }

	bret = (*toker).match(&t,TOK_NO_MORE);
	if(bret!=TRUE){ return; }

	commitToFiles(nBYTES);

	bytePosPass2 = bytePosPass2 + nBYTES;
	return;

}/*end I2R*/

/*------------------------------------------------------------------*/

/* Instruction 3Integer Registers */

void Pass2::I3R(U1 opcode, struct Token *tptr) 
{
	struct Token t;
	U1 bret;
	U1 nBYTES;
	nBYTES = 4;

	sprintf(lineNumber,"%lu",(*tptr).line);

	strcpy(listing,(*tptr).text);
	strcat(listing," ");
	encoded[0]=opcode;

	bret = (*toker).match(&t,TOK_INT_REG);
	if(bret==TRUE)
	{
		strcat(listing,t.text);
		encoded[1]=(U1)t.val;
	}
	else{ return; }
					
	bret = (*toker).match(&t,TOK_COMMA);
	if(bret==TRUE){ strcat(listing,t.text); }
	else{ return; }
					
	bret = (*toker).match(&t,TOK_INT_REG);
	if(bret==TRUE)
	{
		strcat(listing,t.text);
		encoded[2]=(U1)t.val;
	}
	else{ return; }
	
	bret = (*toker).match(&t,TOK_COMMA);
	if(bret==TRUE){ strcat(listing,t.text); }
	else{ return; }

	bret = (*toker).match(&t,TOK_INT_REG);
	if(bret==TRUE)
	{
		strcat(listing,t.text);
		encoded[3]=(U1)t.val;
	}
	else{ return; }

	bret = (*toker).match(&t,TOK_NO_MORE);
	if(bret!=TRUE){ return; }

	commitToFiles(nBYTES);

	bytePosPass2 = bytePosPass2 + nBYTES;
	return;

}/*end I3R*/

/*------------------------------------------------------------------*/

void Pass2::I4R(U1 opcode, struct Token *tptr) /* Instruction 4Integer Registers */
{
	struct Token t;
	U1 bret;
	U1 nBYTES;
	nBYTES = 5;

	sprintf(lineNumber,"%lu",(*tptr).line);

	strcpy(listing,(*tptr).text);
	strcat(listing," ");
	encoded[0]=opcode;

	bret = (*toker).match(&t,TOK_INT_REG);
	if(bret==TRUE)
	{
		strcat(listing,t.text);
		encoded[1]=(U1)t.val;
	}
	else{ return; }
					
	bret = (*toker).match(&t,TOK_COMMA);
	if(bret==TRUE){ strcat(listing,t.text); }
	else{ return; }
					
	bret = (*toker).match(&t,TOK_INT_REG);
	if(bret==TRUE)
	{
		strcat(listing,t.text);
		encoded[2]=(U1)t.val;
	}
	else{ return; }
	
	bret = (*toker).match(&t,TOK_COMMA);
	if(bret==TRUE){ strcat(listing,t.text); }
	else{ return; }

	bret = (*toker).match(&t,TOK_INT_REG);
	if(bret==TRUE)
	{
		strcat(listing,t.text);
		encoded[3]=(U1)t.val;
	}
	else{ return; }

	bret = (*toker).match(&t,TOK_COMMA);
	if(bret==TRUE){ strcat(listing,t.text); }
	else{ return; }

	bret = (*toker).match(&t,TOK_INT_REG);
	if(bret==TRUE)
	{
		strcat(listing,t.text);
		encoded[4]=(U1)t.val;
	}
	else{ return; }

	bret = (*toker).match(&t,TOK_NO_MORE);
	if(bret!=TRUE){ return; }

	commitToFiles(nBYTES);

	bytePosPass2 = bytePosPass2 + nBYTES;
	return;
	
}/*end I4R*/

/*-----------------------------------------------------------------*/

void Pass2::IFC(U1 opcode, struct Token *tptr)
{
	struct Token t;
	U1 bret;
	U1 nBYTES;
	nBYTES = 6; /* float = 4 bytes */

	sprintf(lineNumber,"%lu",(*tptr).line);

	strcpy(listing,(*tptr).text);
	strcat(listing," ");
	encoded[0]=opcode;

	bret = (*toker).match(&t,TOK_FLT_REG);
	if(bret==TRUE)
	{
		strcat(listing,t.text);
		encoded[1]=(U1)t.val;
	}
	else{ return; }

	bret = (*toker).match(&t,TOK_COMMA);
	if(bret==TRUE){ strcat(listing,t.text); }
	else{ return; }

	t = (*toker).getNextLineToken();
	if(t.type==TOK_FLT_CONST)
	{
		strcat(listing,t.text);
		floatToBytecode((F4)t.fval, &encoded[2]); 
	}
	else
	{ 
		ERROR2("IFC(): line %lu, expecting float constant %s\n",t.line,t.text);
		return; 
	}

	bret = (*toker).match(&t,TOK_NO_MORE);
	if(bret!=TRUE){ return; }

	commitToFiles(nBYTES);

	bytePosPass2 = bytePosPass2 + nBYTES;
	return;
	
}/*end IFC*/

/*-----------------------------------------------------------------*/

void Pass2::IFR(U1 opcode, struct Token *tptr)
{
	struct Token t;
	U1 bret;
	U1 nBYTES;
	nBYTES = 3;

	sprintf(lineNumber,"%lu",(*tptr).line);

	strcpy(listing,(*tptr).text);
	strcat(listing," ");
	encoded[0]=opcode;

	bret = (*toker).match(&t,TOK_FLT_REG);
	if(bret==TRUE)
	{
		strcat(listing,t.text);
		encoded[1]=(U1)t.val;
	}
	else{ return; }
					
	bret = (*toker).match(&t,TOK_COMMA);
	if(bret==TRUE){ strcat(listing,t.text); }
	else{ return; }
					
	bret = (*toker).match(&t,TOK_INT_REG);
	if(bret==TRUE)
	{
		strcat(listing,t.text);
		encoded[2]=(U1)t.val;
	}
	else{ return; }

	bret = (*toker).match(&t,TOK_NO_MORE);
	if(bret!=TRUE){ return; }

	commitToFiles(nBYTES);

	bytePosPass2 = bytePosPass2 + nBYTES;
	return;
	
}/*end IFR*/

/*-----------------------------------------------------------------*/

void Pass2::IF(U1 opcode, struct Token *tptr)
{
	struct Token t;
	U1 bret;
	U1 nBYTES;
	nBYTES = 2;

	sprintf(lineNumber,"%lu",(*tptr).line);

	strcpy(listing,(*tptr).text);
	strcat(listing," ");
	encoded[0]=opcode;

	bret = (*toker).match(&t,TOK_FLT_REG);
	if(bret==TRUE)
	{
		strcat(listing,t.text);
		encoded[1]=(U1)t.val;
	}
	else{ return; }

	bret = (*toker).match(&t,TOK_NO_MORE);
	if(bret!=TRUE){ return; }

	commitToFiles(nBYTES);

	bytePosPass2 = bytePosPass2 + nBYTES;
	return;

}/*end IF*/

/*-----------------------------------------------------------------*/

void Pass2::I2F(U1 opcode, struct Token *tptr)
{
	struct Token t;
	U1 bret;
	U1 nBYTES;
	nBYTES = 3;

	sprintf(lineNumber,"%lu",(*tptr).line);

	strcpy(listing,(*tptr).text);
	strcat(listing," ");
	encoded[0]=opcode;

	bret = (*toker).match(&t,TOK_FLT_REG);
	if(bret==TRUE)
	{
		strcat(listing,t.text);
		encoded[1]=(U1)t.val;
	}
	else{ return; }
					
	bret = (*toker).match(&t,TOK_COMMA);
	if(bret==TRUE){ strcat(listing,t.text); }
	else{ return; }
					
	bret = (*toker).match(&t,TOK_FLT_REG);
	if(bret==TRUE)
	{
		strcat(listing,t.text);
		encoded[2]=(U1)t.val;
	}
	else{ return; }

	bret = (*toker).match(&t,TOK_NO_MORE);
	if(bret!=TRUE){ return; }

	commitToFiles(nBYTES);

	bytePosPass2 = bytePosPass2 + nBYTES;
	return;

}/*end I2F*/

/*-----------------------------------------------------------------*/

void Pass2::I3F(U1 opcode, struct Token *tptr)
{
	struct Token t;
	U1 bret;
	U1 nBYTES;
	nBYTES = 4;

	sprintf(lineNumber,"%lu",(*tptr).line);

	strcpy(listing,(*tptr).text);
	strcat(listing," ");
	encoded[0]=opcode;

	bret = (*toker).match(&t,TOK_FLT_REG);
	if(bret==TRUE)
	{
		strcat(listing,t.text);
		encoded[1]=(U1)t.val;
	}
	else{ return; }
					
	bret = (*toker).match(&t,TOK_COMMA);
	if(bret==TRUE){ strcat(listing,t.text); }
	else{ return; }
					
	bret = (*toker).match(&t,TOK_FLT_REG);
	if(bret==TRUE)
	{
		strcat(listing,t.text);
		encoded[2]=(U1)t.val;
	}
	else{ return; }
	
	bret = (*toker).match(&t,TOK_COMMA);
	if(bret==TRUE){ strcat(listing,t.text); }
	else{ return; }

	bret = (*toker).match(&t,TOK_FLT_REG);
	if(bret==TRUE)
	{
		strcat(listing,t.text);
		encoded[3]=(U1)t.val;
	}
	else{ return; }

	bret = (*toker).match(&t,TOK_NO_MORE);
	if(bret!=TRUE){ return; }

	commitToFiles(nBYTES);

	bytePosPass2 = bytePosPass2 + nBYTES;
	return;

}/*end I3F*/

/*-----------------------------------------------------------------*/

void Pass2::IRF(U1 opcode, struct Token *tptr)
{
	struct Token t;
	U1 bret;
	U1 nBYTES;
	nBYTES = 3;

	sprintf(lineNumber,"%lu",(*tptr).line);

	strcpy(listing,(*tptr).text);
	strcat(listing," ");
	encoded[0]=opcode;

	bret = (*toker).match(&t,TOK_INT_REG);
	if(bret==TRUE)
	{
		strcat(listing,t.text);
		encoded[1]=(U1)t.val;
	}
	else{ return; }
					
	bret = (*toker).match(&t,TOK_COMMA);
	if(bret==TRUE){ strcat(listing,t.text); }
	else{ return; }
	
	bret = (*toker).match(&t,TOK_FLT_REG);
	if(bret==TRUE)
	{
		strcat(listing,t.text);
		encoded[2]=(U1)t.val;
	}
	else{ return; }

	bret = (*toker).match(&t,TOK_NO_MORE);
	if(bret!=TRUE){ return; }

	commitToFiles(nBYTES);

	bytePosPass2 = bytePosPass2 + nBYTES;
	return;

}/*end IRF*/

/*-----------------------------------------------------------------*/

void Pass2::IDF(U1 opcode, struct Token *tptr)
{
	struct Token t;
	U1 bret;
	U1 nBYTES;
	nBYTES = 3;

	sprintf(lineNumber,"%lu",(*tptr).line);

	strcpy(listing,(*tptr).text);
	strcat(listing," ");
	encoded[0]=opcode;

	bret = (*toker).match(&t,TOK_DBL_REG);
	if(bret==TRUE)
	{
		strcat(listing,t.text);
		encoded[1]=(U1)t.val;
	}
	else{ return; }
					
	bret = (*toker).match(&t,TOK_COMMA);
	if(bret==TRUE){ strcat(listing,t.text); }
	else{ return; }
					
	bret = (*toker).match(&t,TOK_FLT_REG);
	if(bret==TRUE)
	{
		strcat(listing,t.text);
		encoded[2]=(U1)t.val;
	}
	else{ return; }

	bret = (*toker).match(&t,TOK_NO_MORE);
	if(bret!=TRUE){ return; }

	commitToFiles(nBYTES);

	bytePosPass2 = bytePosPass2 + nBYTES;
	return;
	
}/*end IDF*/

/*-----------------------------------------------------------------*/

void Pass2::IDC(U1 opcode, struct Token *tptr)
{
	struct Token t;
	U1 bret;
	U1 nBYTES;
	nBYTES = 10; /* double = 8 bytes */

	sprintf(lineNumber,"%lu",(*tptr).line);

	strcpy(listing,(*tptr).text);
	strcat(listing," ");
	encoded[0]=opcode;

	bret = (*toker).match(&t,TOK_DBL_REG);
	if(bret==TRUE)
	{
		strcat(listing,t.text);
		encoded[1]=(U1)t.val;
	}
	else{ return; }

	bret = (*toker).match(&t,TOK_COMMA);
	if(bret==TRUE){ strcat(listing,t.text); }
	else{ return; }

	t = (*toker).getNextLineToken();
	if(t.type==TOK_FLT_CONST)
	{
		strcat(listing,t.text);
		doubleToBytecode(t.fval, &encoded[2]); 
	}
	else
	{
		ERROR2("IDC(): line %lu, expecting double constant %s\n",t.line,t.text);
		return; 
	}

	bret = (*toker).match(&t,TOK_NO_MORE);
	if(bret!=TRUE){ return; }

	commitToFiles(nBYTES);

	bytePosPass2 = bytePosPass2 + nBYTES;
	return;

}/*end IDC*/

/*-----------------------------------------------------------------*/

void Pass2::IDR(U1 opcode, struct Token *tptr)
{
	struct Token t;
	U1 bret;
	U1 nBYTES;
	nBYTES = 3;

	sprintf(lineNumber,"%lu",(*tptr).line);

	strcpy(listing,(*tptr).text);
	strcat(listing," ");
	encoded[0]=opcode;

	bret = (*toker).match(&t,TOK_DBL_REG);

⌨️ 快捷键说明

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