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

📄 uasm.cpp

📁 模拟了tec2000的所有功能
💻 CPP
📖 第 1 页 / 共 5 页
字号:
	outfile1[length1-1]='s';outfile1[length1]='m';
	outfile1[length1+1]='\0';
	cout<<infile<<length1<<outfile<<outfile1<<endl;
	ifstream in_file(infile,ios::binary);//建立输入文件对象
	if(!in_file){return false;}
    ofstream out_file(outfile);        //建立输出文件对象
    if(!out_file){return false;}
	ofstream out_file1(outfile1);
	if(!out_file1){return false;}
    byte_t instr;
    get_addr_and_len(in_file);
	cout<<"cod文件长度为"<<length<<endl;
	address=addr;
	while(!in_file.eof())
	{
	
		if(j==0)
		{
			out_file<<'\n'<<hex<<setfill('0')<<setw(4)<<addr<<":   ";
			out_file1<<'\n'<<hex<<setfill('0')<<setw(4)<<addr<<":   ";
		}
		in_file.read((char*) &instr,sizeof(byte_t));
		if(int(instr)<0x10) out_file<<hex<<"0"<<(int)instr;
	    else out_file<<hex<<(int)instr;
		in_file.read((char*) &instr,sizeof(byte_t));
		if(int(instr)<0x10) out_file<<hex<<"0"<<(int)instr<<" ";
	    else out_file<<hex<<(int)instr<<" ";
		out_file1<<"#  ";
		j=(j+1)%8;
		addr++;
	}
	
	out_file.close();
	out_file1.close();
	in_file.close();
	in_file.open(infile,ios::binary);
	get_addr_and_len(in_file);
	sign=new int[length];
    signp=0;
	for(int i=0;i<length;i++)
		sign[i]=0;
	ahead=0;
	atail=0;
	a[ahead]=address;
