使用jsr指令进行Java递归

Ale*_*lex 4 java assembly jvm bytecode jasmin

我使用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
Run Code Online (Sandbox Code Playgroud)

tem*_*def 11

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

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

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

  • 这样你就有了固定大小的帧,`jsr`只被javac用于`finally`块(不再使用它). (2认同)