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

📄 dlxdoc.cpp

📁 计算机体系结构中,关于DLXS的模拟程序.在vc6.0下编译通过.
💻 CPP
📖 第 1 页 / 共 3 页
字号:
					this->m_Instruction[i].pc = this->m_Pc;
					m_CmdString[m_Pc] = DisCompileInstruction(m_Pc);
					this->m_Instruction[i].cmdString = this->m_CmdString[m_Pc++];
					this->SetInstruction(i);
					m_CurInstr++;
				}
				break;
			default:
				this->m_Instruction[i].pc = this->m_Pc;
				m_CmdString[m_Pc] = DisCompileInstruction(m_Pc);
				this->m_Instruction[i].cmdString = this->m_CmdString[m_Pc++];
				this->SetInstruction(i);
				m_CurInstr++;
		}
	 if(instrNum && (m_CurInstr == 0 || m_Instruction[m_CurInstr-1].state != _S_HALT))
		m_Clock++;
	UpdateAllViews(NULL);
//	UpdateListBar(0);
//	UpdateListBar(1);
}

void CDlxDoc::OnSetFwd(UINT nID) 
{
	 SetForwarding(nID);
}

void CDlxDoc::OnSetBranch(UINT nID) 
{
	 SetBranch(nID);	
}

void CDlxDoc::OnUpdateFwd(CCmdUI* pCmdUI)
{
	pCmdUI->SetCheck( GetForwarding() == pCmdUI->m_nID);
}

