Java 如果ICMPNE是什么意思?
对于以下Java类:Java 如果ICMPNE是什么意思?,java,jvm,bytecode,jvm-bytecode,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; } }
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是什么意思?这里有一个文档:
如果icmpne:
这里有一份文件:
如果icmpne:
这是输出,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
}
所有说明的含义已在附录中规定。指令将弹出两个int值,比较它们,如果不相等,则分支到指定的目标
javap的输出非常清楚,分支指令指定了哪些目标,因为它们与每条指令之前打印的数字相匹配
如果使用不同的工具生成不同的输出,则必须参考该工具的文档,了解如何解密输出。与javap的输出相比,这些前缀(如I4)也表示字节码偏移量,但没有进一步的上下文,例如看到该方法的其他指令,这毫无意义 这是输出,为类生成的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
}
所有说明的含义已在附录中规定。指令将弹出两个int值,比较它们,如果不相等,则分支到指定的目标
javap的输出非常清楚,分支指令指定了哪些目标,因为它们与每条指令之前打印的数字相匹配
如果使用不同的工具生成不同的输出,则必须参考该工具的文档,了解如何解密输出。与javap的输出相比,这些前缀(如I4)也表示字节码偏移量,但没有进一步的上下文,例如看到该方法的其他指令,这毫无意义 这可能是完全错误的,但我想猜测,如果整型比较不相等,那么ICMPNE是否意味着通常不喜欢lmgtfy答案/注释,但是。。。你试过谷歌搜索IF_ICMPNE吗?这就给了我答案。如果你的谷歌搜索结果与我的不同,你可能需要搜索类似java的东西。@yshavit这也是关于I4、I13、I22的。“我不能理解它们。@AdamAmin如果这是你不理解的部分,你应该编辑问题正文和标题来反映它。如前所述,主要问题是关于IF_ICMPNE。至于这些,我怀疑但不确定它们只是告诉您指令集中的字节偏移量。这是第4字节的指令,第13字节的指令,等等。你还应该发布你用来查看这些的工具,因为例如javap的格式稍有不同。@yshavit开你玩笑,当你谷歌if_icmpne是这个页面的时候,第一件事出现了,这可能是完全错误的,但是我想猜测,如果整数比较不相等,那么Icu ICMPNE是否意味着IF Integer Compare Not Equal通常不喜欢lmgtfy答案/注释,但是。。。你试过谷歌搜索IF_ICMPNE吗?这就给了我答案。如果你的谷歌搜索结果与我的不同,你可能需要搜索类似java的东西。@yshavit这也是关于I4、I13、I22的。“我不能理解它们。@AdamAmin如果这是你不理解的部分,你应该编辑问题正文和标题来反映它。如前所述,主要问题是关于IF_ICMPNE。至于这些,我怀疑但不确定它们只是告诉您指令集中的字节偏移量。这是第4字节的指令,第13字节的指令,等等。您还应该发布您正在使用的工具来查看这些内容,因为例如javap的格式稍有不同。@yshavit跟您开玩笑,当您搜索if_icmpne是这个页面时,首先出现的是lolHi Holger,如果不相等,则分支到指定的目标。分支意味着跳跃?像“后藤”这样的句子?Thanks@DiegoRamos是的,分支意味着“在指定的位置继续执行”,就像goto是一条无条件的分支指令一样。Hi Holger,如果不相等,则分支到指定的目标。分支意味着跳跃?像“后藤”这样的句子?Thanks@DiegoRamos是的,分支意味着“在指定位置继续执行”,就像goto是无条件分支指令一样。