📄 dlxdoc.cpp
字号:
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 + -