2011-12-10 2 views
1

私はいくつかのJavaバイトコードを書き、Jasminを使ってアセンブルしようとしています。Javaバイトコードサブルーチン - リターンアドレスをロードできません

私は、サブルーチンのまわりで私の頭を取得しようと、私のプログラムを実行するときに、私は次のエラーメッセージを取得する理由はわからないのです。

>java -jar jasmin.jar test.j 
Generated: test.class 

>java test 
Exception in thread "main" java.lang.VerifyError: (class: test, 
method: main signature: ([Ljava/lang/String;)V) 
Cannot load return address from register 0 
Could not find the main class: test. Program will exit. 

はここtest.jでのバイトコードです:

.class public test 
.super java/lang/Object 
.method public static main([Ljava/lang/String;)V 
.limit stack 6 
.limit locals 5 

jsr a  ;Jump to subroutine 'a', pushing return address on operand stack 
return ;Exit the program 

a: 
astore_0 ;Store the return address in variable 0 
aload_0 ;Save the address onto the stack as address will be overwritten in 'b' 
jsr b  ;Jump to subroutine 'b', pushing return address on operand stack 
astore_0 ;Store the address that was on the stack back into variable 0 
ret 0  ;Return to just after "jsr a" 

b: 
astore_0 ;Store return address in variable 0 
ret 0  ;Return to address stored in 0 (ie back to just after the jump in 'a') 

.end method 

私は1つのサブルーチンにジャンプすることに何の問題もありませんでしたが、サブルーチン内からサブルーチンにジャンプするときに何かがうまくいかないように思えます。

これがなぜ失敗したのかについての洞察は非常に高く評価されます。

+0

私はJVMの内部を知っているが、通常のCPU上で "登録" $ 0は常に0であるとすることはできませんしないでくださいアセンブラ/バイトコードで設定します。それがバイトコードで可能ですか? – halfdan

+0

私はかなり "register" 0を使用するのが良いと思います。私は0の代わりに1を使用して上記のプログラムを試してみましたが、同じエラーが発生しますが、 "register" 1。 – Jack

+0

Okは、 – halfdan

答えて

3

アドレスタイプ値をどのレジスタにもロードすることはできません。レジスタタイプ値を格納することはできません。

Java仮想マシン仕様:

+0

ありがとう、問題でなければなりません。その場合、私たちが持っているリターンアドレスを "保存"してbによって上書きされないようにする方法はありますか? – Jack

+0

スタックサイズなどの問題があるので、jsrとretを使ってメソッドを作ることはできません。代わりに、メソッドを "正しく"定義します。 – Jack

関連する問題