jvm代码深入追踪-操作数栈-局部变量表-pc寄存器的执行过程
程序员文章站
2022-05-12 14:02:23
...
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的位置
这时,操作数栈是空的了
-
pc寄存器指令地址为6,执行操作指令iload_1,意思就是将局部变量表中1的位置的数据压入操作数栈中。
-
同样,pc寄存器指令地址为7,执行操作指令iload_2,意思就是将局部变量表中2的位置的数据压入操作数栈中。
此时,栈顶指针指向的是8。
7.pc寄存器指令地址为8,执行操作指令iadd,意思就是将操作数栈中的两个数进行出栈相加后再压栈,也就是8+15=23,将23再压栈,如上图。(这里的相加是通过执行引擎,最终在cpu相加,具体看后面文章,这边先不细说)
- pc寄存器指令地址为9,执行操作指令istore_3,意思就是将操作数栈顶元素23存入局部变量表中位置为3的地方。
- 最终return返回。
上一篇: Hook框架xposed的简单demo