📄 viewr.java
字号:
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
class RegViewer extends JFrame
{
TextArea regarea;
public RegViewer(PC pc)
{
super("View Registers");
int width=400;
int height=460;
setSize(width,height);
regarea=new TextArea("",60,80,TextArea.SCROLLBARS_NONE);
add(regarea);
try{
regarea.setText(pc.ViewReg());
}
catch (Exception ee){}
}
}
class MemViewer extends JFrame implements ActionListener
{
TextArea memarea;
JButton insm,datam,gpm,spm,random,pageup,pagedown;
JTextField m_start;
int startm;
PC pc;
int Linecount;
public MemViewer(PC pc, int Linecount)
{
super("View Memory");
this.pc=pc;
this.Linecount=Linecount;
int width=600;
int height=430;
setSize(width,height);
memarea=new TextArea("",15,65,TextArea.SCROLLBARS_NONE);
startm=0;
insm=new JButton(" View Instruction Memory ");
datam=new JButton(" View Data Memory After Instruction ");
gpm=new JButton(" View Global Static Data Memory ");
spm=new JButton(" View Dynamic Stack Data Memory ");
random=new JButton(" View Memory with Random Access ");
pageup=new JButton(" Page Up ");
pagedown=new JButton(" Page Down ");
m_start=new JTextField(10);
JPanel pane=new JPanel();
insm.addActionListener(this);
datam.addActionListener(this);
gpm.addActionListener(this);
spm.addActionListener(this);
random.addActionListener(this);
pageup.addActionListener(this);
pagedown.addActionListener(this);
pane.add(memarea);
pane.add(insm);
pane.add(datam);
pane.add(gpm);
pane.add(spm);
pane.add(pageup);
pane.add(pagedown);
pane.add(random);
pane.add(m_start);
add(pane);
memarea.setText(null);
}
public void actionPerformed(ActionEvent e)
{
if (e.getSource()==insm)
{
memarea.setText(null);
try{
startm=0;
memarea.append(pc.ViewMemory(startm));
}
catch (Exception ee){}
}
if (e.getSource()==datam)
{
memarea.setText(null);
try{
startm=Linecount*4+4;
memarea.append(pc.ViewMemory(startm-startm%16));
}
catch(Exception ee){}
}
if (e.getSource()==gpm)
{
memarea.setText(null);
try{
startm=pc.register[28];
memarea.append(pc.ViewMemory(startm-startm%16));
}
catch(Exception ee){}
}
if (e.getSource()==spm)
{
memarea.setText(null);
try{
startm=pc.register[29]-252;
memarea.append(pc.ViewMemory(startm));
}
catch(Exception ee){}
}
if (e.getSource()==random)
{
String s=m_start.getText();
// int stm=Integer.parseInt(s);
memarea.setText(null);
try{
startm=new NewHEX().HEXtoInt(s.trim().toLowerCase());
memarea.append(pc.ViewMemory(startm-startm%16));
}
catch(Exception ee){}
}
if (e.getSource()==pageup)
{
memarea.setText(null);
try{
startm=startm-256;
memarea.append(pc.ViewMemory(startm));
}
catch(Exception ee){}
}
if (e.getSource()==pagedown)
{
memarea.setText(null);
try{
if (startm+256<pc.register[29]+4)
startm=startm+256;
memarea.append(pc.ViewMemory(startm));
}
catch(Exception ee){}
}
}
}
class HelpViewer extends JFrame
{
TextArea helparea;
public HelpViewer()
{
super("Help");
int width=600;
int height=550;
setSize(width,height);
helparea=new TextArea("",60,80,TextArea.SCROLLBARS_NONE);
add(helparea);
helparea.append("\n\nMIPS Assembler Simulator v0.6.24.1014 beta\n\n");
helparea.append("\n\n使用说明:\n\n");
helparea.append("1、本MIPS模拟器支持的指令如下:\nadd,addi,sub,subi,and,andi,or,ori,nor,beq,bne,j,jr,jal,lw,lh,lb,sw,sh,sb,");
helparea.append("其中所有的跳转指令第三个操作数只能为一个行标签(不支持相对地址以及绝对地址),标签可以写在一行开头,以冒号结尾。\n");
helparea.append("2、输入或修改MIPS指令或者二进制指令后请先保存后再进行汇编、反汇编或运行。保存后界面会显示行号,但实际写入文件并无行号,仅为方便用户查看运行结果和断点运行设置。\n");
helparea.append("3、MIPS和二进制程序格式为一行一条指令,先输指令,直到END 000004(FC000001)结束,后面则是数据内存写入,使用DW在以PC为内存地址的区域写入数据,二进制代码则直接以数据作为改行代码。\n");
helparea.append("4、程序设置了标准的32个数据寄存器和000000-ffffff的内存,内存地址空间仅为24位而不是32位是受到了数组空间的限制,其中默认000000-7fffff是指令内存,接下来区域为数据内存,静态全局数据内存始于800000向上存储,动态栈数据内存始于fffffc向下存储。当然可以在指令后的任何空间存储数据,并且是运行小型MIPS程序的较好方法,可以直接用指令导入指令内存后面的数据内存。\n");
helparea.append("5、程序设置了断点运行功能:先按断点模式运行,再输入断点行号,按Go即可执行到断点,于是可以再设置下一个断点继续查看,直到程序执行到最后一行(此时若仍未找到断点则停止。在任何断点时刻,均可查看数据寄存器和内存的情况。\n");
helparea.append("6、请尽量规范输入指令,否则可能会有Unexpected Error,注意程序要以END(FC000001)指令结尾,否则无法正常执行。在文本框内编辑时无须输入行号,而是保存后在文本框内自动显示,方便用户下面调试运行时查看而设置的。行号并非指令的一部分。\n");
helparea.append("7、调用计算器和记事本的功能仅在Windows下可用,如果不习惯我们的界面可以用记事本编辑后Load再执行,计算器可以进行一些进制转换等操作验证结果。\n\n");
helparea.append("v0.6.1x版更新:1、增加了lb,sb,lh,sh,lui等指令。2、修正了不进行汇编直接运行指令内存全为0的错误。3、完善了反汇编功能,更好地支持跳转指令。4、加入了帮助说明和调用记事本、计算器功能。5、对于判断是否需要保存的机制稍做了修改,虽然还是不太理想(有点不符合用户使用习惯)。6、对程序进行了打包生成jar文件,方便发行、移动复制和使用。7、去掉了所有的调试信息System.out.println.8、修正了只按运行不编译内存显示不正确的问题和设置断点第0行不能正常运行的问题。\n\n");
helparea.append("v0.6.2x版更新:修正了关闭jar程序后仍然驻留javaw.exe进程,占用资源的问题,现在可以正常关闭软件了。\n\n");
helparea.append("本程序由ZJU SC 0601 黄天乐、骆歆远、马超、蔡平一起完成,功能不多,平时学习时执行下小MIPS程序还是有一定可用性。由于时间匆忙,难免存在不少BUG,还请大家多多原谅和指出。\n\n");
helparea.append("Mailto: wisp@zju.edu.cn\n\n");
helparea.append("2008-06-11\n");
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -