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