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