jvm代码深入追踪-操作数栈-局部变量表-pc寄存器的执行过程

public class OperandStackTest {
    public void testAddOperation() {
        byte i = 15;
        int j = 8;
        int k = i + j;
    }

byte、short、char、boolean:都是int型来保存的(当然int本身也是用int型来保存的),long和double都是占64位。
在这里插入图片描述

所以在jclasslib中存的是用int类型存储的,bipush。

取的时候,也是用int类型存储的,即iload。

分析

在这里插入图片描述

1.首先pc寄存器存的指令地址为0,所以执行bipush操作指令,将byte类型的15转为int类型压入操作数栈。

2.然后pc寄存器的指令地址变为2,则执行istore_1操作指令,意思是将上面的15存在局部变量表的下标为1的位置。有人可能会问,为什么局部变量表会从1开始,而不是从0开始。

非静态的方法,局部变量表0的位置存放的是this。
在这里插入图片描述

在这里插入图片描述

3.pc寄存器指令地址为3,执行操作指令bipush,将8再压入栈中。

4.pc寄存器指令地址5,执行操作指令istore_2,将栈顶的8存入局部变量表2的位置

这时,操作数栈是空的了

在这里插入图片描述

  1. pc寄存器指令地址为6,执行操作指令iload_1,意思就是将局部变量表中1的位置的数据压入操作数栈中。

  2. 同样,pc寄存器指令地址为7,执行操作指令iload_2,意思就是将局部变量表中2的位置的数据压入操作数栈中。

    此时,栈顶指针指向的是8。

在这里插入图片描述

7.pc寄存器指令地址为8,执行操作指令iadd,意思就是将操作数栈中的两个数进行出栈相加后再压栈,也就是8+15=23,将23再压栈,如上图。(这里的相加是通过执行引擎,最终在cpu相加,具体看后面文章,这边先不细说)

  1. pc寄存器指令地址为9,执行操作指令istore_3,意思就是将操作数栈顶元素23存入局部变量表中位置为3的地方。
  2. 最终return返回。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值