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

📄 simulator.cpp

📁 类似vc的集成开发环境
💻 CPP
📖 第 1 页 / 共 3 页
字号:
					cpu.memony[cpu.rsp-1]=1;
				cpu.rsp--;
			}
			break;
		case 8:

			//两个数比较相等操作,程序设计为如果第一个数等于
			//第二个数则比较结果为1,否则为0
			//操作后两个操作数退栈,结果压栈

			if(i.l==0)
			{
				if(cpu.memony[cpu.rsp-1]==cpu.memony[cpu.rsp])
					cpu.memony[cpu.rsp-1]=1;
				else
					cpu.memony[cpu.rsp-1]=0;
				
				cpu.rsp--;
			}
			else
			{
				if((cpu.memony[cpu.rsp-2]==cpu.memony[cpu.rsp])&&(cpu.memony[cpu.rsp-3]==cpu.memony[cpu.rsp-1]))
					cpu.memony[cpu.rsp-3]=1;
				else
					cpu.memony[cpu.rsp-3]=0;
				cpu.rsp-=3;
			}

			break;
		case 9:

			//两个数比较不等操作,程序设计为如果第一个数等于
			//第二个数则比较结果为0,否则为1
			//操作后两个操作数退栈,结果压栈

			if(i.l==0)
			{
				if(cpu.memony[cpu.rsp-1]==cpu.memony[cpu.rsp])
				{
					cpu.memony[cpu.rsp-1]=0;
				}
				else
				{
					cpu.memony[cpu.rsp-1]=1;
				}
				cpu.rsp--;
			}
			else
			{
				if((cpu.memony[cpu.rsp-2]==cpu.memony[cpu.rsp])&&(cpu.memony[cpu.rsp-3]==cpu.memony[cpu.rsp-1]))
					cpu.memony[cpu.rsp-3]=0;
				else
					cpu.memony[cpu.rsp-3]=1;
				cpu.rsp-=3;
			}

			break;
		case 10:

			//两个数比较小于操作,程序设计为如果第一个数小于
			//第二个数则比较结果为1,否则为0
			//操作后两个操作数退栈,结果压栈

			
			switch(i.l)
			{
			case 0://int <int
				if(cpu.memony[cpu.rsp-1]<cpu.memony[cpu.rsp]) 
				{
					cpu.memony[cpu.rsp-1]=1;
				}
				else
				{
					cpu.memony[cpu.rsp-1]=0;
				}
				cpu.rsp--;
				break;
			case 1: //long <long
				if(cpu.memony[cpu.rsp-3]<cpu.memony[cpu.rsp-1])  //高位<
				{
					cpu.memony[cpu.rsp-3]=1;
				}
				else
					if(cpu.memony[cpu.rsp-3]==cpu.memony[cpu.rsp-1])//高位=
					{
						if(cpu.memony[cpu.rsp-2]<cpu.memony[cpu.rsp])
							cpu.memony[cpu.rsp-3]=1;
						else
							cpu.memony[cpu.rsp-3]=0;
					}
					else //高位>
					{
						cpu.memony[cpu.rsp-3]=0;
					}
				cpu.rsp-=3;
				break;
			case 2:  //long<int (num)?
				if(cpu.memony[cpu.rsp-2]>0)  //高位<
				{
					cpu.memony[cpu.rsp-2]=0;
				}
				else
				{
					if(cpu.memony[cpu.rsp-2]==0)//高位=
					{
						if(cpu.memony[cpu.rsp-1]<cpu.memony[cpu.rsp])
							cpu.memony[cpu.rsp-2]=1;
						else
							cpu.memony[cpu.rsp-2]=0;
					}

				}
				cpu.rsp-=2;
				break;


			}

			break;
		case 11:

			//两个数比较小于等于操作,程序设计为如果第一个数大于
			//第二个数则比较结果为0,否则为1
			//操作后两个操作数退栈,结果压栈

			if(i.l==0)
			{
				if(cpu.memony[cpu.rsp-1]>cpu.memony[cpu.rsp])
				{
					cpu.memony[cpu.rsp-1]=0;
				}
				else
				{
					cpu.memony[cpu.rsp-1]=1;
				}
				cpu.rsp--;
			}
			else
			{
				if(cpu.memony[cpu.rsp-3]>cpu.memony[cpu.rsp-1])
				{
					cpu.memony[cpu.rsp-3]=0;
				}
				else
					if(cpu.memony[cpu.rsp-3]==cpu.memony[cpu.rsp-1])
					{
						if(cpu.memony[cpu.rsp-2]>cpu.memony[cpu.rsp])
							cpu.memony[cpu.rsp-3]=0;
						else
							cpu.memony[cpu.rsp-3]=1;
					}
					else
					{
						cpu.memony[cpu.rsp-3]=1;
					}
				cpu.rsp-=3;

			}
			break;
		case 12:
			
			//两个数比较大于等于操作,程序设计为如果第一个数大于
			//第二个数则比较结果为1,否则为0
			//操作后两个操作数退栈,结果压栈

			if(i.l==0)
			{
				if(cpu.memony[cpu.rsp-1]>cpu.memony[cpu.rsp])
				{
					cpu.memony[cpu.rsp-1]=1;
				}
				else
				{
					cpu.memony[cpu.rsp-1]=0;
				}
				cpu.rsp--;
			}
			else
			{
				if(cpu.memony[cpu.rsp-3]>cpu.memony[cpu.rsp-1])
				{
					cpu.memony[cpu.rsp-3]=1;
				}
				else
					if(cpu.memony[cpu.rsp-3]==cpu.memony[cpu.rsp-1])
					{
						if(cpu.memony[cpu.rsp-2]>cpu.memony[cpu.rsp])
							cpu.memony[cpu.rsp-3]=1;
						else
							cpu.memony[cpu.rsp-3]=0;
					}
					else
					{
						cpu.memony[cpu.rsp-3]=0;
					}
				cpu.rsp-=3;
			}
			break;
		case 13:
			
			//两个数比较大于等于操作,程序设计为如果第一个数小于
			//第二个数则比较结果为0,否则为1
			//操作后两个操作数退栈,结果压栈

			if(i.l==0)
			{
				if(cpu.memony[cpu.rsp-1]<cpu.memony[cpu.rsp])
				{
					cpu.memony[cpu.rsp-1]=0;
				}
				else
				{
					cpu.memony[cpu.rsp-1]=1;
				}
				cpu.rsp--;
			}
			else
			{
				if(cpu.memony[cpu.rsp-3]<cpu.memony[cpu.rsp-1])
				{
					cpu.memony[cpu.rsp-3]=0;
				}
				else
					if(cpu.memony[cpu.rsp-3]==cpu.memony[cpu.rsp-1])
					{
						if(cpu.memony[cpu.rsp-2]<cpu.memony[cpu.rsp])
							cpu.memony[cpu.rsp-3]=0;
						else
							cpu.memony[cpu.rsp-3]=1;
					}
					else
					{
						cpu.memony[cpu.rsp-3]=1;
					}
				cpu.rsp-=3;

			}
			break;
		case 14:

			//次栈顶和栈顶两个布尔值做与操作
			//操作后两个操作数退栈,结果压栈

			cpu.memony[cpu.rsp-1]*=cpu.memony[cpu.rsp];

			break;
		case 15:        //
			cpu.memony[cpu.rsp-1]+=cpu.memony[cpu.rsp];
			break;
		}

		pc++;

		break;
	}
	return 1;
}

