基于龙芯32位基础整数指令集的汇编器(三)

目录

  • 前篇传送门
  • 前情提要
  • 第六步:更好的UI以及用户反馈
    • 语法高亮器
    • 可视化功能按钮
    • 行高亮显示
    • 行号显示
  • 第七步:Debugger
  • LAST:代码和软件封装
  • 结尾(真)

前篇传送门

这是本项目的第三篇文章,以下为前篇的传送门:
第一篇
第二篇

前情提要

  • 已经划分了指令集
  • 已确定了使用Qt来做可视化界面开发
  • 明确了汇编代码翻译过程
  • 解决了分支指令使用标号跳转的形式
  • 代码段和数据段分治处理
  • 基础的错误检测机制

第六步:更好的UI以及用户反馈

语法高亮器

虽然通过Qt可视化界面控件提供的基础功能已经呈现出一个能看的用户界面了,但这只能够应付课程要求的最基础部分,若是想要真的写出一个属于自己的软件,还需更进一步;
参考各类IDE和汇编器,我们不难发现,语法高亮器是必不可少的,但对于没有学过《编译原理》或《形式语言与自动机》课程的小伙伴而言,通过正则表达式匹配语句是相当难以理解的,所幸Qt官网或者是Qt Creator的示例项目中,就有一个名为highlighter的项目,若是能理解大概的工作流程,是能够直接plug and play的,其工作流程在CSDN等技术网站上也不难查阅到,剩下的就是根据自己汇编器所需,依葫芦画瓢地指定匹配规则即可。

可视化功能按钮

有了语法高亮器之后,我们还可以给界面的ToolBar上增添可视化按钮,这里有个大坑,ToolButton是不能自动安装到ToolBar上的,此处我的建议是放弃使用ToolButton,专用新建Action,然后拖拽到ToolBar上,再右击对应的Action“转到槽”功能,选择需要的信号触发函数,然后再进一步编写自己所需的处理函数

行高亮显示

设置行高亮原本只是打算做来玩的……结果没想到给前面错误检测机制能用上,总之大概思路就是通过获取文本输入窗口的Cursor位置,然后通过官方提供的高亮方法进行高亮即可,注意可能会改变Cursor位置的因素有很多(换行,鼠标点击,输出内容……)所以建议每次需要高亮时手动将光标移动到起始位置,然后再计算需要向下移动多少行

行号显示

由于Qt没有自带行号显示的文本编辑器,可以考虑自行制作一个,不过也可以直接通过类继承的方式直接导入官方设计好的带行号文本编辑器,只是采用后者的时候只能通过Release才能看到行号显示,Debug时行号仍旧不显示

第七步:Debugger

Debug功能是汇编器能够提供的高级功能,旨在模拟单周期CPU对能够通过汇编的用户代码进行逐行模拟执行,并将执行结果反馈给用户,以起到逻辑正确性验证的效果;
首先Debugger需要三个基本操作:

  1. Run:一次性执行到断点处(若不存在断点或死循环,则直接执行到程序结尾)
  2. Step:单步执行,每触发一次就执行一条指令
  3. Reset:重置执行情况

其次,需要通过高级语言模拟CPU执行汇编指令,并设置寄存器堆、PC寄存器、IR寄存器和内存(内存行格式为:地址+16进制数据+对应ASCII编码)这几个基本部件的逻辑形式,将各指令分发处理,修改对应的基本部件内容,并将修改结果反馈到UI以供用户查阅,就是Debugger的基本工作流程。
支持用户自定义跳转,在Next PC栏输入地址,点击Set按钮,就能够强制令Debugger修改为下一次Step执行该PC值对应的指令。
此外,本汇编器提供了一个断点位,用户可定义一个PC值作为断点,手动设置是否将其激活;同时支持用户自行输入内存地址以查看内存该位置的内容,并自行输入想人为写入的内容。
为了优化观感,当前执行语句行进行了高亮处理,当前修改或查看的内存行也进行了高亮处理。

LAST:代码和软件封装

C++面向对象编程的其中一大特点就是代码封装,类的私有成员和保护成员对外界而言“隐形”,通过定义接口使得外部函数得以获取变量值,或是进行合法的修改,这一特性很大程度上是C++在C语言的基础上对代码安全性的优化;
因此设计汇编器后端逻辑系统时,我充分利用了这一特性,主要定义了三个大类:

  • 用户界面,定义了所有界面触发信号槽、所有界面控件以及优化控件观感和语法高亮器等可视化内容,均定义为私有成员,外界只能调用提供的合法安全函数接口,无法对其取值进行更改。
  • 汇编器,包括了汇编进行过程中所需要的所有功能函数,以及借助LUT思想对汇编指令进行翻译的字符串数组,为避免在外部被意外更改其内容,将这些都设置为protected类型成员,同时将一些通用的工具函数如进制转换函数设为public成员,以供程序其它位置进行调用。
  • Debugger(继承汇编器),由于Debug过程中需要使用汇编翻译阶段性成果,同时也需要使用到汇编器对象中定义好的许多静态变量,所以利用类继承方法,让Debugger类成为汇编器的一个“子类”,这样前者就能够访问后者的protected类型成员,避免重复定义相同的字符串数组和功能函数。

此外,为了减少用户使用的难度,改变了一开始采用固定位置进行输入输出的设计,让用户自行选择文件读取和写入,同时将整个工程打包成可执行文件,隐藏了背后的逻辑实现,提高了软件的安全性。

结尾(真)

那么大致的内容就巴拉到这里结束了,详细代码项目可通过gitee仓库获取,仓库地址,内容属作者原创,只供学习免费使用,其余用途请联系作者

你可能感兴趣的:(汇编器,qt,ui,开发语言)