Java 字节码子例程 - 无法加载返回地址

标签 java bytecode subroutine jasmin

我一直在尝试编写一些 Java 字节码并使用 Jasmin 对其进行组装。

我正在尝试了解子例程,但不确定为什么在运行我的程序时会收到以下错误消息:

>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

我在跳转到单个子例程时没有遇到任何问题,但是从子例程内部跳转到子例程时似乎出了点问题。

任何关于失败原因的见解都将不胜感激!

最佳答案

您不能将地址类型值加载到任何寄存器中,您只能存储它,然后 ret 指令可以从那里检索它。

Java 虚拟机规范:

关于Java 字节码子例程 - 无法加载返回地址,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8456048/

相关文章:

java - 使用 Selenium 在 Chrome 上处理 "Your connection to this site is not private"弹出窗口

java - 可继承 "Generic"JUnit 4测试套件

JavaFX ComboBox OnChangeListener 回滚变化

java - 在没有源代码的已编译 1.6 Java 类中更改整数字段的最佳方法

fortran - Fortran 中的可变长度参数列表?

Java中缀计算器逻辑

java - JBoss 类中的 LocalVariableTable 已损坏

java - 使用 javassist 在运行时强制所有 Java 算术为 strictfp?

Perl:使父子例程(而不是方法)可供子例程使用的最佳方法

syntax - 这些代码属于哪个 Fortran 标准?