0

所以我试图在 Jasmin 中创建一个简单的 for 循环,每次通过循环时都会打印出 hello world。问题是每当我尝试通过添加一个来增加它时,我都会收到以下错误消息:“错误:无法初始化主类测试,原因是:java.lang.VerifyError:(类:测试,方法:主签名:([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
4

1 回答 1

0

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

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

在您的 first 之后iflt,它1从堆栈顶部删除了该值。然后它添加115,将值16留在堆栈中。

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

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

于 2019-11-08T00:56:09.890 回答