Что означает IF_ICMPNE? - PullRequest
       60

Что означает IF_ICMPNE?

0 голосов
/ 29 января 2019

Для следующего класса 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, а также что означают I4, I13 и I22?

Ответы [ 2 ]

0 голосов
/ 29 января 2019

Это вывод, 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® .Инструкция if_icmpne отобразит два i nt значения, c o mp и они перейдут к указанной цели , если n ot e qual.

Вывод javap довольно ясно показывает, какие цели были указаны в инструкциях ветвления, так как они совпадаютчисла, напечатанные перед каждой инструкцией.

Если вы используете другой инструмент, производящий разные выходные данные, вы должны обратиться к документации инструмента относительно того, как расшифровать выходные данные.Сравнение с выводом javap показывает, что эти префиксы, такие как I4, также относятся к смещениям байт-кода, но без дополнительного контекста, например, видя другие инструкции метода, это бессмысленно.

0 голосов
/ 29 января 2019

здесь документ: 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
...