指令 istore 是否从 main 方法中的索引 1 开始?

Does the instruction istore start at index 1 in the main method?

给定指令 istore_<n> 及其 documentation:

n must be an index into the local variable array of the current frame (§2.6).

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

给出一个简单的class:

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

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

静态方法的参数作为局部变量从位置0开始传递。因此,对于mainargs 数组位于位置 0 的局部变量中。编译使用 args 执行某些操作的代码应该证明这一点,尽管我手边没有编译器。

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

详情见section 2.6.1