使用jsr指令的Java递归

发布于 2024-10-18 17:32:50 字数 437 浏览 3 评论 0原文

我正在使用 Jasmin Java 汇编器来编译玩具语言。但是,当我使用 jsr 指令递归回子例程,并使用 java 运行 Jasmin 的输出时,我收到错误“递归调用 jsr 条目”。这是 Jasmin 代码(它正在计算 5!(我省略了类定义;所有这些都在主方法体中)):

f:
   swap
   istore 2
   iload 2
   ifeq label0
   iload 2
   iload 2
   ldc 1
   isub
   jsr f
   istore 1
   istore 2
   iload 1
   iload 2
   imul
   goto label1
label0:
   ldc 1
label1:
   swap
   astore 0
   ret 0
main:
   ldc 5
   jsr f
   istore 1
   iload 1

I am using the Jasmin Java assembler to compile a toy language. But when I use the jsr instruction to recurse back into a subroutine, and run the output of Jasmin using java, I get the error "Recursive call to jsr entry". Here is the Jasmin code (it's computing 5! (I've left out the class definitions; all this is in the main method body)):

f:
   swap
   istore 2
   iload 2
   ifeq label0
   iload 2
   iload 2
   ldc 1
   isub
   jsr f
   istore 1
   istore 2
   iload 1
   iload 2
   imul
   goto label1
label0:
   ldc 1
label1:
   swap
   astore 0
   ret 0
main:
   ldc 5
   jsr f
   istore 1
   iload 1

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

戒ㄋ 2024-10-25 17:32:50

§4.8.2 明确禁止递归 jsr JVM 规范

如果子例程已存在于子例程调用链中,则不能使用 jsr 或 jsr_w 指令来递归调用该子例程。 (在finally子句中使用try-finally结构时,可以嵌套子例程。有关Java虚拟机子例程的更多信息,请参阅第4.9.6节。)

这主要是为了简化字节码验证器的逻辑,以便它可以确保适当的状态在子程序中保存和恢复。

Recursive jsr's are explicitly forbidden by §4.8.2 of the JVM spec:

No jsr or jsr_w instruction may be used to recursively call a subroutine if that subroutine is already present in the subroutine call chain. (Subroutines can be nested when using try-finally constructs from within a finally clause. For more information on Java virtual machine subroutines, see §4.9.6.)

This is primarily to simplify the logic of the bytecode verifier so that it can ensure that appropriate state is saved and restored in a subroutine.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文