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
例如如下代码:
publicclassStackTest
{
/**
*
@paramargs
*/
publicstaticvoidmain(String[]
args) {
//TODOAuto-generated method
stub
Stringa;
Stringb;
a=
newString("aaa");
b=
newString("aaa");
}
}
用javap工具查看其字节码为:
Compiledfrom "StackTest.java"
publicclass StackTest extends java.lang.Object{
publicStackTest();
Code:
0: aload_0
1: invokespecial #8;//Method java/lang/Object."<init>":()V
4: return
publicstatic 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栈是一种基于后进先出(LIFO)原则的数据结构,它在计算机科学和编程中具有广泛的应用。本文将深入探讨Java中栈的实现以及其在实际应用中的使用。 首先,我们来理解栈的基本概念。栈是一种特殊类型的线性数据...
Java栈是Java虚拟机(JVM)内存模型的重要组成部分,主要负责存储方法调用过程中的局部变量、操作数和方法返回信息。栈的特点是后进先出(LIFO),每个线程都有自己的独立Java栈,确保了线程安全的数据存储。 1. **...
测试可能包括对局部变量的读写操作,以及涉及到同步机制如synchronized关键字,volatile修饰符,或者是使用ThreadLocal等技术来确保线程安全。 在标签中,“局部变量”、“线程”、“安全”、“测试”和“源码”是...
- **栈内存**:固定分配,大小在编译时确定,用于存储局部变量和方法调用信息。 ##### 2. 生命周期的比较 - **堆内存**:对象的生命周期不确定,由垃圾回收器决定何时回收。 - **栈内存**:变量的生命周期与方法的...
每个方法都对应一个栈桢,栈桢包含了方法的局部变量、操作数栈、方法返回地址等信息。在Java程序执行过程中,JVM会根据方法的调用关系创建和销毁栈桢。 二、栈桢的结构 栈桢的结构可以分为以下几个部分: * 局部...
栈是一种先进后出(LIFO,Last In First Out)的数据结构,主要用于存储方法调用时的信息,如局部变量、操作数栈、动态链接、方法出口等。Java中的栈具有以下特点: - **速度快**:栈的存取速度仅次于CPU寄存器,...
### Java中的堆和栈 #### 一、概述 在Java编程语言中,内存管理是非常重要的一个概念。Java程序运行时的内存主要分为两大区域:**堆内存**和**栈内存**。这两种内存区域有着各自独特的用途和管理机制,对理解和...
总的来说,Java函数调用涉及到内存的多个层次,包括堆上的对象分配、栈上的局部变量和操作数管理,以及帧数据区的组织。理解这些机制对于优化代码、排查问题以及提升程序性能至关重要。在实际开发中,熟练掌握这些...
在Java卡虚拟机中,Java栈用于存储计算过程中的局部变量和操作数。每个方法调用都会在Java栈上创建一个栈帧,包含方法的局部变量、操作数、返回地址等信息。Java栈的管理是解释器的重要职责,包括栈帧的分配、数据的...
当在代码中声明一个局部变量时,Java会在栈中为其分配空间。一旦变量超出其作用域,Java会自动释放相应的内存空间,以便其他变量使用。栈内存的存取速度非常快,仅次于CPU的寄存器,因为它的操作是线性的,不需要像...
1. **栈式存储分配**:栈式存储适用于已知大小的局部变量和方法参数。当一个方法被调用时,JVM会为该方法分配一块内存空间,这块空间用于存储方法的局部变量和参数;当方法执行完毕后,这块内存空间会被自动释放。 ...
译者序 前言 第1章 Java体系结构介绍 ...第10章 栈和局部变量操作 第11章 类型转换 第12章 整数运算 第13章 逻辑运算 第14章 浮点运算 第15章 对象和数组 第16章 控制流 第17章 异常 第18章 finally子句
### 堆和栈总结 #### 一、堆栈概念概览 在计算机科学中,堆和栈是非常重要的数据结构,它们在...通过熟悉栈帧的结构、局部变量区的特点以及操作数栈的工作方式,开发者能够更好地优化代码,提高程序的效率和稳定性。
在Java程序执行过程中,每当一个方法被调用时,都会在虚拟机栈中创建一个对应的栈帧,用于存储局部变量、操作数、动态链接、方法出口等信息。这个过程与方法的调用和返回紧密相关,栈帧的入栈和出栈顺序反映了方法...
栈则常用于函数调用,每次函数调用都会创建一个新的栈帧,保存局部变量和返回地址,当函数返回时,对应的栈帧会被弹出。 总的来说,理解和熟练运用Java中的队列、链表和栈对于编写高效的代码至关重要。通过深入学习...
- **函数调用**:每个函数调用都会在内存中创建一个栈帧,存储局部变量和返回地址,当函数执行完毕,对应的栈帧会被弹出。 4. **自定义栈实现** 虽然`java.util.Stack`提供了栈的功能,但有时我们可能需要更灵活...
总结来说,Java虚拟机栈是Java方法执行的核心,它通过栈帧管理每个方法的执行状态,包括局部变量、操作和返回地址。栈的特性使得它在处理递归调用和快速局部变量访问时非常高效。同时,了解其工作原理有助于优化程序...
栈内存主要负责存储程序运行过程中的局部变量,包括基本类型变量(如int、char)和对象的引用变量。在Java中,当函数执行时,这些变量会被分配到栈内存中。栈内存具有快速存取的特点,因为它的数据结构类似于一个...