IF_ICMPNE是什么意思



对于以下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是什么意思,I4I13I22是什么意思?

这是为类生成的输出javap -c(javap是每个标准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
}

所有指令的含义已在Java®虚拟机规范的"指令集"一章中指定。如果notequal,指令if_icmpne将弹出两个int值,comp就是它们,并分支到指定的目标

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

如果使用不同的工具产生不同的输出,则必须参考该工具的文档,了解如何解密输出。与javap的输出相比,这些前缀(如I4)也指字节码偏移,但没有进一步的上下文,例如看到该方法的其他指令,这就没有意义了。

这里有一个文档: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

相关内容

  • 没有找到相关文章

最新更新