堆栈高度不一致 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
压入堆栈。
所以我试图在 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
压入堆栈。