关于操作数栈和局部变量表传递参数的一些理解
package com.OperandStack;
public class test01 {
/**
* 测试操作数栈
*/
public int getSum(int m, int n) {
int k = m + n;
return k;
}
public void testSum() {
int k = this.getSum(3, 4);
/**
* 栈的元素为objectref, [arg1, [arg2 ...]] →
*testSum函数的字节码:
* 0 aload_0 将局部变量表中的索引位置为0的引用类型变量推送至栈顶,这里就是this 栈:this
* 1 iconst_3 把int型3推送至栈顶 栈:this, 3 →
* 2 iconst_4 把int型4推送至栈顶 栈:this, 3, 4 →
* 3 invokevirtual #2 <com/OperandStack/test01.getSum> 调用实例方法getSum,
* 如果解析出来的方法不是native的,所有的参数和this从操作数栈中弹出。在JVM栈上为当前准备调用的方法创建一个新的栈帧。
* this和所有参数被按照如下顺序作为新栈帧的局部变量,this占slot0,arg1即3占slot1(否则,如果arg1为long或double类型,则占slot1和slot2),
* 以此类推,arg2即4占slot2。对于float类型参数,在存入局部变量表之前会先进行值集转换。
* 此时本栈帧的PC寄存器指向本条语句,
* 新的栈帧成为当前栈帧,JVM的PC设置为即将调用方法的第一条指令的操作码,程序执行从第一条指令继续进行。
*
* 程序开始执行getSum函数:写在下面注释
*
* 程序执行完getSum之后,本栈帧的栈顶元素(有且仅有这一个元素了)为getSum函数的返回值
* 6 istore_1 将栈顶int数值存入局部变量表索引位置为1的slot:7
* 7 return 返回void给上一层
*
*/
/**
* getSum函数字节码
* 当程序执行到这个函数的时候,已经有这个函数的栈帧,而且其局部变量表中也存上了数值:this占slot0,arg1即3占slot1,arg2即4占slot2
* 0 iload_1 把局部变量表中索引位置为1的int型数据推送至栈顶:3
* 1 iload_2 把局部变量表中索引位置为2的int型数据推送至栈顶:4
* 2 iadd 将栈顶两个int数值相加并将结果压入栈顶:7
* 3 istore_3 将栈顶int数值存入局部变量表索引位置为3的slot:7
* 4 iload_3 将把局部变量表中索引位置为3的int型数据推送至栈顶:7
* 5 ireturn 将栈顶元素当做返回值返回给上一层
*/
}
}