int simulator::get_instruction()  //从文件中读取指令
{
	char buf[30];
	int i,line_len=0;
	int j,k=0;

	while(!FileInstruction.eof())
	{
		i=0;
		line_len=0;

		FileInstruction.get(buf,30);
		FileInstruction.get();
		line_len=strlen(buf);

		if(line_len>5)
		{
			buf[line_len]='\n';

			while(buf[i]!=' ')
				i++;
			while(buf[i]==' ')
				i++;

			code[k].sourceline=0;
			while(buf[i]!=' ')
			{
				code[k].sourceline=10*code[k].sourceline+(int)buf[i]-'0';
				i++;
			}
			code[k].sourceline=code[k].sourceline-1;
			i++;

			while(buf[i]==' ')
				i++;
			j=0;
			code[k].operation=new char[10];
			while(buf[i]!=' ')
			{
				code[k].operation[j]=buf[i];
				j++;
				i++;
			}
			code[k].operation[j]=0;
	
			while(buf[i]==' ')
				i++;
			code[k].l=0;
			while(buf[i]!=' ')
			{
				code[k].l=10*code[k].l+(int)buf[i]-'0';
				i++;
			}
	
			while(buf[i]==' ')
				i++;
			code[k].a=0;
			while(buf[i]!='\n')
			{
				code[k].a=10*code[k].a+(int)buf[i]-'0';
				i++;
			}
//			cout<<code[k].sourceline<<code[k].operation<<endl;

			k++;
		}
				
	}
	cx=k;

	return 1;
}