void CDlxDoc::OnUpdateBranch(CCmdUI* pCmdUI)
{
	pCmdUI->SetCheck( GetBranch() == pCmdUI->m_nID);
}
/////////////////////////////////////////////////////////////////
//函数名:InstructionExe()	功能:在特定流水线部件下执行指令
//参数 int i, int scr1, int scr2, int choice  返回值:无
/////////////////////////////////////////////////////////////////
void CDlxDoc::InstructionExe(int i, int scr1, int scr2,int choice)
{
	int tag = 0;
	int dest,j,k;
	char temp[10];
	Tokentype curop;
	Instruction * pInstr = &m_Instruction[i];
	//执行
	curop=::Lookup(LPCTSTR(pInstr->op));
	if((pInstr->dest).GetAt(0)=='R')
		tag=1;
	for(j=tag,k=0;j<(pInstr->dest).GetLength();j++)
		temp[k++]=(pInstr->dest).GetAt(j);
    temp[k]='\0';
	dest=atoi(temp);
	
	switch(curop){
	    case LW:
			if(choice)
				m_Instruction[i].val0 = m_Memory[scr1+scr2];
			else
			{
				m_Register[dest]=m_Memory[scr1+scr2];
				RegBar->RegUpdate(dest);
			}
			break;

		case SW: 
			m_Memory[dest+scr2]=scr1;
			MemBar->MemUpdate(dest+scr2);
			break;

		case ADD:
			if(choice)
				m_Instruction[i].val0 = scr1+scr2;
			else
			{
				m_Register[dest]=scr1+scr2;
				RegBar->RegUpdate(dest);
			}
			break;

		case SUB:
			if(choice)
				m_Instruction[i].val0 = scr1-scr2;
			else
			{
				m_Register[dest]=scr1-scr2;
				RegBar->RegUpdate(dest);
			}
			break;

		case MUT:
			if(choice)
				m_Instruction[i].val0 = scr1*scr2;
			else
			{
				m_Register[dest]=scr1*scr2;
				RegBar->RegUpdate(dest);
			}
			break;

		case DIV:
			if(choice)
				m_Instruction[i].val0 = scr1/scr2;
			else
			{
			    m_Register[dest]=scr1/scr2;
				RegBar->RegUpdate(dest);
			}
			break;

		case AND:
			if(choice)
				m_Instruction[i].val0 = scr1&scr2;
			else
			{
				m_Register[dest]=scr1&scr2;
				RegBar->RegUpdate(dest);
			}
			break;

		case OR:
			if(choice)
				m_Instruction[i].val0 = scr1|scr2;
			else
			{
				m_Register[dest]=scr1|scr2;
				RegBar->RegUpdate(dest);
			}
			break;

		case XOR:
			if(choice)
				m_Instruction[i].val0 = scr1^scr2;
			else
			{
		        m_Register[dest]=scr1^scr2;
				RegBar->RegUpdate(dest);
			}
			break;

		case ADDI:
			if(choice)
				m_Instruction[i].val0 = scr1+scr2;
			else
			{
				m_Register[dest]=scr1+scr2;
				RegBar->RegUpdate(dest);
			}
			break;

		case SUBI:
			if(choice)
				m_Instruction[i].val0 = scr1-scr2;
			else
			{
				m_Register[dest]=scr1-scr2;
				RegBar->RegUpdate(dest);
			}
			break;

        case MUTI:
			if(choice)
				m_Instruction[i].val0 = scr1*scr2;
			else
			{
				m_Register[dest]=scr1*scr2;
				RegBar->RegUpdate(dest);
			}
			break;

		case DIVI:
			if(choice)
				m_Instruction[i].val0 = scr1/scr2;
			else
			{
				m_Register[dest]=scr1/scr2;
				RegBar->RegUpdate(dest);
			}
			break;

		case ANDI:
			if(choice)
				m_Instruction[i].val0 = scr1&scr2;
			else
			{
				m_Register[dest]=scr1&scr2;
				RegBar->RegUpdate(dest);
			}
			break;

		case ORI:
			if(choice)
				m_Instruction[i].val0 = scr1|scr2;
			else
			{
				m_Register[dest]=scr1|scr2;
				RegBar->RegUpdate(dest);
			}
			break;

		case XORI:
			if(choice)
				m_Instruction[i].val0 = scr1^scr2;
			else
			{
				m_Register[dest]=scr1^scr2;
				RegBar->RegUpdate(dest);
			}
			break;

		case BEQZ:
		case BNEZ:
		case J:
        case JR:
		default:
			break;
	}
}
/////////////////////////////////////////////////////////
//函数名:SerInstruction()	功能:设置指令状态(指令解析)
//参数: int i				返回值:无
////////////////////////////////////////////////////////
void CDlxDoc::SetInstruction(int i)
{
	m_Instruction[i].state = _S_IF;
	m_Instruction[i].states[m_Clock] = _S_IF;

	m_Instruction[i].cmdString.TrimLeft();
	m_Instruction[i].cmdString.TrimRight();
	m_Instruction[i].cmdString.MakeUpper();
	CString cmd = m_Instruction[i].cmdString;

	//操作符
	m_Instruction[i].op = cmd.SpanExcluding(" ,()");
	cmd.Delete(0,m_Instruction[i].op.GetLength());
	cmd.Delete(0);
	cmd.TrimLeft();

	//目标存储地址(或寄存器)
	if(cmd.GetLength())
	{ 
	
		m_Instruction[i].dest = cmd.SpanExcluding(" ,()");
		cmd.Delete(0,m_Instruction[i].dest.GetLength());

		
		
		cmd.Delete(0);
		cmd.TrimLeft();
	}

	//数据源1
	if(cmd.GetLength())
	{
		m_Instruction[i].src1 = cmd.SpanExcluding(" ,()");
		cmd.Delete(0,m_Instruction[i].src1.GetLength());
		cmd.Delete(0);
		cmd.TrimLeft();
	}

	//数据源2
	if(cmd.GetLength())
		m_Instruction[i].src2 = cmd.SpanExcluding(" ,()");


	Tokentype t = ::Lookup(LPCTSTR (m_Instruction[i].op));
	CString temp = m_Instruction[i].dest;
	switch(t)
	{
	case ADD:
	case SUB:
	case AND:
	case OR:
	case XOR:
	case ADDI:
	case SUBI:
	case ANDI:
	case ORI:
	case XORI:
		m_Instruction[i].outstate=_S_EXE;
		m_Instruction[i].period=1;
		break;
	case MUT:
	case MUTI:
		m_Instruction[i].outstate=_S_EXE;
		m_Instruction[i].period=GetMulPeriod();
		break;
	case DIVI:
	case DIV:
		m_Instruction[i].outstate=_S_EXE;
		m_Instruction[i].period=GetDivPeriod();
		break;	
	case LW://LW R0,0(R0)
		m_Instruction[i].outstate=_S_MEM;
	    m_Instruction[i].period=1;
		break;
	case SW://SW R0,0(R0)
		m_Instruction[i].outstate=_S_MEM;
	    m_Instruction[i].period=1;
		this->m_Instruction[i].dest = this->m_Instruction[i].src1;
		this->m_Instruction[i].src1 = temp;
		break;
	case BEQZ:
	case BNEZ:
		m_Instruction[i].outstate=_S_STALL;
		m_Instruction[i].period=1;
		this->m_Instruction[i].dest = this->m_Instruction[i].src1;
		this->m_Instruction[i].src1 = temp;
		break;
	case J:
		m_Instruction[i].outstate=_S_STALL;
		m_Instruction[i].period=1;
		break;
	case JR:
		m_Instruction[i].outstate=_S_STALL;
		m_Instruction[i].period=1;
		this->m_Instruction[i].src1 = this->m_Instruction[i].dest;
		this->m_Instruction[i].dest = "";
		break;
	case TRAP:
		break;
	case UNKNOWN:
		break;
	default:
		break;
	}
}

