Question

I have been trying to write some Java bytecode and assemble it using Jasmin.

I am trying to get my head around subroutines, and am not sure why I obtain the following error message when running my program:

>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.

Here's the bytecode in 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

I haven't had any problems with jumping to a single subroutine, but it seems as though something is going wrong when jumping to a subroutine from within a subroutine.

Any insight as to why this is failing would be much appreciated!

Was it helpful?

Solution

You can't load an address type value into any register, you can only store it and then ret instruction can retrieve it from there.

Java Virtual Machine Specification:

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top