void simulator::Dsg(int i)//调试程序接口
{
	char *name;
	int VarAddr;
//	get_instruction();
//	get_varinfor();

   int n;
//	while(pc!=-1)
//	{
//		cout<<"\n1:setbreakpoint  2:removebreakpoint"<<endl;
//		cout<<"3:stepone        4:gobreakpoint"<<endl;
//		cout<<"5:memony value    6:pc"<<endl;
//		cout<<"7:inquire varible    8:inquire register Value"<<endl;
//		cin>>m;
		switch(i)
		{
		case 1:
//			cout<<"enter setbreakpoint line:"<<endl;
//			cin>>n;
//			SetBreakpoint(n);
			runtocursor();
			break;
		case 2:
			cout<<"enter removebreakpoint line:"<<endl;
			cin>>n;
			RemoveBreakpoint(n);
			break;
		case 3:
			StepInto();
			break;
		case 4:
			GoBreakpoint();
			break;
		case 5:
			cout<<"enter memony address:"<<endl;
			cin>>n;
			cout<<"value:"<<cpu.memony[n]<<endl;
			break;
		case 6:
			cout<<"pc:"<<pc<<endl;
			break;
		case 7:
			cout<<"enter var name:"<<endl;
			name=new char[15];
			cin>>name;
			
			VarAddr=inquire(name);
			if(InquireVarType==0)
			{
				cout<<"var "<<name<<" not exist"<<endl;
			}
			else
				if(InquireVarType==1)
				{
					cout<<"var "<<name<<" value is  "<<cpu.memony[VarAddr]<<endl;
				}
				else
				{
					cout<<"var "<<name<<" value is  "<<cpu.memony[VarAddr-1]<<cpu.memony[VarAddr]<<endl;
				}

			delete name;
				
			break;
		case 8:			
			cout<<"enter Register name:"<<endl;
			name=new char[10];
			cin>>name;
			
			int RegisterValue=InquireRegister(name);
			if(RegisterValue==-10)
				cout<<"Register is not exist"<<endl;
			else
				cout<<name<<"="<<RegisterValue<<endl;
			delete name;
			
			break;

		}
	
//	}
	

}

int simulator::getopr(char *opr)     
//**返回操作码的编号
{
	int k=0;

	while((strcmp(opr,operation[k])!=0)&&k<OPRNUM)
		k++;
		
		
	return k;

}


void simulator::runtocursor()
{
	CMDIFrameWnd *nowframe = (CMDIFrameWnd*)AfxGetApp()->m_pMainWnd;
	//活动子窗口指针
	CMDIChildWnd *nowchild = nowframe->MDIGetActive();
	//获得当前活动视图
	CCrystalTextView* m_pexpandview=NULL;	
	m_pexpandview=(CCrystalTextView*)nowchild->GetActiveView();

	if(m_pexpandview==NULL)
		return;
	CPoint pcursor,pselend;
	pcursor=m_pexpandview->GetCursorPos();


		while((pc!=-1)&&((code[pc].sourceline)<(pcursor.y))) 
		{


			StepOne();

			if((pc==-1)&&(i_pcpre>=(cx-1)))
			{
				
				pselend.y=code[i_pcpre].sourceline;
				pselend.x=0;
				m_pexpandview->SetCursorPos(pselend);
				//编辑控件光标所在行 
				m_pexpandview->OnToggleBookmark(0);
				return;

			}
	

//		int i_curpc;
//	if (pc=-1)
//		i_curpc=i_pcpre;
//	else
//		i_curpc=pc;

				if(	pc!=-1)
		{
	pselend.y=code[pc+1].sourceline;
	pselend.x=0;
    m_pexpandview->SetCursorPos(pselend);
	 //编辑控件光标所在行 
	m_pexpandview->OnToggleBookmark(0);
	prunlinepre=pselend;
//	if(in(code[pc].sourceline)==2)
//		return;

				}
		}


}

