堆叠高度不一致1=2



所以我试图在Jasmin中制作一个简单的for循环,每次循环时都会打印出hello world。问题是,每当我试图通过添加一个来增加它时,我都会得到这样的错误:,"错误:无法初始化主类测试由: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

您的代码最终会有不同的堆栈高度,这取决于您是否在第一次迭代时立即转到endLoop(验证器不会检查或查看您的值是否从不小于零(,或者您是否已经完成了循环。

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

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

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

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

最新更新