Jasmin汇编程序:'l2d'指令给出“java.lang.VerifyError:...尝试在堆栈上拆分long或double”

时间:2011-11-24 20:17:40

标签: java compiler-construction assembly jvm jasmin

我正在编写一个编译器,使用Jasmin assembler

将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个局部变量(解释here)这一事实有关,但它仍然让我感到困惑。

1 个答案:

答案 0 :(得分:1)

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