C/C++教程

简单分析字节码指令执行中pc程序计数器,局部变量表,操作数栈的变化情况

本文主要是介绍简单分析字节码指令执行中pc程序计数器,局部变量表,操作数栈的变化情况,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

首先假设我们有如下的代码:
在这里插入图片描述
经编译后得到的字节码如下,前面的数字是指令地址:

0 bipush 15
2 istore_1
3 bipush 8
5 istore_2
6 iload_1
7 iload_2
8 iadd
9 istore_3
10 return

现在从最开头的指令开始,一步一步分析pc程序计数器,局部变量表,操作数栈的变化情况:

0 bipush 15 :将15压入操作数栈
pc寄存器:0
局部变量表:序号0:this引用
操作数栈:15

2 istore_1:将操作数栈的15出栈,并将15存入局部变量表的位序为1的槽中,因为0被this的引用占据了
pc寄存器:2
局部变量表:序号0:this引用, 序号1:15
操作数栈:

3 bipush 8:将8压入操作数栈
pc寄存器:3
局部变量表:序号0:this引用, 序号1:15
操作数栈:8

5 istore_2:将8出栈,并存入局部变量表位序为2的位置
pc寄存器:5
局部变量表:序号0:this引用,序号1:15 , 序号2:8
操作数栈:

6 iload_1:加载局部变量表序号为1的值出来
pc寄存器:6
局部变量表:序号0:this引用,序号1:15 ,序号2:8
操作数栈:15

7 iload_2:加载局部变量表序号为2的值出来
pc寄存器:7
局部变量表:序号0:this引用,序号1:15 , 序号2:8
操作数栈:15 8

8 iadd:将操作数栈的15和8都出栈,并由执行引擎执行相加的字节码指令,将结果放入操作数栈中
pc寄存器:8
局部变量表:序号0:this引用,序号1:15 ,序号2:8
操作数栈:23

9 istore_3:将相加的结果23出栈,存入局部变量表序号为3大的槽中
pc寄存器:9
局部变量表:序号0:this引用,序号1:15 ,序号2:8, 序号3:23
操作数栈:

10 return:结束(没有返回值)
pc寄存器:10
局部变量表:序号0:this引用,序号1:15 ,序号2:8, 序号3:23
操作数栈:

从以上可以看出,局部变量表的最大长度为4,操作数栈的最大深度为2
在这里插入图片描述

这篇关于简单分析字节码指令执行中pc程序计数器,局部变量表,操作数栈的变化情况的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!