所以我试图在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
。然后,它将1
与15
相加,将值16
留在堆栈中。
下一个iflt
从堆栈中弹出值16
——在下一次迭代中,iadd
将失败,因为堆栈上只有一个值(1
(,而iadd
需要两个。
作为一种解决方案,您可能希望使用if_icmpge
来检查您的计数器是否大于15,对于每次比较,您首先要dup
您的计数器,然后在堆栈上推送常量15
。