`

Java栈和局部变量操作(二)

 
阅读更多

2通用栈操作

操作码

操作数

说明

nop

(无)

不做任何操作

pop

(无)

从操作数栈弹出栈顶部的一个字

pop2

(无)

从操作数栈弹出最顶端的两个字

swap

(无)

交换栈顶部的两个字

dup

(无)

复制栈顶部的一个字

dup2

(无)

复制栈顶部的两个字

dup_x1

(无)

复制栈顶部的一个字,并将复制内容及原来弹出的两个字长的内容压入栈

dup_x2

(无)

复制栈顶部的一个字,并将复制内容及原来弹出的三个字长的内容压入栈

dup2_x1

(无)

复制栈顶部的两个字,并将复制内容及原来弹出的三个字长的内容压入栈

dup2_x2

(无)

复制栈顶部的两个字,并将复制内容及原来弹出的四个字长的内容压入栈

1dup:复制栈顶部的一个字长的内容。

栈:

前:......,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

后:.......

8pop2:弹出栈顶端两个字长的内容

:

前:......,word2,word1

后:.......

9swap:交换栈顶端两个字的内容

:

前:......,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

将位置为vindexint类型的局部变量压入栈

iload_0

()

将位置为0int类型的局部变量压入栈

iload_1

()

将位置为1int类型的局部变量压入栈

iload_2

()

将位置为2int类型的局部变量压入栈

iload_3

()

将位置为3int类型的局部变量压入栈

fload

vindex

将位置为vindexfloat类型的局部变量压入栈

fload_0

()

将位置为0float类型的局部变量压入栈

fload_1

()

将位置为1float类型的局部变量压入栈

fload_2

()

将位置为2float类型的局部变量压入栈

fload_3

()

将位置为3float类型的局部变量压入栈

将两个字长的局部变量压入栈

操作码

操作数

说明

lload

vindex

将位置为vindex(vindex+1)long类型的局部变量压入栈

lload_0

()

将位置为01long类型的局部变量压入栈

lload_1

()

将位置为12long类型的局部变量压入栈

lload_2

()

将位置为23long类型的局部变量压入栈

lload_3

()

将位置为34long类型的局部变量压入栈

dload

vindex

将位置为vindex(vindex+1)double类型的局部变量压入栈

dload_0

()

将位置为01double类型的局部变量压入栈

dload_1

()

将位置为12double类型的局部变量压入栈

dload_2

()

将位置为23double类型的局部变量压入栈

dload_3

()

将位置为34double类型的局部变量压入栈

将对象引用局部变量压入栈

操作码

操作数

说明

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类型值,然后将其存到位置为01的局部变量中

lstore_1

()

从栈中弹出long类型值,然后将其存到位置为12的局部变量中

lstore_2

()

从栈中弹出long类型值,然后将其存到位置为23的局部变量中

lstore_3

()

从栈中弹出long类型值,然后将其存到位置为34的局部变量中

dstore

vindex

从栈中弹出double类型值,然后将其存到位置为vindex(vindex+1)的局部变量中

dstore_0

()

从栈中弹出double类型值,然后将其存到位置为01的局部变量中

dstore_1

()

从栈中弹出double类型值,然后将其存到位置为12的局部变量中

dstore_2

()

从栈中弹出double类型值,然后将其存到位置为23的局部变量中

dstore_3

()

从栈中弹出double类型值,然后将其存到位置为34的局部变量中

操作码

操作数

说明

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 栈的实现和应用

    Java栈是一种基于后进先出(LIFO)原则的数据结构,它在计算机科学和编程中具有广泛的应用。本文将深入探讨Java中栈的实现以及其在实际应用中的使用。 首先,我们来理解栈的基本概念。栈是一种特殊类型的线性数据...

    Java栈详解Java栈详解.doc

    Java栈是Java虚拟机(JVM)内存模型的重要组成部分,主要负责存储方法调用过程中的局部变量、操作数和方法返回信息。栈的特点是后进先出(LIFO),每个线程都有自己的独立Java栈,确保了线程安全的数据存储。 1. **...

    局部变量线程安全测试

    测试可能包括对局部变量的读写操作,以及涉及到同步机制如synchronized关键字,volatile修饰符,或者是使用ThreadLocal等技术来确保线程安全。 在标签中,“局部变量”、“线程”、“安全”、“测试”和“源码”是...

    Java中堆内存与栈内存分配浅析

    - **栈内存**:固定分配,大小在编译时确定,用于存储局部变量和方法调用信息。 ##### 2. 生命周期的比较 - **堆内存**:对象的生命周期不确定,由垃圾回收器决定何时回收。 - **栈内存**:变量的生命周期与方法的...

    慢慢的回味.entry_point–JVM Java栈桢的创建1

    每个方法都对应一个栈桢,栈桢包含了方法的局部变量、操作数栈、方法返回地址等信息。在Java程序执行过程中,JVM会根据方法的调用关系创建和销毁栈桢。 二、栈桢的结构 栈桢的结构可以分为以下几个部分: * 局部...

    关于Java栈与堆的思考

    栈是一种先进后出(LIFO,Last In First Out)的数据结构,主要用于存储方法调用时的信息,如局部变量、操作数栈、动态链接、方法出口等。Java中的栈具有以下特点: - **速度快**:栈的存取速度仅次于CPU寄存器,...

    Java中的堆和栈

    ### Java中的堆和栈 #### 一、概述 在Java编程语言中,内存管理是非常重要的一个概念。Java程序运行时的内存主要分为两大区域:**堆内存**和**栈内存**。这两种内存区域有着各自独特的用途和管理机制,对理解和...

    函数如何调用:出入Java栈1

    总的来说,Java函数调用涉及到内存的多个层次,包括堆上的对象分配、栈上的局部变量和操作数管理,以及帧数据区的组织。理解这些机制对于优化代码、排查问题以及提升程序性能至关重要。在实际开发中,熟练掌握这些...

    Java卡Java卡虚拟机解释器Java栈异常处理[定义].pdf

    在Java卡虚拟机中,Java栈用于存储计算过程中的局部变量和操作数。每个方法调用都会在Java栈上创建一个栈帧,包含方法的局部变量、操作数、返回地址等信息。Java栈的管理是解释器的重要职责,包括栈帧的分配、数据的...

    Java 中的堆和栈

    当在代码中声明一个局部变量时,Java会在栈中为其分配空间。一旦变量超出其作用域,Java会自动释放相应的内存空间,以便其他变量使用。栈内存的存取速度非常快,仅次于CPU的寄存器,因为它的操作是线性的,不需要像...

    Java中堆内存和栈内存详解

    1. **栈式存储分配**:栈式存储适用于已知大小的局部变量和方法参数。当一个方法被调用时,JVM会为该方法分配一块内存空间,这块空间用于存储方法的局部变量和参数;当方法执行完毕后,这块内存空间会被自动释放。 ...

    深入JAVA虚拟机第二版.pdf 目录

    译者序 前言 第1章 Java体系结构介绍 ...第10章 栈和局部变量操作 第11章 类型转换 第12章 整数运算 第13章 逻辑运算 第14章 浮点运算 第15章 对象和数组 第16章 控制流 第17章 异常 第18章 finally子句

    堆和栈总结

    ### 堆和栈总结 #### 一、堆栈概念概览 在计算机科学中,堆和栈是非常重要的数据结构,它们在...通过熟悉栈帧的结构、局部变量区的特点以及操作数栈的工作方式,开发者能够更好地优化代码,提高程序的效率和稳定性。

    02.Java虚拟机栈1

    在Java程序执行过程中,每当一个方法被调用时,都会在虚拟机栈中创建一个对应的栈帧,用于存储局部变量、操作数、动态链接、方法出口等信息。这个过程与方法的调用和返回紧密相关,栈帧的入栈和出栈顺序反映了方法...

    java 队列 链表 栈

    栈则常用于函数调用,每次函数调用都会创建一个新的栈帧,保存局部变量和返回地址,当函数返回时,对应的栈帧会被弹出。 总的来说,理解和熟练运用Java中的队列、链表和栈对于编写高效的代码至关重要。通过深入学习...

    栈的java版演示栈的java版演示栈的java版演示

    - **函数调用**:每个函数调用都会在内存中创建一个栈帧,存储局部变量和返回地址,当函数执行完毕,对应的栈帧会被弹出。 4. **自定义栈实现** 虽然`java.util.Stack`提供了栈的功能,但有时我们可能需要更灵活...

    深入理解JVM-java虚拟机栈.docx

    总结来说,Java虚拟机栈是Java方法执行的核心,它通过栈帧管理每个方法的执行状态,包括局部变量、操作和返回地址。栈的特性使得它在处理递归调用和快速局部变量访问时非常高效。同时,了解其工作原理有助于优化程序...

    java栈与堆1

    栈内存主要负责存储程序运行过程中的局部变量,包括基本类型变量(如int、char)和对象的引用变量。在Java中,当函数执行时,这些变量会被分配到栈内存中。栈内存具有快速存取的特点,因为它的数据结构类似于一个...

Global site tag (gtag.js) - Google Analytics