IF_ICMPNE 是什么意思?
What does IF_ICMPNE mean?
对于以下 Java class:
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
是什么意思,I4
、I13
是什么意思, I22
是什么意思?
这里是文档: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
这是为您的 class 生成的 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
}
所有指令的含义已在“Instruction Set” chapter of the The Java® Virtual Machine Specification. The instruction if_icmpne中指定,将弹出两个int值,comp是他们,分支到指定目标if not e合格。
javap
的输出非常清楚,分支指令指定了哪些目标,因为它们与每条指令之前打印的数字相匹配。
如果您使用不同的工具产生不同的输出,您必须参考该工具的文档,了解如何解密输出。与 javap
的输出相比,这些前缀如 I4
也指的是字节码偏移量,但没有进一步的上下文,例如看到方法的其他说明,那是没有意义的。
对于以下 Java class:
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
是什么意思,I4
、I13
是什么意思, I22
是什么意思?
这里是文档: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
这是为您的 class 生成的 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
}
所有指令的含义已在“Instruction Set” chapter of the The Java® Virtual Machine Specification. The instruction if_icmpne中指定,将弹出两个int值,comp是他们,分支到指定目标if not e合格。
javap
的输出非常清楚,分支指令指定了哪些目标,因为它们与每条指令之前打印的数字相匹配。
如果您使用不同的工具产生不同的输出,您必须参考该工具的文档,了解如何解密输出。与 javap
的输出相比,这些前缀如 I4
也指的是字节码偏移量,但没有进一步的上下文,例如看到方法的其他说明,那是没有意义的。