操作数栈代码追踪

一 代码

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

二 编译并解析

使用 javap 命令反编译 class 文件: javap -v 类名.class

三 说明

byte、short、char、boolean 内部都是使用 int 型来进行保存的。
通过 bipush 对操作数 15 和  8进行入栈操作。
通过 iadd 方法进行相加操作,i 代表的就是 int,也就是 int 类型的加法操作。

四 图解

第1条指令:首先执行第一条语句,PC寄存器指向的是 0,也就是指令地址为 0,然后使用 bipush 让操作数15入栈。
bipush:当 int 取值 -128 ~ 127 时,JVM采用 bipush 指令将常量压入栈中。

第2条指令:执行完后,让 PC + 1,指向下一行代码,下一行代码就是将操作数栈的元素存储到局部变量表 1 的位置,我们可以看到局部变量表的已经增加了一个元素。
istore:将一个数值从操作数栈存储到局部变量表,该数值会从操作数栈弹出。

为什么局部变量表不是从 0 开始的呢? 
其实局部变量表也是从 0 开始的,但是因为 0 号位置存储的是 this 指针,这里就直接省略了,没有在图中画出。
第3条指令:PC+1,指向的是下一行。让操作数 8 也入栈。

第4条指令:PC+1,指向的是下一行。同时执行 store 操作,存入局部变量表中。
![image-20200706093751711](images/image-20200706093751711.png)
第5条指令:PC+1,指向的是下一行。从局部变量表中,将数据15加载到操作数栈中。
iload:将一个局部变量加载到操纵栈。

第6条指令:PC+1,指向的是下一行。从局部变量表中,将数据8加载到操作数栈中。

第7条指令:PC+1,指向的是下一行。将操作数栈中的两个元素执行相加操作,操作结果放入操作数栈。
iadd:将栈顶两 int 型数值相加并将结果压入栈顶。

第8条指令:PC+1,指向的是下一行。将操作数栈值存储到局部变量表3的位置。

第9条指令:PC+1,指向的是下一行。最后PC寄存器的位置指向10,也就是 return 方法,直接退出方法

五 JVM指令集及各指令的详细使用说明

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值