给出指令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;
}
}
我希望这两种方法具有不同的框架。那么这应该意味着用于存储a
和b
的指令将是istore_0
和istore_1
。与用于存储c
和d
的索引相同。但是由于某种原因,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
是这样吗?如果是这样,为什么?
<< [parameters传递给静态方法as从位置0开始的局部变量。因此,对于main
,args
数组位于位置0的局部变量中。编译代码尽管我没有方便的编译器,但是用args
进行的操作应证明这一点。
this
位于位置0,然后其余参数从位置1开始。)有关详细信息,请参见section 2.6.1。