JVM大作业5——指令集
JVM的每一个线程都有一个虚拟机栈,方法调用时,JVM会在虚拟机栈内为该方法创建一个栈帧。
一条线程,只有正在执行的方法对应的栈帧时可活动的,这个栈帧被称为当前栈帧,当前栈帧对应的方法被称为当前方法,当前方法对应的类被称为当前类
任何对于局部变量表和操作数栈的操作,都是对当前栈帧的局部变量表和操作数栈的操作
方法开始时,栈帧入栈。方法结束时,栈帧出栈,栈帧把自己的执行结果传给前一个栈帧。
!!局部变量表中:long和double占2个位置(低32位先入,后32位后入),其他的都占一个位置。
!!操作数栈:long和double占2个位置(低32位占据index,高32位占据index+1),其他都占一个位置
操作数栈:有许多指令可以从操作数栈取出数据,操作数据,然后把操作结果重新入栈。
以下为代码实现
JTread类代表线程,StackFrame代表线程栈(虚拟机栈),ThreadStack为栈帧,Vars为局部变量表,OperandStack为操作数栈
以下探讨操作数栈中的double和long的存储
public void pushLong(long value) {//todo 向操作数栈中push一个long
int low32=(int)(value&0x00000000FFFFFFFF);
int high32=(int)(value>>32)&0x00000000FFFFFFFF;
if (top >= maxStackSize) throw new StackOverflowError();
slots[top].setValue(low32);
top++;
if (top >= maxStackSize) throw new StackOverflowError();
slots[top].setValue(high32);
top++;
} public long popLong() {//todo 从操作数栈顶pop一个long top--;
if (top < 0) throw new EmptyStackException();
int high=slots[top].getValue();
slots[top] = new Slot();
top--;
if (top < 0) throw new EmptyStackException();
int low=slots[top].getValue();
slots[top] = new Slot();
long result=((long)high<<32)|low;
return result;
} public void pushDouble(double value) {//todo
long longvalue=Double.doubleToLongBits(value);
int low32=(int)longvalue&0x00000000FFFFFFFF;
int high32=(int)(longvalue>>32)&0x00000000FFFFFFFF;
if (top >= maxStackSize) throw new StackOverflowError();
slots[top].setValue(low32);
top++;
if (top >= maxStackSize) throw new StackOverflowError();
slots[top].setValue(high32);
top++;
} public double popDouble() {//todo 从操作数栈顶pop一个double
top--;
if (top < 0) throw new EmptyStackException();
int high=slots[top].getValue();
slots[top]=new Slot();
top--;
if (top < 0) throw new EmptyStackException();
int low=slots[top].getValue();
slots[top] = new Slot();
long resultLong=((long)high<<32)|low;
return Double.longBitsToDouble(resultLong);
}
以下为vars中存储long和double的操作
public void setLong(int index, long value) {
if (index < 0 || index >= maxSize) throw new IndexOutOfBoundsException();
int low=(int)(value&0x00000000FFFFFFFF);
int high=(int)((value>>32)&0x00000000FFFFFFFF);
varSlots[index].setValue(low);
varSlots[index+1].setValue(high);
} /**
* TODO:从局部变量表读取一个long类型变量
* @param index 变量的起始下标
* @return 变量的值
*/
public long getLong(int index){
if (index < 0 || index + 1 >= maxSize) throw new IndexOutOfBoundsException();
int low=varSlots[index].getValue();
int high=varSlots[index+1].getValue();
long result=((long)high<<32)|low;
return result;
} public void setDouble(int index, double value) {
if (index < 0 || index + 1 >= maxSize) throw new IndexOutOfBoundsException();
long longvalue=Double.doubleToLongBits(value);
int low32=(int)longvalue&0x00000000FFFFFFFF;
int high32=(int)(longvalue>>32)&0x00000000FFFFFFFF;
varSlots[index].setValue(low32);
varSlots[index+1].setValue(high32);
} public double getDouble(int index) {
if (index < 0 || index + 1 >= maxSize) throw new IndexOutOfBoundsException();
int low=varSlots[index].getValue();
int high=varSlots[index+1].getValue();
long resultLong=((long)high<<32)|low;
return Double.longBitsToDouble(resultLong);
}
DLOAD指令集
public class DLOAD extends Index8Instruction {
@Override
public void execute(StackFrame frame) {
System.out.println("执行了DLOAD的execute");
OperandStack stack=frame.getOperandStack();
Vars vars=frame.getLocalVars();
//一个double拆成两个int存在局部变量表中
int value1=vars.getInt(index);
int value2=vars.getInt(index+1);
long resultLong=((long)value2)<<32|value1;
double result=Double.longBitsToDouble(resultLong);
stack.pushDouble(result);
}
}
!!位运算要注意通过类型转换来扩充或减小位数
JVM大作业5——指令集的更多相关文章
- 数据库大作业--由python+flask
这个是项目一来是数据库大作业,另一方面也算是再对falsk和python熟悉下,好久不用会忘很快. 界面相比上一个项目好看很多,不过因为时间紧加上只有我一个人写,所以有很多地方逻辑写的比较繁琐,如果是 ...
- 程设大作业xjb写——魔方复原
鸽了那么久总算期中过[爆]去[炸]了...该是时候写写大作业了 [总不能丢给他们不会写的来做吧 一.三阶魔方的几个基本定义 ↑就像这样,可以定义面的称呼:上U下D左L右R前F后B UD之间的叫E,LR ...
- 大作业NABC分析结果
大作业NABC分析结果 这次的大作业计划制作一款关于七巧板的游戏软件.关于编写的APP的NABC需求分析: N:需求 ,本款软件主要面向一些在校的大学生,他们在校空闲时间比较多,而且热衷于一些益智类游 ...
- [留念贴] C#开发技术期末大作业——星月之痕
明天就要去上海大学参加 2015赛季 ACM/ICPC最后一场比赛 —— EC-Final,在这之前,顺利地把期末大作业赶出来了. 在这种期末大作业10个人里面有9个是从网上下载的国内计算机水平五六流 ...
- Hadoop综合大作业
Hadoop综合大作业 要求: 用Hive对爬虫大作业产生的文本文件(或者英文词频统计下载的英文长篇小说)词频统计. 用Hive对爬虫大作业产生的csv文件进行数据分析 1. 用Hive对爬虫大作业产 ...
- 爬虫综合大作业——网易云音乐爬虫 & 数据可视化分析
作业要求来自于https://edu.cnblogs.com/campus/gzcc/GZCC-16SE2/homework/3075 爬虫综合大作业 选择一个热点或者你感兴趣的主题. 选择爬取的对象 ...
- 期末Java Web大作业----简易的学生管理系统
学生信息管理系统(大作业) 2018-12-21:此文章已在我的网站更新,添加视图介绍等信息,源码请移步下载https://www.jeson.xin/javaweb-sims.html PS:首先不 ...
- CSAPP HITICS 大作业 hello's P2P by zsz
摘 要 摘要是论文内容的高度概括,应具有独立性和自含性,即不阅读论文的全文,就能获得必要的信息.摘要应包括本论文的目的.主要内容.方法.成果及其理论与实际意义.摘要中不宜使用公式.结构式.图表和非公知 ...
- #006 C语言大作业学生管理系统第三天
还差最后两部分 读取文件 恢复删除的学生信息 先学会处理文件的 知识点,再继续跟着视频做这个作业. 应该明天周六能把视频里手把手教的学生管理系统敲完 第二周尽量自己能完成C语言课本最后面那道学生管理系 ...
随机推荐
- try{}catch的隐藏(如何优雅的实现异常块)
在项目中,我们会遇到异常处理,对于运行时异常,需要我们自己判断处理.对于受检异常,需要我们主动处理. 但是繁琐的try{}caht嵌套在代码里,看着很不舒服,这里我们不讨论性能,就代码来讲,来看看如何 ...
- 牛客练习赛60 E 旗鼓相当的对手
LINK:旗鼓相当的对手 考场上遇到这种简单的树形dp优化题目我真的不一定能写出来.. 虽然这道题思路很简单 设f[i][j]表示距i距离为j的点的个数 g[i][j]表示距i距离为j的点权和. 可以 ...
- linux下使用vscode和makefile搭建C++开发环境
最近在linux上跑一些开源库做学习用, 顺手就搭了一下vscode的c++开发环境, 这里分享一下vscode进行C++开发的基本环境结构. 1. 首先是编辑器, vscode直接官网下载的, 后期 ...
- Python 为什么会有个奇怪的“...”对象?
本文出自"Python为什么"系列,请查看全部文章 在写上一篇<Python 为什么要有 pass 语句?>时,我想到一种特别的写法,很多人会把它当成 pass 语句的 ...
- LeetCode 算法 | 如何拆分数组?
题目: 给定长度为 2n 的数组, 你的任务是将这些数分成 n 对, 例如 (a1, b1), (a2, b2), ..., (an, bn) ,使得从1 到 n 的 min(ai, bi) 总和最大 ...
- Spring学习总结(5)-Spring依赖关系
参考资料:https://docs.spring.io/spring-framework/docs/current/spring-framework-reference/core.html#beans ...
- easyui 属性 事件 方法
在easyui当中 属性和事件可以按照json定义的对象来使用. /*在easyui中 属性和事件的使用方法相同*/ var loginWinJson = { closed: false, closa ...
- Socket 模拟HTTP客户端请求
import java.io.IOException; import java.io.InputStream; import java.io.OutputStreamWriter; import ja ...
- java final关键字与static关键字
一 final关键字 1.final修饰类不可以被继承,但是可以继承其他类. 例如: class Yy {} final class Fu extends Yy{} //可以继承Yy类 class ...
- C#LeetCode刷题-深度优先搜索
深度优先搜索篇 # 题名 刷题 通过率 难度 98 验证二叉搜索树 22.2% 中等 99 恢复二叉搜索树 45.1% 困难 100 相同的树 48.1% 简单 101 对称二叉树 4 ...