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

📄 pass1.cpp

📁 一个虚拟机的源码(win32)版本
💻 CPP
📖 第 1 页 / 共 2 页
字号:
		{
			ERROR1("Pass1::processPDirective(): line %lu, bad directive\n",(*tptr).line);
			return;

		}
		
		offset = (S4)t.val;

		bret = (*ptr).match(&t,TOK_NO_MORE);
		if(bret!=TRUE)
		{ 
			ERROR1("Pass1::processPDirective(): line %lu, bad directive\n",(*tptr).line);
			return; 
		}
				
		PASS1_DEBUG0("processPDirective(): adding .PA to symbol table\n");

		hptr =  (*hashTbl).queryHashTbl(name);
		if(hptr!=NULL)
		{
			ERROR2("processPDirective(): line %d, %s re-defined\n",line,name);
			return;
		}
						
		struct StackFrame sf;
		sf.text = (*strTbl).iStr;
		sf.fpOffset = offset;
		sf.line = line;
		(*strTbl).addStrTbl(name);
		(*symTbl).addProcArgHL(&sf);
		(*hashTbl).addHashTblEntry(name,
			                       sf.text,
								   PROC_ARG,
								   ((*symTbl).iProc-1),
								   (((*symTbl).proc[(*symTbl).iProc-1]).iArg-1),
								   line);
		
	}/*end .PA*/
	else if(strcmp((*tptr).text,".PV")==0)	/*.PV identifier -n*/
	{
		char name[ID_SIZE];
		S4 offset;
		U4 line;
		struct HashTbl *hptr;

		line = (*tptr).line;

		bret = (*ptr).match(&t,TOK_IDENTIFIER);
		if(bret!=TRUE)
		{
			ERROR1("Pass1::processPDirective(): line %lu, bad directive\n",(*tptr).line);
			return;

		}
			
		strcpy(name,t.text);

		bret = (*ptr).match(&t,TOK_INT_CONST);
		if(bret!=TRUE)
		{
			ERROR1("Pass1::processPDirective(): line %lu, bad directive\n",(*tptr).line);
			return;

		}

		offset = (S4)t.val;

		bret = (*ptr).match(&t,TOK_NO_MORE);
		if(bret!=TRUE)
		{
			ERROR1("Pass1::processPDirective(): line %lu, bad directive\n",(*tptr).line);
			return;

		}
		
		PASS1_DEBUG0("processPDirective(): adding .PV to symbol table\n");

		hptr =  (*hashTbl).queryHashTbl(name);
		if(hptr!=NULL)
		{
			ERROR2("processPDirective(): line %d, %s re-defined\n",line,name);
			return;
		}
		
		struct StackFrame sf;
		sf.text = (*strTbl).iStr;
		sf.fpOffset = (S4)offset;
		sf.line = line;
		(*strTbl).addStrTbl(name);
		(*symTbl).addProcLocHL(&sf);
		(*hashTbl).addHashTblEntry(name,
			            sf.text,
						PROC_LOC,
						((*symTbl).iProc-1),
						(((*symTbl).proc[(*symTbl).iProc-1]).iLocal-1),
						line);

	}/*end .PV*/
	else if(strcmp((*tptr).text,".PL")==0)	/*.PL identifier*/
	{
		char name[ID_SIZE];
		U8 address;
		U4 line;
		struct HashTbl *hptr;
		
		line = (*tptr).line;
		bret = (*ptr).match(&t,TOK_IDENTIFIER);
		if(bret!=TRUE)
		{
			ERROR1("Pass1::processPDirective(): line %lu, bad directive\n",(*tptr).line);
			return;

		}
		
		strcpy(name,t.text);
		address = bytePosPass1;

		bret = (*ptr).match(&t,TOK_NO_MORE);
		if(bret!=TRUE)
		{
			ERROR1("Pass1::processPDirective(): line %lu, bad directive\n",(*tptr).line);
			return;

		}
	
		PASS1_DEBUG0("processPDirective(): adding .PL to symbol table\n");

		hptr =  (*hashTbl).queryHashTbl(name);
		if(hptr!=NULL)
		{
			ERROR2("processPDirective(): line %d, %s re-defined\n",line,name);
			return;
		}
				
		struct Label lb;
		lb.text = (*strTbl).iStr;
		lb.address = address;
		lb.line = line;
		(*strTbl).addStrTbl(name);
		(*symTbl).addProcLblHL(&lb);
		(*hashTbl).addHashTblEntry(name,
			                       lb.text,
								   PROC_LBL,
								   ((*symTbl).iProc-1),
								   (((*symTbl).proc[(*symTbl).iProc-1]).iLabel-1),
								   line);

	}/*end .PL*/
	else if(strcmp((*tptr).text,".PE")==0)/*.PE*/
	{
		bret = (*ptr).match(&t,TOK_NO_MORE);
		if(bret==TRUE)
		{ 
			/*
			cannot define code outside of a procedure
			*/
			currentProcPass1 = OUTSIDE_PROC_PASS1;
		}
		else
		{ 
			ERROR1("Pass1::processPDirective(): line %lu, bad directive\n",(*tptr).line);
			return; 
		}

	}/*end .PE*/
	else
	{
		ERROR1("Pass1::processPDirective(): line %lu, bad directive\n",(*tptr).line);
	}
	return;

}/*end processPDirective*/

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

