关于操作数栈和局部变量表传递参数的一些理解


关于操作数栈和局部变量表传递参数的一些理解


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 将栈顶元素当做返回值返回给上一层
         */
    }
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值