使用jsr指令进行Java递归

时间:2011-02-21 20:48:56

标签: java jvm bytecode assembly 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

1 个答案:

答案 0 :(得分:11)

§4.8.2 of the JVM spec明确禁止递归jsr:

  

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

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