JAVA虚拟机20-基于栈的解释器执行过程示例
2024-10-20 16:43:23
1.准备代码
public int calc() {
int a = 100;
int b = 200;
int c = 300;
return (a + b) * c;
}
2.使用javap -verbose查看class文件
该方法主要的指令内容如下
public int calc();
Code:
Stack=2, Locals=4, Args_size=1
0: bipush 100
2: istore_1
3: sipush 200
6: istore_2
7: sipush 300
10: istore_3
11: iload_1
12: iload_2
13: iadd
14: iload_3
15: imul
16: ireturn
}
javap提示这段代码需要深度为2的操作数栈和4个变量槽的局部变量空间
3.执行过程
3.1偏移量为0的指令
首先,执行偏移地址为0的指令,Bipush指令的作用是将单字节的整型常量值(-128~127)推入操作数栈顶,跟随有一个参数,指明推送的常量值,这里是100。
3.2偏移量为2的指令
istore_1指令的作用是将操作数栈顶的整型值出栈并存放到第1个局部变量槽中。
后续几条条指令(直到偏移为11的指令为止)都是做一样的事情,也就是在对应代码中把变量a、b、c赋值为100、200、300。
3.3偏移量11的指令
iload_1指令的作用是将局部变量表第1个变量槽中的整型值复制到操作数栈顶。
3.4偏移量为12
iload_2指令的执行过程与iload_1类似,把第2个变量槽的整型值入栈。
3.5偏移量为13
iadd指令的作用是将操作数栈中头两个栈顶元素出栈,做整型加法,然后把结果重新入栈。在iadd指令执行完毕后,栈中原有的100和200被出栈,它们的和300被重新入栈。
3.6偏移量为14的指令
iload_3指令把存放在第3个局部变量槽中的300入栈到操作数栈中。这时操作数栈为两个整数300。
3.8偏移量15的指令
imul是将操作数栈中头两个栈顶元素出栈,做整型乘法,然后把结果重新入栈,与iadd完全类似。
3.7偏移量16的指令
ireturn指令是方法返回指令之一,它将结束方法执行并将操作数栈顶的整型值返回给该方法的调用者。
到此为止,这段方法执行结束。
参考<<深入理解java虚拟机3>>
最新文章
- 分享一个php的启动关闭脚本(原)
- mysql 常用查询
- VIM的强大功能
- [麦先生]Laravel SQL语句记录方式
- sqlmap我常用到的几个参数
- 实验二Step1-有序顺序表
- 李洪强iOS开发之【零基础学习iOS开发】【02-C语言】08-基本运算
- 部署MongoDB扩展并测试使用php简单连接操作之
- MD中bitmap源代码分析--数据结构
- linux 安装gcc和g++
- Apriori关联分析算法概述
- [51nod1410]回文调整
- JAVA开发中遇到的异常总结
- 洛谷 P1053 音乐会的等待 解题报告
- jQuery的$.getScript方法去加载javaScript文档解析
- 黑客编程教程(六)Windows的关机和重起
- 跟我学算法-tensorflow 实现卷积神经网络附带保存和读取
- Golang开发环境搭建-Vim篇
- 标准C++ I/O库 迭代器让数据自由流动 V8
- SecureCRT中 secureCRT使用VIM时对语法高亮