堆栈高度不一致 1 !=2

Inconsistent stack height 1 !=2

所以我试图在 Jasmin 中制作一个简单的 for 循环,每次它通过循环时都会打印出 hello world。问题是每当我尝试通过添加一个来增加它时,我都会收到此错误消息, “错误:无法初始化主 class 测试 Caused by: java.lang.VerifyError: (class: test, method: main signature: ([Ljava/lang/String;)V) 堆栈高度不一致 1 != 2" 当我不尝试添加时它可以工作,但不确定为什么当我把它放回去时它不工作。任何帮助将不胜感激!

.class public test
.super java/lang/Object

.method public <init>()V
   aload_0
   invokenonvirtual java/lang/Object/<init>()V
   return
.end method

.method public static main([Ljava/lang/String;)V
   .limit stack 5

   ldc 15
   ldc 1
startLoop:
   iflt endLoop
   getstatic java/lang/System/out Ljava/io/PrintStream;
   ldc "hello world"
   invokevirtual java/io/PrintStream/print(Ljava/lang/String;)V
   ldc 1
   iadd
   goto startLoop
endLoop:
   return
.end method

您的代码以不同的堆栈高度结束,具体取决于您是否在第一次迭代时立即转到 endLoop(验证程序不会检查或发现您的值永远不会小于零)或者是否你已经完成了循环。

请记住,iflt 将堆栈顶部与零进行比较,如果小于零,则转到 endLoop。在此过程中,它从堆栈顶部删除值。

在您的第一个 iflt 之后,它从堆栈顶部删除了值 1。然后它将 1 添加到 15,将值 16 留在堆栈中。

下一个 iflt 从堆栈中弹出值 16 - 在下一次迭代中 iadd 将失败,因为堆栈上只有一个值 (1) 和 iadd 需要两个。

作为解决方案,您可能想使用 if_icmpge 来检查您的计数器是否大于 15, 对于每次比较,您首先要 dup 您的计数器,然后将常量 15 压入堆栈。