同学们在使用 Mars 编写 P2 课下汇编程序时,一定遇到过以下问题:
- IO 面板不能直接复制粘贴多行输入,否则会出现异常
- Message/IO 面板尺寸较小,且无法进一步增加高度
也许充满创造力的你已经构建了一套基于第三方编辑器 + 命令行运行 Mars 的汇编“一条龙”方案,不再需要使用带 GUI 的 Mars 了,但也请留步,阅读一下这篇帖子,希望能抛砖引玉地为你将来的美妙发明带来一些启发。
注:以下内容为本人在 2022 秋计算机组成课程学习过程中所做的思考与成果分享,有部分适应性改动。本帖中发布内容均系个人过去的成果,对于未来可能发布的工具,请以课程组官方名义发布文件为准。
通过阅读原版 Mars 源码(附于 jar 压缩包内),我分析出问题的原因:
- GUI
读入文本时,如遇一次读入多行的情况(比如接受粘贴文本),会直接“打包”处理带有多个换行符的文本。比如当应用
5 号系统调用读取整数时,Mars 就会尝试转换这类文本到
Integer
。正逐渐上手 Java 的你应该知道,这样会产生NumberFormatException
异常。简单说就是 Mars 没有正确处理一次性输入的多行文本。我的补丁方案则是在对应的类内部加一个缓存队列,将输入文本中第一个换行符后的全部内容放入缓存,待下一次读取时分行取出。 - Mars 在创建代码编辑面板时未指定该面板的最小尺寸,导致 Java AWT 在计算编辑面板的最小尺寸时默认了一个较大数值,编辑面板的最小尺寸进一步限制了其下方消息/IO 窗口的最大高度。解决方案就是为代码编辑面板显式地声明最小尺寸为 0。
当然,在经过这样一番修改后,Mars 读入数据的局限性仍然很强,比如我们依然不能在一行输入中方便地按空格来分隔多个整数。当然,本帖作为一个抛砖引玉的软件修改思路参考帖,如果你有更高、更妙的想法,我们鼓励大家在讨论区一起分享、交流。
现将修改后的代码与重打包的jar文件分享给大家。保证修改版 Mars 除输入外,其他功能行为与原版完全一致。
https://bhpan.buaa.edu.cn/link/AA3C6FD01AE6A94651BF709B162D12BEFE(存档)
文件夹名:MARS_mod
有效期限:2024-01-31 23:59
目录结构说明:jar
单个文件可直接运行。modified_codes
目录下包含了所有有改动的代码文件,可自行与原版代码比对差异。modified_classes
内对应这些代码文件重新编译后的字节码文件。
讨论区这位同学已经给出了解决方案:解决无法打开魔改MARS的问题
抱歉,卡在启动界面的原因应该是我使用了版本较高的 JDK17 进行编译。现已使用 JDK1.8 重新编译并替换了原文件,重新下载即可。感谢指出!