IF_ICMPNE是什么意思?

时间:2019-01-29 16:01:44

标签: java jvm bytecode jvm-bytecode

对于以下Java类:

public class ArtClass {
   public boolean foo(int x) {
      if(x == 3956681)
        return true;
      else if(x == 9855021)
        return true;
      else if(x == 63085561)
          return true;
      else
        return false;
   }
}

其JVM指令为:

I4 Branch 1 IF_ICMPNE L3
I13 Branch 2 IF_ICMPNE L5
I22 Branch 3 IF_ICMPNE L7

我知道第一分支在第三行,第二和第三分支相同,但是IF_ICMPNE是什么意思,I4I13和{ {1}}是什么意思?

2 个答案:

答案 0 :(得分:5)

这是为您的课程生成的输出javap -cjavap是每个标准JDK附带的工具):

Compiled from "ArtClass.java"
public class ArtClass {
  public ArtClass();
    Code:
       0: aload_0
       1: invokespecial #1                  // Method java/lang/Object."<init>":()V
       4: return

  public boolean foo(int);
    Code:
       0: iload_1
       1: ldc           #2                  // int 3956681
       3: if_icmpne     8
       6: iconst_1
       7: ireturn
       8: iload_1
       9: ldc           #3                  // int 9855021
      11: if_icmpne     16
      14: iconst_1
      15: ireturn
      16: iload_1
      17: ldc           #4                  // int 63085561
      19: if_icmpne     24
      22: iconst_1
      23: ireturn
      24: iconst_0
      25: ireturn
}

所有指令的含义已在“Instruction Set” chapter of the The Java® Virtual Machine Specification中指定。指令if_icmpne将弹出两个 i nt值,它们是 c o mp ,然后跳转到指定的目标 n 是否 e 合格。

javap的输出非常清楚,分支指令已指定了哪些目标,因为它们与每条指令之前打印的数字相匹配。

如果您使用其他工具产生不同的输出,则必须参考该工具的文档,以了解如何解密输出。与javap的输出进行比较表明,像I4这样的前缀也引用了字节码偏移量,但没有进一步的上下文,例如看到该方法的其他说明,那是毫无意义的。

答案 1 :(得分:1)

此处是文档:http://homepages.inf.ed.ac.uk/kwxm/JVM/if_icmpne.html

if_icmpne

Description: 

jump to label if the two integer refs are not equal