void simulator::GoBreakpoint()

//**该函数的主要功能是使正处于模拟执行的程序执行到下一断点,
//**如果程序执行流程中没有遇到断点,程序就会模拟执行到结束

{

	CMDIFrameWnd *nowframe = (CMDIFrameWnd*)AfxGetApp()->m_pMainWnd;
	//活动子窗口指针
	CMDIChildWnd *nowchild = nowframe->MDIGetActive();
	//获得当前活动视图
	CCrystalTextView* m_pexpandview=NULL;	
	m_pexpandview=(CCrystalTextView*)nowchild->GetActiveView();

	if(m_pexpandview==NULL)
		return;
	CPoint pselend;
	int i_curpc=0;
	if(pc!=-1)
	{

		do
		{
		/*	FileList *m_pfile;
			m_pfile=new FileList;
			m_mappro.Lookup(nowchild->GetSafeHwnd(),(void *&)m_pfile);

			struct CompStruct *m_pcomstr=NULL;
	        m_pcomstr=new CompStruct;
			
			int i_sumbreak=m_pfile->compileinfstru.GetSize();
			int i_isvalidbreak=0;
			int j=0;
			m_pcomstr=(CompStruct *)m_pfile->compileinfstru.GetAt(j);
			while((i_isvalidbreak=0)&&( j<i_sumbreak))
			{
			   while(( j<i_sumbreak)&&(m_pcomstr->n_breakline<=pc))
			   {
			 	j++;
				m_pcomstr=(CompStruct *)m_pfile->compileinfstru.GetAt(j);
				if(m_pcomstr->n_breakline==pc)
				i_isvalidbreak=1;
			   }

			    if((i_isvalidbreak==0)&&( j<i_sumbreak))
				  pc++;

				if(j>=i_sumbreak)
					return;
				if((i_isvalidbreak==1)&&( j<i_sumbreak))
				  break;

			}
*/




			StepOne();

		
	/*		m_mappro.Lookup(nowchild->GetSafeHwnd(),(void *&)m_pfile);


			 i_sumbreak=m_pfile->compileinfstru.GetSize();
			 i_isvalidbreak=0;
			 j=0;
			m_pcomstr=(CompStruct *)m_pfile->compileinfstru.GetAt(j);
			while((i_isvalidbreak=0)&&( j<i_sumbreak))
			{
			   while(( j<i_sumbreak)&&(m_pcomstr->n_breakline<=pc))
			   {
			 	j++;
				m_pcomstr=(CompStruct *)m_pfile->compileinfstru.GetAt(j);
				if(m_pcomstr->n_breakline==pc)
				i_isvalidbreak=1;
			   }

			    if((i_isvalidbreak==0)&&( j<i_sumbreak))
				  pc++;

				if(j>=i_sumbreak)
					return;
				if((i_isvalidbreak==1)&&( j<i_sumbreak))
				  break;

			}


			if((pc==-1)&&(i_pcpre>=(cx-1)))
			{
				
				pselend.y=code[i_pcpre].sourceline;
				pselend.x=0;
				m_pexpandview->SetCursorPos(pselend);
				//编辑控件光标所在行 
				m_pexpandview->OnToggleBookmark(0);
				return;

			}
		
	
	*/	


			/*struct Breakpoint *p1;
			p1=BreakpointList->next
			while(p1!=NULL)
			{
//				if(p1->value==n)
//				return 1;
				p1=p1->next;
			}*/
	
/*	
	if (pc=-1)
		i_curpc=i_pcpre;
	else
		i_curpc==pc;
*/
		if(	pc!=-1)
		{

			pselend.y=code[pc].sourceline;
			pselend.x=0;
			m_pexpandview->SetCursorPos(pselend);
			//编辑控件光标所在行 
			m_pexpandview->OnToggleBookmark(0);

⌨️ 快捷键说明

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