我正在编写一个编译器,使用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)这一事实有关,但它仍然让我感到困惑。
答案 0 :(得分:1)
Java虚拟机使用局部变量传递参数,因此索引为0的局部变量在代码中的类型为String[]
。我对Jasmine不太熟悉,知道在使用之前是否必须声明其他局部变量,但是你可以简单地尝试将double存储到索引1中吗?