/*
Do not generate bytecode in first pass, but we need to know
	-offset of label directives
	-offset of procedures
Thus, we need to do minimal instruction processing to keep
track of bytesize via ->bytePos<- variable

use switch to help cut down on calls to strcmp()

can probably recycle basic skeleton and extend on this code for Pass2
*/

void  Pass1::processInstruction(struct Token *tptr)
{
	if((*tptr).type!=TOK_IDENTIFIER)
	{
		ERROR3("Pass1::processInstruction(): %s on line %lu type %s not a valid opcode\n",(*tptr).text,(*tptr).line,TokStr[(*tptr).type]);
		return;
	}
	
	switch((*tptr).text[0])
	{
		case 'A':
		{
			if(strcmp((*tptr).text,"ADD")==0){ bytePosPass1 = bytePosPass1 + 4;}
			else if(strcmp((*tptr).text,"AND")==0){ bytePosPass1 = bytePosPass1 + 4;}
			else
			{
				ERROR2("Pass1::processInstruction(): line %d, invalid opcode (%s)\n",(*tptr).line,(*tptr).text);
				return;
			}
		}break;
		case 'B':
		{
			if(strcmp((*tptr).text,"BS")==0){ bytePosPass1 = bytePosPass1 + 3;}
			else if(strcmp((*tptr).text,"BT")==0){ bytePosPass1 = bytePosPass1 + 4;}
			else
			{
				ERROR2("Pass1::processInstruction(): line %d, invalid opcode (%s)\n",(*tptr).line,(*tptr).text);
				return;
			}			
		}break;
		case 'C':
		{
			if(strcmp((*tptr).text,"CAST_IF")==0){ bytePosPass1 = bytePosPass1 + 3;}
			else if(strcmp((*tptr).text,"CAST_ID")==0){ bytePosPass1 = bytePosPass1 + 3;}
			else if(strcmp((*tptr).text,"CAST_FI")==0){ bytePosPass1 = bytePosPass1 + 3;}
			else if(strcmp((*tptr).text,"CAST_FD")==0){ bytePosPass1 = bytePosPass1 + 3;}
			else if(strcmp((*tptr).text,"CAST_DI")==0){ bytePosPass1 = bytePosPass1 + 3;}
			else if(strcmp((*tptr).text,"CAST_DF")==0){ bytePosPass1 = bytePosPass1 + 3;}
			else
			{
				ERROR2("Pass1::processInstruction(): line %d, invalid opcode (%s)\n",(*tptr).line,(*tptr).text);
				return;
			}
		}break;
		case 'D':
		{
			if(strcmp((*tptr).text,"DIV")==0){ bytePosPass1 = bytePosPass1 + 5;}
			else if(strcmp((*tptr).text,"DI")==0){ bytePosPass1 = bytePosPass1 + 1;}
			else if(strcmp((*tptr).text,"DADD")==0){ bytePosPass1 = bytePosPass1 + 4;}
			else if(strcmp((*tptr).text,"DSUB")==0){ bytePosPass1 = bytePosPass1 + 4;}
			else if(strcmp((*tptr).text,"DMULT")==0){ bytePosPass1 = bytePosPass1 + 4;}
			else if(strcmp((*tptr).text,"DDIV")==0){ bytePosPass1 = bytePosPass1 + 4;}
			else if(strcmp((*tptr).text,"DSLT")==0){ bytePosPass1 = bytePosPass1 + 4;}
			else
			{
				ERROR2("Pass1::processInstruction(): line %d, invalid opcode (%s)\n",(*tptr).line,(*tptr).text);
				return;
			}
		}break;
		case 'E':
		{
			if(strcmp((*tptr).text,"EI")==0){ bytePosPass1 = bytePosPass1 + 1;}
			else
			{
				ERROR2("Pass1::processInstruction(): line %d, invalid opcode (%s)\n",(*tptr).line,(*tptr).text);
				return;
			}
		}break;
		case 'F':
		{
			if(strcmp((*tptr).text,"FADD")==0){ bytePosPass1 = bytePosPass1 + 4;}
			else if(strcmp((*tptr).text,"FSUB")==0){ bytePosPass1 = bytePosPass1 + 4;}
			else if(strcmp((*tptr).text,"FMULT")==0){ bytePosPass1 = bytePosPass1 + 4;}
			else if(strcmp((*tptr).text,"FDIV")==0){ bytePosPass1 = bytePosPass1 + 4;}
			else if(strcmp((*tptr).text,"FSLT")==0){ bytePosPass1 = bytePosPass1 + 4;}
			else
			{
				ERROR2("Pass1::processInstruction(): line %d, invalid opcode (%s)\n",(*tptr).line,(*tptr).text);
				return;
			}
		}break;
		case 'H':
		{
			if(strcmp((*tptr).text,"HALT")==0){ bytePosPass1 = bytePosPass1 + 1;}
			else
			{
				ERROR2("Pass1::processInstruction(): line %d, invalid opcode (%s)\n",(*tptr).line,(*tptr).text);
				return;
			}
		}break;
		case 'I':
		{
			if(strcmp((*tptr).text,"INT")==0){ bytePosPass1 = bytePosPass1 + 2;}
			else
			{
				ERROR2("Pass1::processInstruction(): line %d, invalid opcode (%s)\n",(*tptr).line,(*tptr).text);
				return;
			}
		}break;
		case 'J':
		{
			if(strcmp((*tptr).text,"JMP")==0){ bytePosPass1 = bytePosPass1 + 2;}
			else if(strcmp((*tptr).text,"JE")==0){ bytePosPass1 = bytePosPass1 + 4;}
			else if(strcmp((*tptr).text,"JNE")==0){ bytePosPass1 = bytePosPass1 + 4;}
			else
			{
				ERROR2("Pass1::processInstruction(): line %d, invalid opcode (%s)\n",(*tptr).line,(*tptr).text);
				return;
			}
		}break;
		case 'L':
		{
			if(strcmp((*tptr).text,"LBI")==0){ bytePosPass1 = bytePosPass1 + 3;}
			else if(strcmp((*tptr).text,"LWI")==0){ bytePosPass1 = bytePosPass1 + 4;}
			else if(strcmp((*tptr).text,"LDI")==0){ bytePosPass1 = bytePosPass1 + 6;}
			else if(strcmp((*tptr).text,"LQI")==0){ bytePosPass1 = bytePosPass1 + 10;}
			else if(strcmp((*tptr).text,"LF1I")==0){ bytePosPass1 = bytePosPass1 + 6;}
			else if(strcmp((*tptr).text,"LF2I")==0){ bytePosPass1 = bytePosPass1 + 10;}
			else if(strcmp((*tptr).text,"LB")==0){ bytePosPass1 = bytePosPass1 + 3;}
			else if(strcmp((*tptr).text,"LW")==0){ bytePosPass1 = bytePosPass1 + 3;}
			else if(strcmp((*tptr).text,"LD")==0){ bytePosPass1 = bytePosPass1 + 3;}
			else if(strcmp((*tptr).text,"LQ")==0){ bytePosPass1 = bytePosPass1 + 3;}
			else if(strcmp((*tptr).text,"LF1")==0){ bytePosPass1 = bytePosPass1 + 3;}
			else if(strcmp((*tptr).text,"LF2")==0){ bytePosPass1 = bytePosPass1 + 3;}
			else if(strcmp((*tptr).text,"LAD")==0){ bytePosPass1 = bytePosPass1 + 10;}
			else if(strcmp((*tptr).text,"LAI")==0){ bytePosPass1 = bytePosPass1 + 11;}
			else
			{
				ERROR2("Pass1::processInstruction(): line %d, invalid opcode (%s)\n",(*tptr).line,(*tptr).text);
				return;
			}
		}break;
		case 'M':
		{
			if(strcmp((*tptr).text,"MOV")==0){ bytePosPass1 = bytePosPass1 + 3;}
			else if(strcmp((*tptr).text,"MOVF")==0){ bytePosPass1 = bytePosPass1 + 3;}
			else if(strcmp((*tptr).text,"MOVD")==0){ bytePosPass1 = bytePosPass1 + 3;}
			else if(strcmp((*tptr).text,"MULT")==0){ bytePosPass1 = bytePosPass1 + 4;}
			else
			{
				ERROR2("Pass1::processInstruction(): line %d, invalid opcode (%s)\n",(*tptr).line,(*tptr).text);
				return;				
			}
		}break;
		case 'N':
		{
			if(strcmp((*tptr).text,"NOT")==0){ bytePosPass1 = bytePosPass1 + 3;}
			else if(strcmp((*tptr).text,"NOP")==0){ bytePosPass1 = bytePosPass1 + 1;}
			else
			{
				ERROR2("Pass1::processInstruction(): line %d, invalid opcode (%s)\n",(*tptr).line,(*tptr).text);
				return;
			}
		}break;
		case 'O':
		{
			if(strcmp((*tptr).text,"OR")==0){ bytePosPass1 = bytePosPass1 + 4;}
			else
			{
				ERROR2("Pass1::processInstruction(): line %d, invalid opcode (%s)\n",(*tptr).line,(*tptr).text);
				return;
			}
		}break;
		case 'P':
		{
			if(strcmp((*tptr).text,"PUSHB")==0){ bytePosPass1 = bytePosPass1 + 2;}
			else if(strcmp((*tptr).text,"PUSHW")==0){ bytePosPass1 = bytePosPass1 + 2;}
			else if(strcmp((*tptr).text,"PUSHD")==0){ bytePosPass1 = bytePosPass1 + 2;}
			else if(strcmp((*tptr).text,"PUSHQ")==0){ bytePosPass1 = bytePosPass1 + 2;}
			else if(strcmp((*tptr).text,"PUSHF1")==0){ bytePosPass1 = bytePosPass1 + 2;}
			else if(strcmp((*tptr).text,"PUSHF2")==0){ bytePosPass1 = bytePosPass1 + 2;}
			else if(strcmp((*tptr).text,"POPB")==0){ bytePosPass1 = bytePosPass1 + 2;}
			else if(strcmp((*tptr).text,"POPW")==0){ bytePosPass1 = bytePosPass1 + 2;}
			else if(strcmp((*tptr).text,"POPD")==0){ bytePosPass1 = bytePosPass1 + 2;}
			else if(strcmp((*tptr).text,"POPQ")==0){ bytePosPass1 = bytePosPass1 + 2;}
			else if(strcmp((*tptr).text,"POPF1")==0){ bytePosPass1 = bytePosPass1 + 2;}
			else if(strcmp((*tptr).text,"POPF2")==0){ bytePosPass1 = bytePosPass1 + 2;}
			else
			{
				ERROR2("Pass1::processInstruction(): line %d, invalid opcode (%s)\n",(*tptr).line,(*tptr).text);
				return;
			}
		}break;
		case 'S':
		{
			if(strcmp((*tptr).text,"SB")==0){ bytePosPass1 = bytePosPass1 + 3;}
			else if(strcmp((*tptr).text,"SW")==0){ bytePosPass1 = bytePosPass1 + 3;}
			else if(strcmp((*tptr).text,"SD")==0){ bytePosPass1 = bytePosPass1 + 3;}
			else if(strcmp((*tptr).text,"SQ")==0){ bytePosPass1 = bytePosPass1 + 3;}
			else if(strcmp((*tptr).text,"SF1")==0){ bytePosPass1 = bytePosPass1 + 3;}
			else if(strcmp((*tptr).text,"SF2")==0){ bytePosPass1 = bytePosPass1 + 3;}
			else if(strcmp((*tptr).text,"SRA")==0){ bytePosPass1 = bytePosPass1 + 4;}
			else if(strcmp((*tptr).text,"SRL")==0){ bytePosPass1 = bytePosPass1 + 4;}
			else if(strcmp((*tptr).text,"SL")==0){ bytePosPass1 = bytePosPass1 + 4;}
			else if(strcmp((*tptr).text,"SUB")==0){ bytePosPass1 = bytePosPass1 + 4;}
			else if(strcmp((*tptr).text,"SLT")==0){ bytePosPass1 = bytePosPass1 + 4;}
			else
			{
				ERROR2("Pass1::processInstruction(): line %d, invalid opcode (%s)\n",(*tptr).line,(*tptr).text);
				return;
			}
		}break;
		case 'X':
		{
			if(strcmp((*tptr).text,"XOR")==0){ bytePosPass1 = bytePosPass1 + 4;}
			else
			{
				ERROR2("Pass1::processInstruction(): line %d, invalid opcode (%s)\n",(*tptr).line,(*tptr).text);
				return;
			}
		}break;
		default:
		{
			ERROR3("Pass1::processInstruction(): %s on line %lu type %s not a valid opcode\n",(*tptr).text,(*tptr).line,TokStr[(*tptr).type]);
			return;
		}
	}/*end switch*/

	return;

}/*end processInstruction*/

⌨️ 快捷键说明

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