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指令修改过的操作码。
分享到:
相关推荐
译者序 前言 第1章 Java体系结构介绍 ...第10章 栈和局部变量操作 第11章 类型转换 第12章 整数运算 第13章 逻辑运算 第14章 浮点运算 第15章 对象和数组 第16章 控制流 第17章 异常 第18章 finally子句
Java堆:局部变量表:操作数栈:帧数据区:栈上分配。
第10章 栈和局部变量操作 第11章 类型转换 第12章 整数运算 第13章 逻辑运算 第14章 浮点运算 第15章 对象和数组 第16章 控制流 第17章 异常 第18章 finally子句 第19章 方法的调用与返回 第20章 指令invokespecial ...
第10章 栈和局部变量操作 第11章 类型转换 第12章 整数运算 第13章 逻辑运算 第14章 浮点运算 第15章 对象和数组 第16章 控制流 第17章 异常 第18章 finally子句 第19章 方法的调用与返回 第20章 指令invokespecial ...
第10章 栈和局部变量操作 第11章 类型转换 第12章 整数运算 第13章 逻辑运算 第14章 浮点运算 第15章 对象和数组 第16章 控制流 第17章 异常 第18章 finally子句 第19章 方法的调用与返回 第20章 指令invokespecial ...
第3章详述如何将Java语言编写的程序转换为Java虚拟机指令集,涉及常量、局部变量、控制结构、算术运算、参数接收、方法调用、数组、操作数栈、异常处理、同步与注解等;第4章深入分析用来表示编译后的类和接口的...
asmsupport是一个字节码操作类库,它能够让程序员非常简单的在动态创建和修改类,该框架是基于asm开发的,不同与asm的是,它避免了直接操作jvm指令,栈和局部变量。这个模块包含了asmsupport使用的第三方依赖包的...
局部变量内存分配可能在栈上也可能在堆上 堆和栈的简单说明: 1.栈(操作系统):由操作系统自动分配释放 2.堆(操作系统): 一般由程序员分配释放,例如在c/c++中,在golang,java,python有自动的垃圾回收机制 ...
第10章 栈和局部变量操作 10.1 常量入栈操作 10.2 通用栈操作 10.3 把局部变量压入栈 10.4 弹出栈顶部元素,将其赋给局部变量 10.5 wide指令 10.6 一个模拟:“fibonacci forever” 10.7 随书光盘 ...
第10章 栈和局部变量操作 10.1 常量入栈操作 10.2 通用栈操作 10.3 把局部变量压入栈 10.4 弹出栈顶部元素,将其赋给局部变量 10.5 wide指令 10.6 一个模拟:“Fibonacci Forever” 10.7 随书光盘 10.8 资源...
第3章详述如何将Java语言编写的程序转换为Java虚拟机指令集,涉及常量、局部变量、控制结构、算术运算、参数接收、方法调用、数组、操作数栈异常处理、同步与注解等。第4章深入分析了用来表示编译后的类和接口的...
第3章详述如何将Java语言编写的程序转换为Java虚拟机指令集,涉及常量、局部变量、控制结构、算术运算、参数接收、方法调用、数组、操作数栈异常处理、同步与注解等。第4章深入分析了用来表示编译后的类和接口的...
局部变量表 操作数栈 动态连接 方法出口 本地方法栈 堆 方法区 JavaVirtualMachineError StackOverflowError OutOfMemoryError JVM PS:JVM部分参考了《深入理解Java虚拟机 - 第二版》(周志明). 个人认为《深入理解...
errorCompoundVariable.java 错误使用局部变量示例 factorial.java 求阶乘 Fibonacci.java 求Fiblnacci数列 GcdAndGcm.java 求最大公约数和最小公倍数 errorInit.java 演示变量初始化错误的程序 integer...
第10章 栈和局部变量操作 10.1 常量入栈操作 10.2 通用栈操作 10.3 把局部变量压入栈 10.4 弹出栈顶部元素,将其赋给局部变量 10.5 wide指令 10.6 一个模拟:“Fibonacci Forever” 10.7 随书光盘 ...
第3章详述如何将Java语言编写的程序转换为Java虚拟机指令集,涉及常量、局部变量、控制结构、算术运算、参数接收、方法调用、数组、操作数栈、异常处理、同步与注解等;第4章深入分析用来表示编译后的类和接口的...
栈和局部变量操作 将常量压入栈的指令 aconst_null 将null对象引用压入栈 iconst_m1 将int类型常量-1压入栈 iconst_0 将int类型常量0压入栈 iconst_1 将int类型常量1压入栈 iconst_2 将int类型常量2压入栈 iconst_3 ...
第3章详述如何将Java语言编写的程序转换为Java虚拟机指令集,涉及常量、局部变量、控制结构、算术运算、参数接收、方法调用、数组、操作数栈异常处理、同步与注解等。第4章深入分析了用来表示编译后的类和接口的...
第3章详述如何将Java语言编写的程序转换为Java虚拟机指令集,涉及常量、局部变量、控制结构、算术运算、参数接收、方法调用、数组、操作数栈、异常处理、同步与注解等;第4章深入分析用来表示编译后的类和接口的...
10 栈和局部变量操作Stack and Local Variable Operations 类型转换Type Conversion 12 整数运算Integer Arithmetic 13 逻辑运算Logic 14 浮点运算Floating-Point Arithmetic 15 对象和数组Objects and Arrays 16 ...