//	sign[0]=1;
	int success=1;//跳转返回标志
	int k=0;//执行次数标志
	while(atail>=ahead)//队列空就结束
	{
		success=1;
		byte_t instr1;
		addr=a[ahead++];
	
		while(sign[addr-address]==1)
		{
			if(atail>=ahead)
				addr=a[ahead++];
			else {success=0;break;}
		}
		if(success==0)break;
		cout<<"当前地址"<<hex<<addr<< "首地址"<<hex<<address<< "标志位"<< sign[0]<<endl;
		
		cout<<"成功标志为"<<success<<endl;
        in_file.close();
	    in_file.open(infile,ios::binary);
		in_file.read((char*) &instr1,sizeof(byte_t));
		in_file.read((char*) &instr1,sizeof(byte_t));
		in_file.read((char*) &instr1,sizeof(byte_t));
		in_file.read((char*) &instr1,sizeof(byte_t));
		in_file.read((char*) &instr1,sizeof(byte_t));
		if(addr>address)
			for(int i=0;address+i<addr;i++)
			{
				in_file.read((char*) &instr1,sizeof(byte_t));
				in_file.read((char*) &instr1,sizeof(byte_t));
			}
	
		while(!in_file.eof())
		{
			in_file.read((char*) &instr1,sizeof(byte_t));//获得指令
			
		    
			cout<<"执行次数"<<++k<<endl;
			switch(instr1)
            {
				case 0x00:   //1基本单字无跳转指令
				case 0x01:
				case 0x02:
				case 0x03:
				case 0x04:
				case 0x05:
				case 0x06:
				case 0x07:
				case 0x08:
				case 0x09:
				case 0x0A:
				case 0x0B:
                case 0x81:
				case 0x82:
				case 0x83:
				case 0x84:
				case 0x85:
				case 0x86:
				case 0x87:
				case 0x8c:
				case 0x20:   //扩展单字无跳转指令
				case 0x21:
				case 0x2a:
				case 0x2b:
				case 0x2c:
				case 0x2d:
				case 0x6c:
				case 0x6d:
				case 0x6e:
				case 0x6f:


				    cout<<"单字无跳转指令"<<endl;
					in_file.read((char*) &instr1,sizeof(byte_t));
					sign[addr-address]=1;addr++;break;
				case 0x41:   //2单字无条件跳转


					cout<<"单字无条件跳转指令"<<endl;
					char offset;
					in_file.read((char*) &offset,sizeof(byte_t));
					sign[addr-address]=1;
					addr=addr+offset+1;
					cout<<"跳转地址为"<<addr<<endl;
					if(sign[addr-address]==1){success=3;break;}
					else
					{
						in_file.close();
	                    in_file.open(infile,ios::binary);
		                in_file.read((char*) &instr1,sizeof(byte_t));
		                in_file.read((char*) &instr1,sizeof(byte_t));
	                    in_file.read((char*) &instr1,sizeof(byte_t));
		                in_file.read((char*) &instr1,sizeof(byte_t));
		                in_file.read((char*) &instr1,sizeof(byte_t));
	                    if(addr>address)
		           	    for(int i=0;address+i<addr;i++)
						{
						   in_file.read((char*) &instr1,sizeof(byte_t));
				           in_file.read((char*) &instr1,sizeof(byte_t));
						}
					}
	                       
					break;
				case 0x44:
				case 0x45:
				case 0x46:
				case 0x47:  //3单字有条件跳转
				case 0x64:  //扩展
				case 0x65:


					cout<<"单字有条件跳转指令"<<endl;
					in_file.read((char*) &offset,sizeof(byte_t));
					sign[addr-address]=1;
					a[++atail]=addr+offset+1;				
					addr++;
					break;
				case 0x80:  //4双字无条件跳转
				

					cout<<"双字无条件跳转指令"<<endl;
					in_file.read((char*) &instr1,sizeof(byte_t));					
				    sign[addr-address]=1;
					addr++;sign[addr-address]=1;
					addr++;
				    word_t address1;
					address1=addr;
					byte_t head,tail;
					in_file.read((char *) &head,sizeof(byte_t));                    
					in_file.read((char *) &tail,sizeof(byte_t)); 					
					addr=(int)head*0x100+(int)tail;
					cout<<"地址:"<<hex<<addr<<address<<endl;					
					if(sign[addr-address]==1){success=3;break;}
					else					
					{
						in_file.close();
	                    in_file.open(infile,ios::binary);
		                in_file.read((char*) &instr1,sizeof(byte_t));
		                in_file.read((char*) &instr1,sizeof(byte_t));
	                    in_file.read((char*) &instr1,sizeof(byte_t));
		                in_file.read((char*) &instr1,sizeof(byte_t));
		                in_file.read((char*) &instr1,sizeof(byte_t));
	                    if(addr>address)
		           	    for(int i=0;address+i<addr;i++)
						{
						   in_file.read((char*) &instr1,sizeof(byte_t));
				           in_file.read((char*) &instr1,sizeof(byte_t));
						}
					}            
					break;
				case 0xce:  //调用子程序指令


					cout<<"调用子程序指令"<<endl;
					in_file.read((char*) &instr1,sizeof(byte_t));					
				    sign[addr-address]=1;
					addr++;sign[addr-address]=1;
					addr++;
				    //word_t address1;					
					//byte head,tail;
					in_file.read((char *) &head,sizeof(byte_t));                    
					in_file.read((char *) &tail,sizeof(byte_t)); 					
					a[++atail]=(int)head*0x100+(int)tail;
					//cout<<"地址:"<<hex<<addr<<address<<endl;
					break;

				case 0x88://5双字无跳转指令
				case 0xe4:
				case 0xe5:
				case 0xe6:
				case 0xe7:


					cout<<"双字无跳转指令"<<endl;
					in_file.read((char*) &instr1,sizeof(byte_t));
					in_file.read((char*) &instr1,sizeof(byte_t));
					in_file.read((char*) &instr1,sizeof(byte_t));
					sign[addr-address]=1;addr++;
					sign[addr-address]=1;addr++;
					cout<<"地址是"<<addr<<endl;
					break;
				case 0x8f:
				case 0xef://6程序段结束指令
					
					cout<<"结束指令   "<<"当前地址为"<<addr<<"程序结束return"<<endl;
					
					sign[addr-address]=1;
					success=3;
					break;							
                default:sign[addr-address]=2;addr++;break;
			}				
			if(success!=1)break;
           // for( i=0;i<length;i++)	cout<<  sign[i]<<",";
		}
	}
	if(success==3)cout<<"程序载入完成"<<endl;
	for( i=0;i<length;i++)
		cout<<  sign[i]<<",";
	in_file.close();
	return true;

}
*/



