第2章 MARS汇编程序开发环境
2.1 MARS界面简介
MARS是一个MIPS汇编和运行模拟器,可以汇编和模拟MIPS汇编语言程序的执行。它可以从命令行或集成开发环境(IDE)中使用。MARS采用Java编写,需要J2SE Java运行时环境(JRE)1.5以上版本才能工作。它作为可执行Jar文件发布。从版本4.0开始,MARS汇编和模拟器支持155条MIPS-32指令集指令以及约370条伪指令和宏指令,如MIDI输出、随机数生成等。通过设置,可禁止使用伪指令和宏指令以及其他存储器寻址模式。
MARS界面如图2-1所示,包含菜单栏、快捷键、寄存器窗口、工作区窗口、消息窗口等。
图2-1 MARS界面
工作区窗口不仅仅包含代码编辑窗,也包含运行窗口。工作区运行窗口各部分含义如图2-2所示。
图2-2 MARS工作区运行窗口
数据段数据以字为单位显示,字节序与主机一致,即模拟器若运行在小字节序计算机中,那么MARS就以小字节序将连续4个内存单元的数据读取并显示出来。也就是说,若地址0x00002000、0x00002001、0x00002002、0x00002003存储单元分别存放数据0x61、0x62、0x63、0x64,那么MARS数据显示区域中起始地址为0x00002000、偏移地址为+0处显示数据0x64636261。
2.2 MARS菜单栏简介
2.2.1 File菜单
File菜单下含有的子菜单如图2-3所示。该菜单下大部分子菜单都为常规功能,这里不一一介绍。
图2-3 MARS File子菜单
子菜单Dump Memory可导出MARS中存储单元数据到文件中。具体操作方法为:单击Dump Memory子菜单,在如图2-4所示弹出窗口的左边选择需要导出的内存区间,可能选项如图2-5所示,分别为用户程序代码段和数据段;在右边选择导出文件数据格式,可能选项如图2-6所示,分别为ASCII码文本、二进制数、二进制文本、十六进制文本、英特尔十六进制数、代码或数据段窗口。为方便阅读,通常导出十六进制文本,这样导出的数据格式与工作区运行窗口显示的数据格式完全一致。
图2-4 MARS Dump Memory窗口
图2-5 可导出的内存区间
图2-6 可导出的数据类型
2.2.2 Run菜单
Run菜单下的子菜单如图2-7所示,含义从上到下分别为汇编、运行、单步运行、单步退回、暂停、停止、复位、清除断点、设置断点等。对应的快捷键如图2-8所示,从左到右分别为汇编、运行、单步运行、单步退回、暂停、停止、复位。同时还有一个控制运行速度的调节条,如图2-9所示。调节运行速度可以清晰观察各条指令运行结果,无须逐条指令手动单击单步运行按钮。
图2-7 MARS Run子菜单
图2-8 运行快捷键
图2-9 运行速度调节条
MARS非常方便MIPS汇编语言初学者调试汇编程序的地方在于它设置了单步退回功能。若程序运行时发现错误,可以暂停运行,并逐步返回,通过逆向追溯发现问题,而不用从头开始运行。
2.2.3 Settings菜单
Settings菜单下的子菜单如图2-10所示。从上到下依次为标号窗口显示(符号表)、传递参数给MIPS程序、为系统功能调用(5、6、7、8、12)弹出对话框、十六进制形式显示地址、十六进制形式显示数据;打开文件同时汇编、汇编同一目录下所有汇编源程序、汇编警告信息当作错误、程序指针初始化时指向全局标号main;允许使用扩展指令和伪指令、允许分支延迟、允许自动修改代码;编辑器设置、高亮设置、异常句柄设置、存储设置等。凡是子菜单前带有方框表示可选项,选中则启用相应功能,否则不启用。没有方框的子菜单,单击之后会弹出新的窗口,允许用户进行相应设置。
图2-10 MARS Settings子菜单
这里仅简要介绍存储设置弹出窗口功能,它用来配置用户代码段、数据段起始地址以及程序的存储结构。单击存储设置(Memory Configuration...)子菜单,弹出如图2-11所示窗口,支持三种不同存储配置方案:系统默认模式、数据段起始地址为0的压缩模式、代码段起始地址为0的压缩模式。不同方案下,程序各个段的起始地址都详细列在窗口右侧。为方便导出代码段机器指令,可配置为代码段起始地址为0的压缩模式。若仅仅模拟运行MIPS程序,可以采用其中任何一种配置。需要注意的是:无论哪种方案,MIPS程序访问数据的存储地址都必须处于数据段相应范围之内,否则指令运行时会报错。
图2-11 存储设置弹出窗口
MARS其他菜单这里不再一一介绍,读者若有兴趣,可以直接查阅MARS帮助手册。查阅方法为从MARS Help菜单中选择Help,弹出如图2-12所示的帮助手册。该手册详细介绍了MARS以及MIPS汇编指令用法。
图2-12 MARS帮助手册
用户在MARS代码编辑窗口输入汇编指令时,MARS自动给出如图2-13所示相应MIPS汇编指令语法提示信息,以便读者正确使用MIPS汇编指令。
图2-13 MARS MIPS指令语法提示
2.3 MARS汇编、调试程序
2.3.1 汇编语言源程序编辑
MARS集成了代码编辑器,用户可直接在代码编辑器中编辑汇编语言源程序,无须考虑程序入口,也可以不定义main标号,此时直接从编写的第一条汇编指令开始执行。它不同于QtSpim,无须考虑内核程序,即运行的第一条指令就是用户编写的汇编指令。它支持所有MIPS汇编指令、伪指令以及扩展指令。
2.3.2 汇编器
可以直接通过快捷键或菜单调用MARS汇编器。汇编如果没有错误,工作区窗口将直接显示运行窗口,即显示用户程序代码段和数据段。若有错误,如图2-14所示,则在消息窗口显示相关错误提示信息。错误提示信息包含汇编出错源文件、行、列以及错误原因等。
图2-14 MARS汇编出错提示信息
2.3.3 查看程序存储映像
MARS查看程序存储映像非常方便。下面结合一个具体示例阐述如何通过MARS查看MIPS汇编源程序存储映像。
若有如图2-15所示汇编语言源程序,则MARS汇编之后对应代码段和数据段如图2-16所示,由此可知该汇编源程序装载到存储空间时,代码段起始地址为0x0,数据段起始地址为0x00002000。代码段的第一列为存储单元地址,第二列为汇编指令对应的机器码,第三列为反汇编指令,第四列为汇编源代码。通过对比代码段中的源代码可得到图2-15 MIPS汇编语言源程序代码段存储映像如表2-1所示,根据图2-15 MIPS汇编语言源程序数据段定义可知该程序数据段仅定义了5个存储单元(4个字符+字符串结束符0),主机为小字节序,因此图2-15 MIPS汇编语言源程序数据段存储映像如表2-2所示。
图2-15 MIPS汇编语言源程序
图2-16 MARS显示的代码段和数据段
表2-1 代码段存储映像
表2-2 数据段存储映像
2.3.4 运行程序
MARS不同于QtSpim,可以设置程序运行速度,用户可根据自身需要调整运行速度以便逐步观察各条指令运行结果,也可以直接在代码段相应指令前方方框内选中设置断点,还可以根据需要单步运行指令。图2-17设置2s仅运行一条指令,并且在第4条指令前设置断点。当单击Run快捷键时,程序将慢速运行。用户可以实时调节运行速度并观察数据段存储单元以及寄存器变化是否正确。一旦发现问题,可以单击暂停快捷键暂停执行。程序运行时,若碰到非法指令,MARS暂停执行,高亮显示的指令即为暂停点,并在消息窗口中显示错误提示信息,指出错误指令的行号以及错误原因,如图2-18所示。
图2-17 MARS运行速度调节以及断点设置示意
图2-18 MARS运行错误提示信息