问题标签 [jasmin]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
java - Jasmin 汇编程序:'l2d' 指令给出“java.lang.VerifyError: ... 尝试在堆栈上拆分长或双倍”
我正在编写一个编译器来使用Jasmin 汇编器将 Java 的子集编译为 Java 字节码
我在使用“l2d”指令时遇到了问题(以及相关的指令——但我认为一旦我弄清楚为什么这个指令不起作用,它们都会起作用)。
指令参考:
http://cs.au.dk/~mis/dOvs/jvmspec/ref-_l2d.html
我正在编译的代码是:
所以本质上我试图反映 javac 在原始数值类型之间进行隐式类型转换的方式。
输出的 Jasmin 汇编代码为:
重要的几行是前三行.end method
。
';' 后的文字 是评论。
当我尝试运行编译后的代码时,我得到的确切错误是:
我认为这一定与 long 和 double 占用堆栈上的 2 个插槽和 2 个局部变量(在此处解释)这一事实有关,但它仍然让我感到困惑。
java - Java 字节码子例程 - 无法加载返回地址
我一直在尝试编写一些 Java 字节码并使用 Jasmin 组装它。
我试图了解子程序,但不确定为什么在运行程序时会收到以下错误消息:
这是 test.j 中的字节码:
跳转到单个子程序时我没有遇到任何问题,但是从子程序中跳转到子程序时似乎出了点问题。
任何关于为什么失败的见解将不胜感激!
java - 处理 Java 字节码中的 Try/Catch 异常?(“堆栈高度不一致”)
我正在尝试在 java 字节码中进行一些错误处理。我首先尝试实现一些类似于 catch 的子程序,在其中我会检查错误情况,然后跳转到适当的子程序,有点像:
上面的问题是,当我有多个指令跳转到这个子程序时,运行字节码的时候得到一个错误信息,说堆栈高度不一致。
也许使用异常是解决这个问题的最佳方法?
通过一些谷歌搜索,我发现您可以创建 Exception 类的实例并使用以下内容初始化它们:
我还发现你可以把它们扔掉athrow
,这似乎没问题。
然而,令我困惑的是异常是如何被捕获的。似乎有一个神奇的“异常表”将异常的抛出和捕获粘合在一起,但我不知道在从头开始编写字节码(并使用 Jasmin 组装)时如何定义其中一个。有人能告诉我创建异常表的秘密吗?并可能给我一个将与茉莉花组合的异常处理示例?
compiler-construction - Java 到 Java 字节码编译器:如何获取 Java 类库信息?
我正在通过编译为Jasmin代码并组装它来编写 Java 到 Java 字节码编译器。我创建它的目的是使源代码文件能够引用和使用 Java 库类(对于字符串、打印等,您几乎必须这样做)。我的问题是如何去做这件事。
到目前为止,我一直在使用对所有库类列表的引用,该列表保存在 Java 安装文件夹中的文本文件中(它只是列出了它们的包和名称)。我已经在对解析器/类型检查器进行编码时使用了它,尽管这不太理想,因为在使用库类时类型检查器无法进行任何类型检查。
现在我正在处理代码生成,这确实是一个问题,因为如果你想调用库类的方法,你必须给它完整的方法签名——我无法访问的东西。
我在徘徊人们对如何进步的建议。一种方法是遍历所有类,创建一个包含所有参数和返回类型的数据库/列表。这显然会非常耗时,而且可能太不切实际。还有其他更优雅的方法吗?
谢谢,威尔
PS我正在使用Python对此进行编码。我想如果解决方案必须使用 Java 代码,我可以将它作为子进程运行。
java - 如何处理 jasmin 中命名为关键字的字段
我正在为 java 的一个子集编写一个编译器,我几乎完成了。我遇到的一件事是处理命名为 jasmin-keywords 的类、字段和方法。
例如:
这会像这样编译成茉莉花:
问题是 .class 和 .field 指令,如果名称是关键字,它们会导致编译错误。我尝试在它们周围加上单引号和双引号;使用单引号将 jasmin 组装成类文件,但随后会出现验证错误(看起来它实际上包含名称中的引号,这是次优的)。使用双引号根本无法编译。
对此有什么解决方案,还是在茉莉花中不可能做到这一点?
jvm - Jasmin如何强制长场为长常数?
我设法在这个测试用例中隔离了我的问题:
当我尝试运行它时,我得到了这个:
一些调查(与javap
)揭示了这一点:
换句话说,long 常量的值作为整数存储在类文件中。有什么方法可以强制 Jasmin 将常量长期存储在池中吗?我试过1L
了,但它不起作用。将 的值设置为foo1
大于INT_MAX
(例如2147483648
)的数字确实可以修复错误,但我希望有一个不需要我更改常量值的解决方案。
Jasmin 是否提供任何方法来执行此操作,或者这是否需要我更改 jasmin 的源代码?
java - 在 Jasmin 中实例化类
我正在尝试像这样在 Jasmin 中实例化一个类:
这确实编译但类 vierifier 抱怨:
“VerifyError:调用错误的初始化方法。”
实例化类的正确方法是什么?
java - 将 Jasmin 集成到 Ant 和 Eclipse 中
我正在开发一个 Java 项目,我需要一个非常具体的测试代码,我在 Jasmin(JVM 程序集)中创建它。该项目是用 Ant 构建的,并且有一个很好的目录结构,即:
定制的 Jasmin 源文件与 JUnit Java 文件一起位于 src/tests 目录中。所有这些都是用 Ant 构建的(我使用简单的“java”Ant 任务在源文件上运行 Jasmin 编译器),它们被放入 /build 文件夹内的相应目录中,然后 Ant 运行 JUnit 任务。所有这一切都很好......
在我介绍了由 Jasmin 生成的单个类之前,Eclipse 与该项目完美配合。问题是 Eclipse 看不到新的 .class 文件。构建路径包含 src/classes 和 src/tests 作为源文件夹,以及 /build 作为输出文件夹。然而它似乎找不到 Jasmin 生成的类,所以有数百个“ClassX unresolved”问题,确实让开发非常痛苦。
有谁知道如何强制 Eclipse 看到这个类?
java - 为什么在 Jasmin HelloWorld 中使用 aload_0?
有官方 Jasmin HelloWorld 示例的开始。
为什么会有aload_0
指令?local var 0 由什么组成?