bool CUasm::outcod(char *infile)
{
	char outfile[100];
	char outfile1[100];
	strcpy(outfile,infile);
	strcpy(outfile1,infile);
    int length1=strlen(infile);
	outfile[length1-3]='t';outfile[length1-2]='x';
	outfile[length1-1]='t';outfile[length1]='\0';
	outfile1[length1-4]='#';
	outfile1[length1-3]='.';outfile1[length1-2]='a';
	outfile1[length1-1]='s';outfile1[length1]='m';
	outfile1[length1+1]='\0';
	
	ifstream in_file(infile,ios::binary);//建立输入文件对象
	if(!in_file){return false;}
	in_file.close();
	in_file.open(infile,ios::binary);//建立输入文件对象
	if(!in_file){return false;}
    ofstream out_file(outfile);        //建立输出文件对象
    if(!out_file){return false;}
	ofstream out_file1(outfile1);
	if(!out_file1){return false;}
    byte_t instr;
    get_addr_and_len(in_file);
	sign=new int[length];
    signp=0;
	for(int i=0;i<length;i++)
		sign[i]=0;
	ahead=0;
	atail=0;
	
	j=0;
	while(!in_file.eof())
	{
	
		if(j==0)
		{
			out_file<<'\n'<<hex<<setfill('0')<<setw(4)<<addr<<":   ";
			out_file1<<'\n'<<hex<<setfill('0')<<setw(4)<<addr<<":   ";
		}
		in_file.read((char*) &instr,sizeof(byte_t));
		if(int(instr)<0x10) out_file<<hex<<"0"<<(int)instr;
	    else out_file<<hex<<(int)instr;
		in_file.read((char*) &instr,sizeof(byte_t));
		if(int(instr)<0x10) out_file<<hex<<"0"<<(int)instr<<" ";
	    else out_file<<hex<<(int)instr<<" ";
		out_file1<<"#  ";
		j=(j+1)%8;
		addr++;
	}
	in_file.close();
	out_file.close();
	out_file1.close();
	return true;

}

	//	CString temp1,temp2;
	//	temp1.Format("%04x",success);
	//	temp2.Format("%04x",ahead);
	//	temp1+="\r\n";
	//	temp1+=temp2;
	//	AfxMessageBox(temp1);


	void CUasm::exe(char * infile,word_t head)
{
	ifstream in_file(infile,ios::binary);//建立输入文件对象
	//if(!in_file){return false;}
	get_addr_and_len(in_file);
	address=addr;

	if(head>length+address)return;
	if(head>=address)addr=head;
	ahead=0;
	atail=0;
    a[ahead]=addr;

	int success=1;//跳转返回标志
	int k=0;//执行次数标志
	while(atail>=ahead)//队列空就结束
	{
		success=1;
		byte_t instr1;
		addr=a[ahead++];
	
		while(sign[addr-address]==1)
		{
			if(atail>=ahead)
				addr=a[ahead++];
			else {success=0;break;}
		}
		if(success==0)break;
	
        in_file.close();
	    in_file.open(infile,ios::binary);
		in_file.read((char*) &instr1,sizeof(byte_t));
		in_file.read((char*) &instr1,sizeof(byte_t));
		in_file.read((char*) &instr1,sizeof(byte_t));
		in_file.read((char*) &instr1,sizeof(byte_t));
		in_file.read((char*) &instr1,sizeof(byte_t));
		if(addr>address)
			for(int i=0;address+i<addr;i++)
			{
				in_file.read((char*) &instr1,sizeof(byte_t));
				in_file.read((char*) &instr1,sizeof(byte_t));
			}
	
		while(!in_file.eof())
		{
			in_file.read((char*) &instr1,sizeof(byte_t));//获得指令
			
		    
			switch(instr1)
            {
				case 0x00:   //1基本单字无跳转指令
				case 0x01:
				case 0x02:
				case 0x03:
				case 0x04:
				case 0x05:
				case 0x06:
				case 0x07:
				case 0x08:
				case 0x09:
				case 0x0A:
				case 0x0B:
                case 0x81:
				case 0x82:
				case 0x83:
				case 0x84:
				case 0x85:
				case 0x86:
				case 0x87:
				case 0x8c:
				case 0x20:   //扩展单字无跳转指令
				case 0x21:
				case 0x2a:
				case 0x2b:
				case 0x2c:
				case 0x2d:
				case 0x6c:
				case 0x6d:
				case 0x6e:
				case 0x6f:


				    cout<<"单字无跳转指令"<<endl;
					in_file.read((char*) &instr1,sizeof(byte_t));
					sign[addr-address]=1;addr++;break;
				case 0x41:   //2单字无条件跳转


					cout<<"单字无条件跳转指令"<<endl;
					char offset;
					in_file.read((char*) &offset,sizeof(byte_t));
					sign[addr-address]=1;
					addr=addr+offset+1;
					cout<<"跳转地址为"<<addr<<endl;
					if(sign[addr-address]==1){success=3;break;}
					else
					{
						in_file.close();
	                    in_file.open(infile,ios::binary);
		                in_file.read((char*) &instr1,sizeof(byte_t));
		                in_file.read((char*) &instr1,sizeof(byte_t));
	                    in_file.read((char*) &instr1,sizeof(byte_t));
		                in_file.read((char*) &instr1,sizeof(byte_t));
		                in_file.read((char*) &instr1,sizeof(byte_t));
	                    if(addr>address)
		           	    for(int i=0;address+i<addr;i++)
						{
						   in_file.read((char*) &instr1,sizeof(byte_t));
				           in_file.read((char*) &instr1,sizeof(byte_t));
						}
					}
	                       
					break;
				case 0x44:
				case 0x45:
				case 0x46:
				case 0x47:  //3单字有条件跳转
				case 0x64:  //扩展
				case 0x65:


					cout<<"单字有条件跳转指令"<<endl;
					in_file.read((char*) &offset,sizeof(byte_t));
					sign[addr-address]=1;
					a[++atail]=addr+offset+1;				
					addr++;
					break;
				case 0x80:  //4双字无条件跳转
				

					cout<<"双字无条件跳转指令"<<endl;
					in_file.read((char*) &instr1,sizeof(byte_t));					
				    sign[addr-address]=1;
					addr++;sign[addr-address]=1;
					addr++;
				    word_t address1;
					address1=addr;
					byte_t head,tail;
					in_file.read((char *) &head,sizeof(byte_t));                    
					in_file.read((char *) &tail,sizeof(byte_t)); 					
					addr=(int)head*0x100+(int)tail;
								
					if(sign[addr-address]==1){success=3;break;}
					else					
					{
						in_file.close();
	                    in_file.open(infile,ios::binary);
		                in_file.read((char*) &instr1,sizeof(byte_t));
		                in_file.read((char*) &instr1,sizeof(byte_t));
	                    in_file.read((char*) &instr1,sizeof(byte_t));
		                in_file.read((char*) &instr1,sizeof(byte_t));
		                in_file.read((char*) &instr1,sizeof(byte_t));
	                    if(addr>address)
		           	    for(int i=0;address+i<addr;i++)
						{
						   in_file.read((char*) &instr1,sizeof(byte_t));
				           in_file.read((char*) &instr1,sizeof(byte_t));
						}
					}            
					break;
				case 0xce:  //调用子程序指令


					
					in_file.read((char*) &instr1,sizeof(byte_t));					
				    sign[addr-address]=1;
					addr++;sign[addr-address]=1;
					addr++;
				    //word_t address1;					
					//byte head,tail;
					in_file.read((char *) &head,sizeof(byte_t));                    
					in_file.read((char *) &tail,sizeof(byte_t)); 					
					a[++atail]=(int)head*0x100+(int)tail;
				
					break;

				case 0x88://5双字无跳转指令
				case 0xe4:
				case 0xe5:
				case 0xe6:

⌨️ 快捷键说明

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