# pcode-viewer **Repository Path**: xyqlx/pcode-viewer ## Basic Information - **Project Name**: pcode-viewer - **Description**: 一个简易的类P-code(指PL/0翻译成的某种栈式汇编语言)解释器 - **Primary Language**: TypeScript - **License**: MIT - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2020-09-06 - **Last Updated**: 2024-05-29 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # PcodeViewer 该项目实现了一个简易的在线类P-code解释器 在view分支已部署了构建好的网页,可以直接访问使用 项目运行出现任何问题欢迎提交issue,你也可以自行查看代码(并不复杂,只是有点乱)理解问题出现的原因 ## 目录 - [PcodeViewer](#pcodeviewer) - [目录](#目录) - [如何使用](#如何使用) - [导入代码](#导入代码) - [自动注释](#自动注释) - [编辑器大小调整](#编辑器大小调整) - [错误处理说明](#错误处理说明) - [运行](#运行) - [单步调试](#单步调试) - [多步调试](#多步调试) - [转换到其它语言](#转换到其它语言) ## 如何使用 ### 导入代码 在非调试状态下,你可以在指令区选择`fibonacci`或者`gcd`并点击导入按钮导入。 你也可以输入或者复制进自己的代码。对于复制进的代码,有如下要求: 1. 每行必须有且一行指令,且行号与跳转的位置保持一致(解释器会按照行号来解释jmp等指令),不允许空行(包含结尾) 2. 指令的格式必须包含仅一条为js正则表达式/(\w{3})\s*(\d+)\s+(\d+)/所能够识别的部分 以下格式的指令都能够被正确识别: ```asm lit 0 1 2 lit 0 1 lit 0 1 lit 0 1 # 注释 ``` ### 自动注释 本编辑器会对复制与输入的一些格式进行自动修正,并且自动加入与更新注释,目前无法关闭该功能。 在输入中也会更新注释。当你完成一条指令的输入时,无需移动光标到行尾再回车。可以在行中间直接回车,编辑器会尽量自动保持每一行注释的正确性。 你可以删去#后面的\*来阻止自动更新注释功能。 ### 编辑器大小调整 在编辑器与右侧窗口之间有一道双线,将鼠标光标移至此处,光标变为左右调整光标,此时可以拖动双线进行一定程度上的布局调整。 ### 错误处理说明 目前暂未实现任何错误处理。遇到错误情况可以保存代码后刷新,并结合“运行N步”与“单步调试”功能查看运行情况。 你也可以自己实现一个类P-code解释器并使用专业的调试器。 ### 运行 点击运行按钮后,将会开始运行编辑器中的代码。遇到输入指令时,将会优先加载输入区的输入(每行一个数字)。用尽后,将会在每次输入时弹出输入框,每次需要输入一个数字。产生的输出将会显示在输出区。 运行的最大指令数为100000,目前不能设置。在运行期间,你可以在运行区查看当前运行的指令数。 ### 单步调试 点击单步调试进入调试状态。此状态下,指令区将会显示下条运行的指令,以及当前与下一条指令执行时栈区的变化,编辑器将会高亮下条运行指令的所在行。 栈区中的颜色含义如下:绿(入栈)红(出栈)黄(修改)蓝(取值)黑色加粗边框(当前基址) 调试状态下连续点击单步调试按钮将会一步步执行。 ### 多步调试 点击“运行N步”按钮将会连续执行N(在后面的文本框中设置)条指令并进入调试状态。 本按钮的设计目的是快速到达程序执行的某个位置。 你也可以将N的值设为某个较大的数来代替不能设置的`运行`功能的最大指令数。注意,区别在于每次执行“运行N步”功能时,需要复位才能进行下一次运行,而直接点击`运行`按钮则无此限制。 ### 转换到其它语言 目前支持从类P-code到MIPS的两类转换和到基本流图(PlantUML形式)的一类转换。这基本上要求类P-code必须是从PL/0源程序编译生成的完整程序,以下称之为`受限类P-code`。它拥有不限于以下特性: 1. 不混用数据和地址 2. 函数调用与循环内容保持栈平衡 对于非受限类P-code,不能保证其转换结果的意义。 在`转换区`选择转换方案后,将弹出一个对话框,显示转换结果。同时还能使用复制到剪贴版和下载功能。下载文件的命名与下载时间有关,后缀名和转换的目标语言有关。 `受限-MIPS-块内`在`受限-MIPS-基础`的基础上,在基本块内对连续的n个lod/lid + n-1个opr + 1个sto指令做了特别优化,生成的指令数量较后者要少。目前,尚未完全验证此优化对执行结果是否存在影响。 [PlantUML](https://plantuml.com/zh/)是一个用简单直观的文本表示各种示意图的方案。它支持本项目实际使用的[Graphviz/DOT](https://graphviz.org/gallery/)语言的绘制。如果本地未安装graphviz,你也可以访问在线的[PlantUML Server](http://www.plantuml.com/plantuml/uml/)预览dot代码的图形表示。