`
hlzhou
  • 浏览: 111691 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类

字节码指令集

 
阅读更多

字节码指令集

  Java虚拟机的指令由一个字节长度的、代表着某种特定操作含义的操作码(Opcode)以及跟随其后的零至多个代表此操作所需参数的操作数(Operands)所构成。

  对于大部分为与数据类型相关的字节码指令,他们的操作码助记符中都有特殊的字符来表明专门为哪种数据类型服务:i代表对int类型的数据操作,l代表long,s代表short,b代表byte,c代表char,f代表float,d代表double,a代表reference。

  加载和存储指令:

将一个局部变量加载到操作栈的指令包括有:iload、iload_<n>、lload、lload_<n>、fload、fload_<n>、dload、dload_<n>、aload、aload_<n>
将一个数值从操作数栈存储到局部变量表的指令包括有:istore、istore_<n>、lstore、lstore_<n>、fstore、fstore_<n>、dstore、dstore_<n>、astore、astore_<n>
将一个常量加载到操作数栈的指令包括有:bipush、sipush、ldc、ldc_w、ldc2_w、aconst_null、iconst_m1、iconst_<i>、lconst_<l>、fconst_<f>、dconst_<d>
扩充局部变量表的访问索引的指令:wide

  运算指令:

加法指令:iadd、ladd、fadd、dadd
减法指令:isub、lsub、fsub、dsub
乘法指令:imul、lmul、fmul、dmul
除法指令:idiv、ldiv、fdiv、ddiv
求余指令:irem、lrem、frem、drem
取反指令:ineg、lneg、fneg、dneg
位移指令:ishl、ishr、iushr、lshl、lshr、lushr
按位或指令:ior、lor
按位与指令:iand、land
按位异或指令:ixor、lxor
局部变量自增指令:iinc
比较指令:dcmpg、dcmpl、fcmpg、fcmpl、lcmp

  类型转换指令:

  Java虚拟机对于宽化类型转换直接支持,并不需要指令执行,包括:

int类型到long、float或者double类型
long类型到float、double类型
float类型到double类型

  窄化类型转换指令包括有:i2b、i2c、i2s、l2i、f2i、f2l、d2i、d2l和d2f。但是窄化类型转换很可能会造成精度丢失。

  对象创建与操作指令:

创建类实例的指令:new
创建数组的指令:newarray,anewarray,multianewarray
访问类字段(static字段,或者称为类变量)和实例字段(非static字段,或者成为实例变量)的指令:getfield、putfield、getstatic、putstatic
把一个数组元素加载到操作数栈的指令:baload、caload、saload、iaload、laload、faload、daload、aaload
将一个操作数栈的值储存到数组元素中的指令:bastore、castore、sastore、iastore、fastore、dastore、aastore
取数组长度的指令:arraylength
检查类实例类型的指令:instanceof、checkcast

  操作数栈管理指令:

  Java虚拟机提供了一些用于直接操作操作数栈的指令,包括:pop、pop2、dup、dup2、dup_x1、dup2_x1、dup_x2、dup2_x2和swap;

  控制转移指令:

条件分支:ifeq、iflt、ifle、ifne、ifgt、ifge、ifnull、ifnonnull、if_icmpeq、if_icmpne、if_icmplt, if_icmpgt、if_icmple、if_icmpge、if_acmpeq和if_acmpne。
复合条件分支:tableswitch、lookupswitch
无条件分支:goto、goto_w、jsr、jsr_w、ret

  方法调用和返回指令:

invokevirtual指令用于调用对象的实例方法,根据对象的实际类型进行分派(虚方法分派),这也是Java语言中最常见的方法分派方式。
invokeinterface指令用于调用接口方法,它会在运行时搜索一个实现了这个接口方法的对象,找出适合的方法进行调用。
invokespecial指令用于调用一些需要特殊处理的实例方法,包括实例初始化方法(§2.9)、私有方法和父类方法。
invokestatic指令用于调用类方法(static方法)。

而方法返回指令则是根据返回值的类型区分的,包括有ireturn(当返回值是boolean、byte、char、short和int类型时使用)、lreturn、freturn、dreturn和areturn,另外还有一条return指令供声明为void的方法、实例初始化方法、类和接口的类初始化方法使用

  抛出异常指令:

athrow

 

分享到:
评论

相关推荐

    java字节码指令集.docx

    Java字节码指令集是Java虚拟机(JVM)执行程序的基本单位,它构成了Java类文件的二进制表示形式。这些指令集控制了JVM如何解析和执行Java代码。在JVM中,程序的执行基于堆栈模型,其中每个线程都有自己的程序计数器...

    第2章:字节码指令集与解析举例.mmap

    第2章:字节码指令集与解析举例.mmap

    Java字节码指令集的使用详细

    Java字节码指令集是Java虚拟机(JVM)执行程序的基础,它是Java源代码经过编译后的二进制表示形式。每个字节码指令都由一个操作码(Opcode)和可能的操作数组成,用于控制JVM执行各种操作。本文将深入探讨Java字节码...

    JVM学习-字节码指令集(三)代码

    JVM学习-字节码指令集(三)代码

    Java字节码指令列表

    Java字节码指令集定义了一系列指令,用于控制JVM的行为,包括数据加载、存储、算术运算、跳转等。 #### 指令解析 下面将详细介绍部分Java字节码指令及其功能: ##### A 类型指令 这些指令主要涉及对象引用的加载和...

    字节码编程和操作系统等知识文档

    ASM是一个非常底层的字节码操作框架,它提供了直接操作字节码指令的API,因此使用ASM需要深入了解Java虚拟机规范和字节码指令集。ASM的操作比较接近于底层,因此性能较高,但是也相对复杂。Javassist提供了更高级的...

    java字节码文件反编译

    字节码指令集是二进制的,但它可以通过反编译转换为人类可读的控制流和数据操作。 在反编译过程中,`jd-gui`会尝试解析这些字节码指令,将其转换为等效的Java源代码语句。这涉及到理解如`GETSTATIC`、`...

    java字节码编辑器

    使用这样的工具需要具备一定的技术背景,包括Java虚拟机原理、字节码指令集以及可能的辅助工具,如JDK的`javap`命令用于查看字节码,或`jad`工具进行反编译。 总之,Java字节码编辑器是一个强大的工具,它为开发者...

    该项目主要是JAVA字节码的学习项目.zip

    3. **字节码指令集**:Java字节码指令集包括许多单字节或双字节的指令,如`aload_0`(加载局部变量0到操作数栈)、`iconst_1`(将整数1压入操作数栈)等。这些指令控制程序的流程,进行数据处理。 4. **字节码优化*...

    JVM指令集 PDF 下载

    JVM指令集,也称为字节码指令集,是一系列二进制编码的指令,每个指令都对应一个特定的操作。这些指令在Java源代码被编译成.class文件时生成,每个类文件包含了一个方法区、一个堆、一个栈以及若干个本地方法栈。...

    面向Java锁机制的字节码自动重构框架.zip

    字节码操作在Java中通常涉及Java虚拟机(JVM)和字节码指令集。字节码是Java源代码经过编译后的中间表示,JVM负责解释执行这些字节码指令。通过字节码操作,我们可以对程序进行运行时修改,如添加日志、性能监控,...

    javassist,Java字节码工程工具包.zip

    Javassist允许程序员在运行时动态修改类或创建新的类,而无需了解复杂的Java字节码指令集。通过提供一种类似于Java语法的API,它降低了字节码级别的编程难度,使得开发者能够更加直观地理解和构建字节码序列。 以下...

    “Dalvik VM的字节码”,“Dalvik VM指令格式”

    在Android 2.3.7中,Dalvik字节码指令集包括了大约256个不同的操作码。 例如,`move`指令用于在寄存器之间移动数据,操作码为0x00,它只需要两个参数,分别是源寄存器和目标寄存器。而`invoke-virtual`指令用于调用...

    ASM 字节码修改工具中文帮助手册

    - **字节码指令**: 提供了 Java 字节码指令集的完整列表。 - **子例程**: 介绍了 ASM 中如何处理循环和递归等子例程结构。 - **指引**: 给出了使用 ASM 进行字节码操作的最佳实践和技巧。 - **性能**: 讨论了 ASM 在...

    从Java代码到字节码(1)Java开发Java经验技巧共

    字节码指令集设计简洁且高效,包括操作码(opcode)和操作数,用于描述JVM应执行的操作。 3. **类加载机制**:JVM通过类加载器动态加载.class文件。加载过程包括加载、验证、准备、解析和初始化五个阶段,确保字节...

    java源码:JAVA字节码操作库 BCEL.zip

    开发者需要熟悉字节码指令集,理解类文件格式,以及如何正确地构造和修改字节码序列,以确保生成的代码符合规范且能正确执行。 总的来说,BCEL是一个用于Java字节码操作的重要工具,对于那些需要在运行时动态生成或...

    jvm-java字节码规则.pdf

    Java源代码在编译成.class文件时,会被编译器转换成JVM能够理解的字节码指令集。 Java字节码指令由一个字节的操作码(opcode)和多个字节的操作数(operand)组成。操作码指示了要执行的操作类型,而操作数则提供了...

    Android中修改运行时内存Dalvik字节码.rar

    5. ** 字节码操作**:理解Dalvik字节码指令集,如opcodes,以及如何通过ASM、BCEL、Janino等字节码操作库来生成和修改字节码。这在插桩、调试或者代码优化中非常有用。 6. ** 安全性考虑**:动态修改字节码可能涉及...

    Java字节码(.class文件)格式详解((转载)

    字节码指令集是JVM执行的指令单元,每个指令通常占一个字节,分为零操作码、操作数、变长操作码等形式。常见的指令有: - `aload_0`:加载局部变量表的第一个对象引用到操作数栈。 - `iconst_1`:将整数1压入...

Global site tag (gtag.js) - Google Analytics