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

前の3つの重要な行.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に精通していませんが、doubleをインデックス1に格納してみてください。

于 2011-11-24T20:45:07.743 に答える