堆栈高度不一致1!= 2

因此,我尝试在Jasmin中创建一个简单的for循环,该循环在每次循环时都会打印出hello世界。问题是,每当我尝试通过添加一个来增加它时,都会收到此错误消息, “错误:无法初始化主类测试 造成原因:java.lang.VerifyError :(类:test,方法:主要签名:([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
mfpaaa 回答:堆栈高度不一致1!= 2

您的代码最终以不同的堆栈高度而定,具体取决于您是在第一次迭代时立即进入var line = new createjs.Shape(); line.graphics.setStrokeStyle(3); line.graphics.beginStroke("#ff0000"); line.graphics.moveTo(0,0); line.graphics.lineTo(300,400); line.graphics.endStroke(); stage.addChild(line); stage.x = 300; // sets the graphic container to x=300 (验证程序不会检查或看到您的值永远不小于零)还是您拥有经历了循环。

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

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

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

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

本文链接:https://www.f2er.com/3140956.html

大家都在问