istore指令是否在主要方法中从索引1开始?

问题描述 投票:0回答:1

给出指令istore_<n>及其documentation

n必须是当前帧的局部变量数组的索引(第2.6节)。

它没有指定它从什么索引开始。我假设为0。对于给定的istore操作,它应该增加1。

给出一个简单的类:

public class TestingStuff {
    public static void main(String[] args) {
        int a = 11;
        int b = 12;

    }

    public static void test() {
        int c = 13;
        int d = 14;
    }
}

我希望这两种方法具有不同的框架。那么这应该意味着用于存储ab的指令将是istore_0istore_1。与用于存储cd的索引相同。但是由于某种原因,main方法中的索引从1开始。这种似乎总是这样。但是我找不到关于为什么的任何信息。

javap输出:

  public static void main(java.lang.String[]);
    descriptor: ([Ljava/lang/String;)V
    flags: ACC_PUBLIC, ACC_STATIC
    Code:
      stack=1, locals=3, args_size=1
         0: bipush        11
         2: istore_1
         3: bipush        12
         5: istore_2
         6: return

  public static void test();
    descriptor: ()V
    flags: ACC_PUBLIC, ACC_STATIC
    Code:
      stack=1, locals=2, args_size=0
         0: bipush        13
         2: istore_0
         3: bipush        14
         5: istore_1
         6: return

是这样吗?如果是这样,为什么?

java jvm jvm-bytecode javap
1个回答
1
投票

<< [parameters传递给静态方法as从位置0开始的局部变量。因此,对于mainargs数组位于位置0的局部变量中。编译代码尽管我没有方便的编译器,但是用args进行的操作应证明这一点。

((对于实例方法,this位于位置0,然后其余参数从位置1开始。)

有关详细信息,请参见section 2.6.1

© www.soinside.com 2019 - 2024. All rights reserved.