Java栈和局部变量操作(二)
2通用栈操作
操作码 |
操作数 |
说明 |
---|---|---|
nop |
(无) |
不做任何操作 |
pop |
(无) |
从操作数栈弹出栈顶部的一个字 |
pop2 |
(无) |
从操作数栈弹出最顶端的两个字 |
swap |
(无) |
交换栈顶部的两个字 |
dup |
(无) |
复制栈顶部的一个字 |
dup2 |
(无) |
复制栈顶部的两个字 |
dup_x1 |
(无) |
复制栈顶部的一个字,并将复制内容及原来弹出的两个字长的内容压入栈 |
dup_x2 |
(无) |
复制栈顶部的一个字,并将复制内容及原来弹出的三个字长的内容压入栈 |
dup2_x1 |
(无) |
复制栈顶部的两个字,并将复制内容及原来弹出的三个字长的内容压入栈 |
dup2_x2 |
(无) |
复制栈顶部的两个字,并将复制内容及原来弹出的四个字长的内容压入栈 |
1,dup:复制栈顶部的一个字长的内容。
栈:
前:......,word
后:......,word,word
2,dup_x1:复制栈顶部一个字长的内容,然后将复制内容及原来弹出的两个字长的内容压入栈
栈:
前:......,word2,word1
后:......,word1,word2,word1
3,dup_x2:复制栈顶部一个字长的内容,然后将复制内容及原来弹出的三个字长的内容压入栈
栈:
前:.......,word3,word2,word1
后:.......,word1,word3,word2,word1
4,dup2:复制栈顶部长度为两个字长的内容
栈:
前:......,word2,word1
后:......,word2,word1,word2,word1
5,dup2_x1:复制栈顶部两个字长的内容,然后将复制内容及原来弹出的三个字长的内容压入栈
栈:
前:......,word3,word2,word1
后:.......,word2,word1,word3,word2,word1
6,dup2_x2:复制栈顶部两个字长的内容,然后将复制内容及原来弹出的四个字长的内容压入栈
栈:
前:......,word4,word3,word2,word1
后:.......,word2,word1,word4,word3,word2,word1
7,pop:弹出栈顶端一个字长的内容
栈:
前:......,word
后:.......
8,pop2:弹出栈顶端两个字长的内容
栈:
前:......,word2,word1
后:.......
9,swap:交换栈顶端两个字的内容
栈:
前:......,word2,word1
后:.......,word1,word2
例如如下代码:
public class StackTest {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
String a;
String b;
a = new String("aaa");
b = new String("aaa");
}
}
用javap工具查看其字节码为:
Compiled from "StackTest.java"
public class StackTest extends java.lang.Object{
public StackTest();
Code:
0: aload_0
1: invokespecial #8; //Method java/lang/Object."<init>":()V
4: return
public static void main(java.lang.String[]);
Code:
0: new #16; //class java/lang/String
3: dup
4: ldc #18; //String aaa
6: invokespecial #20; //Method java/lang/String."<init>":(Ljava/lang/String;)V
9: astore_1
10: new #16; //class java/lang/String
13: dup
14: ldc #18; //String aaa
16: invokespecial #20; //Method java/lang/String."<init>":(Ljava/lang/String;)V
19: astore_2
20: return
}
3,把局部变量压入栈
将一个字长的局部变量压入栈
操作码 |
操作数 |
说明 |
---|---|---|
iload |
vindex |
将位置为vindex的int类型的局部变量压入栈 |
iload_0 |
(无) |
将位置为0的int类型的局部变量压入栈 |
iload_1 |
(无) |
将位置为1的int类型的局部变量压入栈 |
iload_2 |
(无) |
将位置为2的int类型的局部变量压入栈 |
iload_3 |
(无) |
将位置为3的int类型的局部变量压入栈 |
fload |
vindex |
将位置为vindex的float类型的局部变量压入栈 |
fload_0 |
(无) |
将位置为0的float类型的局部变量压入栈 |
fload_1 |
(无) |
将位置为1的float类型的局部变量压入栈 |
fload_2 |
(无) |
将位置为2的float类型的局部变量压入栈 |
fload_3 |
(无) |
将位置为3的float类型的局部变量压入栈 |
将两个字长的局部变量压入栈
操作码 |
操作数 |
说明 |
---|---|---|
lload |
vindex |
将位置为vindex和(vindex+1)的long类型的局部变量压入栈 |
lload_0 |
(无) |
将位置为0和1的long类型的局部变量压入栈 |
lload_1 |
(无) |
将位置为1和2的long类型的局部变量压入栈 |
lload_2 |
(无) |
将位置为2和3的long类型的局部变量压入栈 |
lload_3 |
(无) |
将位置为3和4的long类型的局部变量压入栈 |
dload |
vindex |
将位置为vindex和(vindex+1)的double类型的局部变量压入栈 |
dload_0 |
(无) |
将位置为0和1的double类型的局部变量压入栈 |
dload_1 |
(无) |
将位置为1和2的double类型的局部变量压入栈 |
dload_2 |
(无) |
将位置为2和3double类型的局部变量压入栈 |
dload_3 |
(无) |
将位置为3和4double类型的局部变量压入栈 |
将对象引用局部变量压入栈
操作码 |
操作数 |
说明 |
---|---|---|
aload |
vindex |
将位置为vindex的对象引用局部变量压入栈 |
aload_0 |
(无) |
将位置为0的对象引用局部变量压入栈 |
aload_1 |
(无) |
将位置为1的对象引用局部变量压入栈 |
aload_2 |
(无) |
将位置为2的对象引用局部变量压入栈 |
aload_3 |
(无) |
将位置为3的对象引用局部变量压入栈 |
4,弹出栈顶元素,将其赋给局部变量
弹出一个字长的值,将其赋给局部变量
操作码 |
操作数 |
说明 |
---|---|---|
istore |
vindex |
从栈中弹出int类型值,然后将其存到位置为vindex的局部变量中 |
istore_0 |
(无) |
从栈中弹出int类型值,然后将其存到位置为0的局部变量中 |
istore_1 |
(无) |
从栈中弹出int类型值,然后将其存到位置为1的局部变量中 |
istore_2 |
(无) |
从栈中弹出int类型值,然后将其存到位置为2的局部变量中 |
istore_3 |
(无) |
从栈中弹出int类型值,然后将其存到位置为3的局部变量中 |
fstore |
vindex |
从栈中弹出float类型值,然后将其存到位置为vindex的局部变量中 |
fstore_0 |
(无) |
从栈中弹出float类型值,然后将其存到位置为0的局部变量中 |
fstore_1 |
(无) |
从栈中弹出float类型值,然后将其存到位置为1的局部变量中 |
fstore_2 |
(无) |
从栈中弹出float类型值,然后将其存到位置为2的局部变量中 |
fstore_3 |
(无) |
从栈中弹出float类型值,然后将其存到位置为3的局部变量中 |
弹出对象引用,并将其赋值给局部变量
操作码 |
操作数 |
说明 |
---|---|---|
lstore |
vindex |
从栈中弹出long类型值,然后将其存到位置为vindex和(vindex+1)的局部变量中 |
lstore_0 |
(无) |
从栈中弹出long类型值,然后将其存到位置为0和1的局部变量中 |
lstore_1 |
(无) |
从栈中弹出long类型值,然后将其存到位置为1和2的局部变量中 |
lstore_2 |
(无) |
从栈中弹出long类型值,然后将其存到位置为2和3的局部变量中 |
lstore_3 |
(无) |
从栈中弹出long类型值,然后将其存到位置为3和4的局部变量中 |
dstore |
vindex |
从栈中弹出double类型值,然后将其存到位置为vindex和(vindex+1)的局部变量中 |
dstore_0 |
(无) |
从栈中弹出double类型值,然后将其存到位置为0和1的局部变量中 |
dstore_1 |
(无) |
从栈中弹出double类型值,然后将其存到位置为1和2的局部变量中 |
dstore_2 |
(无) |
从栈中弹出double类型值,然后将其存到位置为2和3的局部变量中 |
dstore_3 |
(无) |
从栈中弹出double类型值,然后将其存到位置为3和4的局部变量中 |
操作码 |
操作数 |
说明 |
---|---|---|
astore |
vindex |
从栈中弹出对象引用,然后将其存到位置为vindex的局部变量中 |
astore_0 |
(无) |
从栈中弹出对象引用,然后将其存到位置为0的局部变量中 |
astore_1 |
(无) |
从栈中弹出对象引用,然后将其存到位置为1的局部变量中 |
astore_2 |
(无) |
从栈中弹出对象引用,然后将其存到位置为2的局部变量中 |
astore_3 |
(无) |
从栈中弹出对象引用,然后将其存到位置为3的局部变量中 |
5,wide指令
无符号8位局部变量索引,把方法中局部变量数的限制在256以下。一条单独的wide指令可以将8位的索引再扩展8位,就可以把局部变量数的限制扩展到65536.
操作码 |
操作数 |
说明 |
---|---|---|
wide |
iload,index |
从局部变量位置为index的地方取出int类型值,并将其压入栈 |
wide |
lload ,index |
从局部变量位置为index的地方取出long类型值,并将其压入栈 |
wide |
fload,index |
从局部变量位置为index的地方取出float类型值,并将其压入栈 |
wide |
dload,index |
从局部变量位置为index的地方取出double类型值,并将其压入栈 |
wide |
aload,index |
从局部变量位置为index的地方取出对象引用,并将其压入栈 |
wide |
istore,index |
从栈中弹出int类型值,将其存入位置为index的局部变量中 |
wide |
lstore,index |
从栈中弹出long类型值,将其存入位置为index的局部变量中 |
wide |
fstore,index |
从栈中弹出float类型值,将其存入位置为index的局部变量中 |
wide |
dstore,index |
从栈中弹出double类型值,将其存入位置为index的局部变量中 |
wide |
astore,index |
从栈中弹出对象引用,将其存入位置为index的局部变量中 |
跳转指令并不允许直接跳转到被wide指令修改过的操作码。
Java栈和局部变量操作(二)相关推荐
- java 栈的变量_Java栈和局部变量操作(一)
Java栈和局部变量操作 Java虚拟机是基于栈的机器,几乎所有Java虚拟机的指令都与操作数栈相关.栈操作包括把常量压入操作数栈.执行通用的栈操作.在操作数栈和局部变量之间往返传输值. 1常量入栈操 ...
- 深入Java核心:JVM中的栈和局部变量
2019独角兽企业重金招聘Python工程师标准>>> Java开发中,每当我们在程序中使用new生成一个对象,对象的引用存放在栈里,而对象是存放在堆里的.可以看出栈在Java核心的 ...
- JVM中的栈和局部变量
JVM中的栈和局部变量 Java开发中,每当我们在程序中使用new生成一个对象,对象的引用存放在栈里,而对象是存放在堆里的.可以看出栈在Java核心的重要位置.今天我们就继续深入Java核心这个系列, ...
- 【Java 虚拟机原理】线程栈 | 栈帧 | 局部变量表 | 反汇编字节码文件 | Java 虚拟机指令手册 | 程序计数器
文章目录 一.线程栈 二.栈帧 三.栈帧 - 局部变量表 四.反汇编字节码文件 五.Java 虚拟机指令手册 六.程序计数器 一.线程栈 装载 HelloWorld.class 字节码文件到 Java ...
- java 栈的变量_深入Java核心:JVM中的栈和局部变量
操作数栈和局部变量区一样,操作数栈也被组织成一个以字长为单位的数组.但和前者不同的是,它不是通过索引来访问的,而是通过入栈和出栈来访问的.可把操作数栈理解为存储计算时,临时数据的存储区域.下面我们通过 ...
- java数据库编程——执行查询操作(二)
[0]README 1) 本文部分文字描述和source code 均转自 core java volume 2 , 旨在理解 java数据库编程--执行查询操作(二) 的基础知识 : 2) 本文和 ...
- Java数据结构与算法解析(二)——栈
栈是限制插入和删除只能在一个位置上进行的表,该位置是表的末端,叫做栈顶.对栈的基本操作有push(进栈)和pop(出栈),对空栈进行push和pop,一般被认为栈ADT的一个错误.当push时空间用尽 ...
- 出栈(释放栈)和引用栈内数据意义不等同,和嵌套有关系但不是等同关系,局部变量进栈操作,不是局部变量自动带有进栈指令。汇编语言后局部变量操作是包含进栈操作指令PUSH和栈内地址存储数据调用,出栈。
出栈(释放栈)和引用栈内数据意义不等同,和嵌套有关系但不是等同关系,局部变量进栈操作,不是局部变量自动带有进栈指令.汇编语言后局部变量操作是包含进栈操作指令PUSH和栈内地址存储数据调用,出栈. 2. ...
- Java数据结构 利用双栈实现链表操作
利用双栈实现链表操作 class CQueue {private int count;private ListNode head;private ListNode tail;public CQueue ...
最新文章
- 华数软件测试岗位,重磅:字节跳动与华数共同研发的电视原创视频app已正式测试上线...
- Linux意外之rpm的删除与恢复
- 管理员必知:服务器基准测试方法与误区
- ssm(Spring+Spring mvc+mybatis)
- JavaScript-表单提交验证及前端密码MD5加密
- linux 网卡驱动安装
- 诗与远方:无题(三十四)- 曾经写给妹子的一首诗
- 开源 java CMS - FreeCMS2.5 标签 infoPage
- WebApi单元测试记录
- lcy mysql爆破_Lcy’s Blog
- python随机数据库_关于Python的随机数模块,你必须要掌握!-后台/架构/数据库-敏捷大拇指-一个敢保留真话的IT精英社区...
- Atitit. Atiposter 发帖机 新特性 poster new feature v11 .docx
- JSP编程,url中加斜杠和不加斜杠的区别
- 如何公众号运营好一个公众号
- 用VB实现的QQ自动登录器
- 微信绑定银行卡消息服务器,微信绑定了银行卡,如果不注意这个消息,可能会出现自动扣费...
- C语言中lwr是谁的缩写,C语言中关于字符串的操作(转)
- 台式计算机摄像头怎么打开,如何打开摄像头,教您Win7摄像头怎么打开
- 信号转换芯片-LT8911EXB MIPI CSI/DSI转EDP
- 金茂服务香港上市破发:大跌29% 公司市值52亿港元
热门文章
- Windows 10:开机显示C:\WINDOWS\system32\config\systemprofile\Desktop不可用 的解决方法
- nginx安装(正式)
- Chapter18-Export and Import Utilities
- 数组作为函数参数进行传递
- DataSet.Relations一例
- 使用stsadm命令部署和激活webpart解决方案
- WEB中会话跟踪[转]
- 使用Screen使SSH关闭后Meteor服务继续运行
- VC中的Attach和Detach
- SystemCenter2012SP1实践(27)VMM和HyperV的PowerShell