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语言课本最后面那道学生管理系 ...
随机推荐
- ZR 提高十连 DAY 4
哇 这题目怎么一次比一次毒瘤 当然这次还好 有会做的题目. T1 一眼看上去 毒瘤!再看一眼 我真不想看了 扔了. T2 哇感觉能写 哇这不是 随便都有40分了么 二分?优化一下65到手了.然后剩下的 ...
- Dynamics365 Field Service Work Order Theory
Come from :https://neilparkhurst.com/2016/08/20/field-service-work-order-theory/ In this post I aim ...
- Spring学习总结(4)-Spring生命周期的回调
参考文档:https://docs.spring.io/spring-framework/docs/current/spring-framework-reference/core.html#beans ...
- LeetCode(2)---路径总和
给定一个二叉树和一个目标和,判断该树中是否存在根节点到叶子节点的路径,这条路径上所有节点值相加等于目标和. 说明: 叶子节点是指没有子节点的节点. 示例: 给定如下二叉树,以及目标和 sum = ...
- python6.2类的封装
class Card(object): def __init__(self,num,pwd,ban): self.num=num#卡号 self.pwd=pwd#密码 self.__ban=ban#余 ...
- 都2020年了,你还不知道怎么学习Python吗?
众所周知,Python应用广泛,涵盖后端开发.游戏开发.网络爬虫.网站开发.数据挖掘.科学运算.大数据分析.云计算.人工智能等领域,感觉像神一样的存在.Python这么火,那么从入门到精通学习Pyth ...
- 教你看懂Docker和K8S!
转载于 https://my.oschina.net/jamesview/blog/2994112 2010年,几个搞IT的年轻人,在美国旧金山成立了一家名叫“dotCloud”的公司. 这家公司主要 ...
- Faiss流程与原理分析
1.Faiss简介 Faiss是Facebook AI团队开源的针对聚类和相似性搜索库,为稠密向量提供高效相似度搜索和聚类,支持十亿级别向量的搜索,是目前最为成熟的近似近邻搜索库.它包含多种搜索任意大 ...
- centos之hadoop的安装
Evernote Export 第一步 环境部署 参考 http://dblab.xmu.edu.cn/blog/install-hadoop-in-centos/ 1.创建hadoop用户 $su ...
- Java自学-图形界面 事件监听
Swing 如何进行事件监听 示例 1 : 按钮监听 创建一个匿名类实现ActionListener接口,当按钮被点击时,actionPerformed方法就会被调用 package gui; imp ...