2

我正在编写一个编译器来使用Jasmin 汇编器将 Java 的子集编译为 Java 字节码

我在使用“l2d”指令时遇到了问题(以及相关的指令——但我认为一旦我弄清楚为什么这个指令不起作用,它们都会起作用)。

指令参考:

http://cs.au.dk/~mis/dOvs/jvmspec/ref-_l2d.html

我正在编译的代码是:

{
    double d = 10L;
}

所以本质上我试图反映 javac 在原始数值类型之间进行隐式类型转换的方式。

输出的 Jasmin 汇编代码为:

.source test3.jml
.class Test3
.super java/lang/Object
.method public static main([Ljava/lang/String;)V
    .limit stack 10
    .limit locals 100
    ldc2_w 10 ;Load constant numerical value 10
    l2d ;Convert left hand side to match the type of the right
    dstore 0 ;Store top of stack in 0 (d)
.end method

重要的几行是前三行.end method

';' 后的文字 是评论。

当我尝试运行编译后的代码时,我得到的确切错误是:

Exception in thread "main" java.lang.VerifyError:(class: Test3, method: main signature: ([java/lang/String;)V) Attempt to split long or double on the stack
Could not find the main class: Test3. Program will exit.

我认为这一定与 long 和 double 占用堆栈上的 2 个插槽和 2 个局部变量(在此处解释)这一事实有关,但它仍然让我感到困惑。

4

1 回答 1

1

Java 虚拟机使用局部变量来传递参数,因此索引为 0 的局部变量将是String[]代码中的类型。我对 Jasmine 不够熟悉,不知道在使用前是否必须声明其他局部变量,但是您可以简单地尝试将双精度数存储到索引 1 中吗?

于 2011-11-24T20:45:07.743 回答