CString CDlxDoc::DisCompileInstruction(int pcnum)
{
	CString cmd = m_CodeMemory[pcnum];
	CString temp;
	int tempNum,i;
	temp=cmd.Left(6);
	cmd.Delete(0,temp.GetLength());
	Tokentype t = ::Lookout(LPCTSTR (temp));
	
	switch(t) {
	
		//R--Type     | 6		5	5	5	11	|
		//			  |	OpCode	rs1	rs2	rd	func|
		case ADD:
		case SUB:
		case AND:
		case MUT:
		case DIV:
		case OR:
		case XOR:
		
			m_OneInstruction.op = OpCode[t].name;
			
			temp = cmd.Left(5);//rs1
			cmd.Delete(0,temp.GetLength());
			tempNum = btod(temp);
			temp.Format("%d",tempNum);
			temp = "R" + temp;
			m_OneInstruction.src1 = temp;
			

			temp = cmd.Left(5);//rs2
			cmd.Delete(0,temp.GetLength());
			tempNum = btod(temp);
			temp.Format("%d",tempNum);
			temp = "R" + temp;
			m_OneInstruction.src2 = temp;


			temp = cmd.Left(5);//dest
			cmd.Delete(0,temp.GetLength());
			tempNum = btod(temp);
			temp.Format("%d",tempNum);
			temp = "R" + temp;
			m_OneInstruction.dest = temp;

			m_OneInstruction.cmdString = m_OneInstruction.op + " " + m_OneInstruction.dest
											+ "," + m_OneInstruction.src1 + "," + m_OneInstruction.src2;
		break;
	
		//J--Type	|6		26		|
		//			|OpCode	offset	|
		case J:
			m_OneInstruction.op = OpCode[t].name;
			
			temp = cmd.Left(26);//dest
			cmd.Delete(0,temp.GetLength());
			tempNum = btod(temp);
			temp.Format("%d",tempNum);
			m_OneInstruction.dest = temp;

			m_OneInstruction.cmdString = m_OneInstruction.op +" " + m_OneInstruction.dest;
			
			break;	
		//R--Type	|6		5	5	16			|
		//			|Opcode rs1	rd	immediate	|
		case LW:
		case SW:
			m_OneInstruction.op = OpCode[t].name;

			temp = cmd.Left(5);//rs2
			cmd.Delete(0,temp.GetLength());
			tempNum = btod(temp);
			temp.Format("%d",tempNum);
			temp = "R" + temp;
			m_OneInstruction.src2 = temp;

			temp = cmd.Left(5);//dest
			cmd.Delete(0,temp.GetLength());
			tempNum = btod(temp);
			temp.Format("%d",tempNum);
			temp = "R" + temp;
			m_OneInstruction.dest = temp;

			temp = cmd.Left(16);//immediate
			cmd.Delete(0,temp.GetLength());
			tempNum = btod(temp);
			temp.Format("%d",tempNum);
			m_OneInstruction.src1 = temp;
			
			m_OneInstruction.cmdString = m_OneInstruction.op + " " + m_OneInstruction.dest + "," 
							+ m_OneInstruction.src1 + "(" + m_OneInstruction.src2 + ")";
			break;
			
		case ADDI:
		case SUBI:
		case MUTI:
		case DIVI:
		case ANDI:
		case ORI:
		case XORI:
			m_OneInstruction.op = OpCode[t].name;

			temp = cmd.Left(5);//rs1
			cmd.Delete(0,temp.GetLength());
			tempNum = btod(temp);
			temp.Format("%d",tempNum);
			temp = "R" + temp;
			m_OneInstruction.src1 = temp;

			temp = cmd.Left(5);//rd
			cmd.Delete(0,temp.GetLength());
			tempNum = btod(temp);
			temp.Format("%d",tempNum);
			temp = "R" + temp;
			m_OneInstruction.dest = temp;

			temp = cmd.Left(16);//immediate
			cmd.Delete(0,temp.GetLength());
			tempNum = btod(temp);
			temp.Format("%d",tempNum);
			m_OneInstruction.src2 = temp;
			m_OneInstruction.cmdString = m_OneInstruction.op + " " + m_OneInstruction.dest + "," 
							+ m_OneInstruction.src1 + "," + m_OneInstruction.src2 ;
			break;
		
		case BEQZ:
		case BNEZ:
			m_OneInstruction.op = OpCode[t].name;

			temp = cmd.Left(5);//rd
			cmd.Delete(0,temp.GetLength());
			tempNum = btod(temp);
			temp.Format("%d",tempNum);
			temp = "R" + temp;
			m_OneInstruction.dest = temp;
			

⌨️ 快捷键说明

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