当前位置: 首页 > 知识库问答 >
问题:

堆栈高度不一致%1!=2

南宫才艺
2023-03-14

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

共有1个答案

唐啸
2023-03-14

根据是否在第一次迭代时立即转到endloop(验证程序不检查或不查看值是否小于零),或者是否经历了循环,代码最终会有不同的堆栈高度。

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

在您的第一个IFLT之后,它从堆栈顶部删除了值1。然后将1添加到15,将值16留在堆栈中。

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

 类似资料:
  • 我们刚刚从IBM WebSphere7(Java 1.6)迁移到WebSphere9(Java 1.8)。我正面临长强制转换的问题,加载jsp时出现代码中断,下面的代码片段(这段代码是用jsp编写的): 下面是堆栈串, Exception:java.lang.VerifyError:JVMVRFY012堆栈形状不一致;class=com/ibm/_jsp/_tmtsstasksummary,met

  • 问题内容: 这有效:http : //play.golang.org/p/-Kv3xAguDR。 这导致堆栈溢出:http : //play.golang.org/p/1-AsHFj51O。 我不明白为什么。在这种情况下,使用接口的正确方法是什么? 问题答案: 这个 将呼叫您的,依次呼叫,等等。如果您需要解组JSON然后对其进行处理,那么一种巧妙的技术是声明一个本地类型,将数据解组到其中,然后转换

  • 我正在websphere portal 8.5版上部署maven war文件。在离开时,我遇到以下错误---- 谁能告诉我问题是什么以及如何解决它?

  • 我正在尝试做一个简单的Java字节码混淆器,它通过用简单的条件跳转替换指令来工作,例如,。我当前的代码是: 其中是混淆方法的参数,类型为,类实现接口。 这很好,但不是所有的方法都可以使用(我对字节码很陌生,所以不知道具体的情况)。例如,它可以很好地用于主方法: 原始Java代码(在Procyon中反编译):https://p.reflex.rip/DLMT.cs 原始字节码:https://p.r

  • 我正在使用一个正则表达式从任意长的输入字符串中提取键值对,并且遇到了这样的情况:对于具有重复模式的长字符串,它会导致堆栈溢出。 KV解析代码如下所示: 一些虚构的输出示例: 我显式地将generic放在上面,而不是在解析之前检查最大字符串长度的hacks(例如)。 我能想出的最粗俗的解决方法,一个真正的反模式,是 有趣的是,它在我试过的几次运行中都起作用了,但它不是一个值得推荐的有品位的东西。:-

  • 2. 堆栈 在第 3 节 “递归”中我们已经对堆栈这种数据结构有了初步认识。堆栈是一组元素的集合,类似于数组,不同之处在于,数组可以按下标随机访问,这次访问a[5]下次可以访问a[1],但是堆栈的访问规则被限制为Push和Pop两种操作,Push(入栈或压栈)向栈顶添加元素,Pop(出栈或弹出)则取出当前栈顶的元素,也就是说,只能访问栈顶元素而不能访问栈中其它元素。如果所有元素的类型相同,堆栈的存