`
程序员是怎么炼成的
  • 浏览: 33425 次
  • 性别: Icon_minigender_1
社区版块
存档分类
最新评论

jvm指令集

    博客分类:
  • java
阅读更多

转自:http://blog.csdn.net/hudashi/article/details/7062675#comments

 

 

 

将值推送至栈顶时 const ldc  push   load指令

const系列

该系列命令主要负责把简单的数值类型送到栈顶。(从常量池或者局部变量push到栈顶时均使用)

0x02         iconst_m1                   将int型(-1)推送至栈顶

0x03         iconst_0                      将int型(0)推送至栈顶

0x04         iconst_1                      将int型(1)推送至栈顶

0x05         iconst_2                      将int型(2)推送至栈顶

0x06         iconst_3                      将int型(3)推送至栈顶

0x07         iconst_4                      将int型(4)推送至栈顶

0x08         iconst_5                      将int型(5)推送至栈顶

0x09         lconst_0                      将long型(0)推送至栈顶

0x0a         lconst_1                      将long型(1)推送至栈顶

0x0b         fconst_0                      将float型(0)推送至栈顶

0x0c         fconst_1                      将float型(1)推送至栈顶

0x0d         fconst_2                      将float型(2)推送至栈顶

0x0e         dconst_0                     将double型(0)推送至栈顶

0x0f         dconst_1                     将double型(1)推送至栈顶

 

 

 

push系列

bipush将(-128~127)byet类型常量送至栈顶(从常量池?)

sipush将(-32768~32767)byet类型常量送至栈顶(从常量池?)

 

 

ldc系列

ldc             将int, float或String型常量值从常量池中推送至栈顶

ldc_w将int, float或String型常量值从常量池中推送至栈顶(宽索引)

ldc2_w将long或double型常量值从常量池中推送至栈顶(宽索引)

 

 

 

load系列

0x15          iload                          将指定的int型本地变量推送至栈顶

0x16          lload                          将指定的long型本地变量推送至栈顶

0x17          fload                          将指定的float型本地变量推送至栈顶

0x18          dload                         将指定的double型本地变量推送至栈顶

0x19          aload                         将指定的引用类型本地变量推送至栈顶

0x1a          iload_0                      将第一个int型本地变量推送至栈顶

0x1b          iload_1                      将第二个int型本地变量推送至栈顶

0x1c          iload_2                      将第三个int型本地变量推送至栈顶

0x1d          iload_3                      将第四个int型本地变量推送至栈顶

0x1e          lload_0                      将第一个long型本地变量推送至栈顶

0x1f           lload_1                      将第二个long型本地变量推送至栈顶

0x20          lload_2                      将第三个long型本地变量推送至栈顶

0x21          lload_3                      将第四个long型本地变量推送至栈顶

0x22          fload_0                     将第一个float型本地变量推送至栈顶

0x23          fload_1                     将第二个float型本地变量推送至栈顶

0x24          fload_2                     将第三个float型本地变量推送至栈顶

0x25          fload_3                     将第四个float型本地变量推送至栈顶

0x26         dload_0                     将第一个double型本地变量推送至栈顶

0x27         dload_1                     将第二个double型本地变量推送至栈顶

0x28         dload_2                     将第三个double型本地变量推送至栈顶

0x29         dload_3                     将第四个double型本地变量推送至栈顶

0x2a         aload_0                     将第一个引用类型本地变量推送至栈顶

0x2b         aload_1                     将第二个引用类型本地变量推送至栈顶

0x2c         aload_2                     将第三个引用类型本地变量推送至栈顶

0x2d         aload_3                     将第四个引用类型本地变量推送至栈顶

 

 

--

0x2e         iaload                     将int型数组指定索引的值推送至栈顶

0x2f          laload                     将long型数组指定索引的值推送至栈顶

0x30         faload                     将float型数组指定索引的值推送至栈顶

0x31        daload                     将double型数组指定索引的值推送至栈顶

0x32        aaload                     将引用型数组指定索引的值推送至栈顶

0x33        baload                     将boolean或byte型数组指定索引的值推送至栈顶

0x34        caload                     将char型数组指定索引的值推送至栈顶

0x35        saload                     将short型数组指定索引的值推送至栈顶

 

 

 

将栈顶的值赋给局部变量时 istore x   x为局部变量的索引

指令码    助记符                               说明

0x36         istore                    将栈顶int型数值存入指定本地变量

0x37         lstore                    将栈顶long型数值存入指定本地变量

0x38         fstore                    将栈顶float型数值存入指定本地变量

0x39         dstore                   将栈顶double型数值存入指定本地变量

0x3a         astore                   将栈顶引用型数值存入指定本地变量

0x3b         istore_0                将栈顶int型数值存入第一个本地变量

0x3c         istore_1                将栈顶int型数值存入第二个本地变量

0x3d         istore_2                将栈顶int型数值存入第三个本地变量

0x3e         istore_3                将栈顶int型数值存入第四个本地变量

0x3f          lstore_0                将栈顶long型数值存入第一个本地变量

0x40         lstore_1                将栈顶long型数值存入第二个本地变量

0x41         lstore_2                将栈顶long型数值存入第三个本地变量

0x42         lstore_3                将栈顶long型数值存入第四个本地变量

0x43         fstore_0                将栈顶float型数值存入第一个本地变量

0x44         fstore_1                将栈顶float型数值存入第二个本地变量

0x45         fstore_2                将栈顶float型数值存入第三个本地变量

0x46         fstore_3                将栈顶float型数值存入第四个本地变量

0x47         dstore_0               将栈顶double型数值存入第一个本地变量

0x48         dstore_1               将栈顶double型数值存入第二个本地变量

0x49         dstore_2               将栈顶double型数值存入第三个本地变量

0x4a         dstore_3               将栈顶double型数值存入第四个本地变量

0x4b         astore_0               将栈顶引用型数值存入第一个本地变量

0x4c         astore_1               将栈顶引用型数值存入第二个本地变量

0x4d        astore_2                将栈顶引用型数值存入第三个本地变量

0x4e        astore_3                将栈顶引用型数值存入第四个本地变量

 

 

 

 

 

通常push和 ldc后面跟的都是具体的值,load后面跟的是局部变量的索引

 

 

0xb2               getstatic                    获取指定类的静态域,并将其值压入栈顶

0xb3               putstatic                    用栈顶的值为指定的类的静态域赋值

0xb4               getfield                      获取指定类的实例域,并将其值压入栈顶

0xb5               putfield                       用栈顶的值为指定的类的实例域赋值

 

0xb6              invokevirtual                              调用实例方法

0xb7              invokespecial            调用超类构造方法,实例初始化方法,私有方法

0xb8              invokestatic                               调用静态方法

0xb9              invokeinterface                          调用接口方法

 

istore指令用于将操作数栈栈顶的值赋给局部变量表中的变量 

 

 

 

 

 

 

类型转化系列

该系列指令负责对栈顶数值类型进行类型转化,并把结果压入栈顶。

指令码         助记符                                           说明

0x85                 i2l                      将栈顶int型数值强制转换成long型数值并将结果压入栈顶

0x86                 i2f                      将栈顶int型数值强制转换成float型数值并将结果压入栈顶

0x87                 i2d                     将栈顶int型数值强制转换成double型数值并将结果压入栈顶

0x88                 l2i                      将栈顶long型数值强制转换成int型数值并将结果压入栈顶

0x89                 l2f                      将栈顶long型数值强制转换成float型数值并将结果压入栈顶

0x8a                 l2d                     将栈顶long型数值强制转换成double型数值并将结果压入栈顶

0x8b                 f2i                      将栈顶float型数值强制转换成int型数值并将结果压入栈顶

0x8c                 f2l                      将栈顶float型数值强制转换成long型数值并将结果压入栈顶

0x8d                 f2d                     将栈顶float型数值强制转换成double型数值并将结果压入栈顶

0x8e                 d2i                     将栈顶double型数值强制转换成int型数值并将结果压入栈顶

0x8f                  d2l                     将栈顶double型数值强制转换成long型数值并将结果压入栈顶

0x90                 d2f                     将栈顶double型数值强制转换成float型数值并将结果压入栈顶

0x91                 i2b                     将栈顶int型数值强制转换成byte型数值并将结果压入栈顶

0x92                 i2c                     将栈顶int型数值强制转换成char型数值并将结果压入栈顶

0x93                 i2s                     将栈顶int型数值强制转换成short型数值并将结果压入栈顶

 

 

 

 

 

0x94                 lcmp            比较栈顶两long型数值大小,并将结果(1,0,-1)压入栈顶

0x95                 fcmpl           比较栈顶两float型数值大小,并将结果(1,0,-1)压入栈顶;当其中一个数值为NaN时,将-1压入栈顶

0x96                 fcmpg         比较栈顶两float型数值大小,并将结果(1,0,-1)压入栈顶;当其中一个数值为NaN时,将1压入栈顶

0x97                 dcmpl      比较栈顶两double型数值大小,并将结果(1,0,-1)压入栈顶;当其中一个数值为NaN时,将-1压入栈顶

0x98                 dcmpg       比较栈顶两double型数值大小,并将结果(1,0,-1)压入栈顶;当其中一个数值为NaN时,将1压入栈顶

 

 

 

无条件跳转指令

 

指令码         助记符                                           说明

0x99                 ifeq                              当栈顶int型数值等于0时跳转

0x9a                 ifne                              当栈顶int型数值不等于0时跳转

0x9b                 iflt                                当栈顶int型数值小于0时跳转

0x9c                 ifge                              当栈顶int型数值大于等于0时跳转

0x9d                ifgt     当栈顶int型数值大于0时跳转

0x9e                ifle     当栈顶int型数值小于等于0时跳转

0x9f               if_icmpeq   比较栈顶两int型数值大小,当结果等于0时跳转

0xa0              if_icmpne   比较栈顶两int型数值大小,当结果不等于0时跳转

0xa1              if_icmplt   比较栈顶两int型数值大小,当结果小于0时跳转

0xa2              if_icmpge   比较栈顶两int型数值大小,当结果大于等于0时跳转

0xa3              if_icmpgt   比较栈顶两int型数值大小,当结果大于0时跳转

0xa4              if_icmple   比较栈顶两int型数值大小,当结果小于等于0时跳转

0xa5              if_acmpeq   比较栈顶两引用型数值,当结果相等时跳转

0xa6               if_acmpne   比较栈顶两引用型数值,当结果不相等时跳转

 

 

 

 

 

十四、无条件跳转指令系列A

该系列指令用于指令的跳转。

指令码         助记符                                           说明

0xa7                goto                                           无条件跳转

0xa8                  jsr                   跳转至指定16位offset位置,并将jsr下一条指令地址压入栈顶

0xa9                 ret                   返回至本地变量指定的index的指令位置(一般与jsr, jsr_w联合使用)

0xaa              tableswitch         用于switch条件跳转,case值连续(可变长度指令)

0xab              lookupswitch      用于switch条件跳转,case值不连续(可变长度指令)

 

 

 

指令码         助记符                                           说明

0xc0              checkcast                   检验类型转换,检验未通过将抛出ClassCastException

0xc1              instanceof                  检验对象是否是指定的类的实例,如果是将1压入栈顶,否则将0压入栈顶

0xc2              monitorenter               获得对象的锁,用于同步方法或同步块

0xc3              monitorexit                  释放对象的锁,用于同步方法或同步块

 

二十二、未归类系列C

此系列暂未归类。

指令码         助记符                                           说明

0xc4                wide                                               <待补充>

 

 

 

 

 

 

0xc6            ifnull                                           为null时跳转

0xc7           ifnonnull                                      不为null时跳转

二十五、无条件跳转指令系列B

该系列指令用于进行无条件指令跳转。

指令码      助记符                                           说明

0xc8           goto_w                                 无条件跳转(宽索引)

0xc9           jsr_w                         跳转至指定32位offset位置,并将jsr_w下一条指令地址压入栈顶

 

 

分享到:
评论

相关推荐

    JVM指令集.zip

    JVM指令集是JVM的核心组成部分,它定义了JVM能够理解和执行的一系列低级操作指令。这些指令构成了Java程序在运行时的微观世界,对理解JVM的工作原理至关重要。下面我们将深入探讨JVM指令集及其重要性。 1. **JVM...

    JVM指令集 PDF 下载

    本篇将深入探讨JVM指令集,帮助你更好地理解Java程序的内部工作原理。 JVM指令集,也称为字节码指令集,是一系列二进制编码的指令,每个指令都对应一个特定的操作。这些指令在Java源代码被编译成.class文件时生成,...

    JVM指令集.pdf

    JVM指令集是JVM的核心组成部分,用于定义和执行Java字节码。每条指令都是一个字节长度的操作码(opcode),后面跟着零个或多个操作数(operand),用于对JVM栈上的数据进行操作。 助记符是一种为指令提供的易于记忆...

    JVM指令集.docx

    以下是对JVM指令集的一些关键点的详细说明: 1. **常量压入栈的指令**:这些指令用于将基本类型的常量或null压入操作栈。例如,`iconst_1`将int类型的值1压入栈,`lconst_0`将long类型的值0压入栈,`aconst_null`则...

    JVM指令集

    ### JVM指令集详解 #### 一、aaload:数组元素加载指令 **操作说明:** `aaload` 是一个用于从引用类型数组中加载元素到操作数栈顶的操作。 **格式:** ``` aaload ``` **指令形式:** ``` aaload = 50 (0x32) `...

    jvm指令集.docx

    ### JVM指令集详解 #### 常量加载指令 在JVM执行代码的过程中,经常会遇到需要将特定的常量加载到操作数栈的情况。这部分内容主要介绍了如何将各种类型的常量值加载到栈中。 - **`aconst_null`**:此指令用于将`...

    JVM指令集(1).docx

    JVM指令集的设计是高度优化的,允许在不同平台上的高效运行。 在JVM指令集中,有一些关键的指令类别,包括: 1. **常量压入栈的指令**: - `aconst_null`:将null引用压入栈。 - `iconst_m1`至`iconst_5`:将int...

    深入理解Java代码执行过程--JVM 指令集

    深入理解Java代码执行过程--JVM 指令集

    JVM指令查询手册.pdf

    JVM指令集是JVM内部的工作语言,由一系列单字节的指令组成,每条指令都有特定的功能。这份“JVM指令查询手册”很可能包含了JVM的所有公共指令、它们的含义以及使用方式。下面,我们将深入探讨JVM指令集及其在Java...

    JVM指令手册.docx

    JVM指令集是JVM内部使用的微指令集合,这些指令构成了Java字节码的基础。在《JVM指令手册》中,主要涵盖了栈和局部变量的操作,这是理解JVM工作原理的关键部分。 1. 栈和局部变量操作: JVM使用栈来存储临时计算...

    JVM指令手册.pdf

    为了更好地理解Java程序在JVM中的执行流程,了解JVM指令集至关重要。本文档将详细介绍《JVM指令手册》中关于栈和局部变量操作的部分,涵盖常量压栈以及从栈中加载和存储值的相关指令。 #### 二、常量压栈指令 这...

    jvm指令手册

    JVM指令集是其内部工作原理的基础,每条指令都有特定的功能,用于构建和执行Java应用程序。下面我们将深入探讨JVM指令手册中的关键概念和知识点。 1. **字节码**:Java源代码编译后生成的是字节码文件(.class),...

    JVM指令手册.rar

    JVM指令集分为五大类:整数运算指令、浮点运算指令、对象处理指令、控制转移指令和本地变量操作指令。每条指令都有其特定的功能,它们共同构成了Java程序在JVM上运行的基石。 1. **整数运算指令**:这类指令主要...

    JVM指令查询手册.rar

    JVM指令集是JVM执行程序的基础,它包括了数十种不同的指令,这些指令涵盖了从基本的数据操作、控制流管理到对象创建和方法调用等各个方面。例如: 1. **数据操作指令**:如`iconst`系列用于加载常量整数值,`iload`...

    JVM中文指令手册.pdf

    1. JVM指令类型:JVM指令可以分为不同类型,包括将常量推送到操作数栈的指令(const系列指令),以及用于将单个数值(如int、long、float、double)推送到操作数栈的指令(iconst系列、lconst系列、fconst系列、d...

    00-JVM指令手册.zip

    下面将详细介绍JVM指令集及其相关知识点。 1. **JVM字节码**:Java源代码被编译成字节码,这是一种中间语言,由单个字节表示的指令组成。这些指令是平台无关的,可以在任何实现了JVM的平台上解释执行。 2. **操作...

    jvm指令手册 .pdf

    本手册推荐读者保存为本地文件,因为在阅读和实践中对JVM指令集进行深入研究,可以大大提升对Java程序执行机制的理解,进而提高编写、调试和优化Java代码的能力。通过这些指令的精确使用,开发者能够更细致地控制JVM...

    JAVA文件编译执行与虚拟机(JVM)介绍

    5. **JVM指令集体系结构**:包括JVM指令集的基本概念、指令集与不同CPU架构的关系,以及JVM指令集的组成结构。 #### JAVA文件的编译与执行过程详解 JAVA程序的执行过程主要分为三个阶段:源代码的编写、编译成字节...

Global site tag (gtag.js) - Google Analytics