JVM - 指令集大全

偏执的太偏执、 2023-01-15 13:24 172阅读 0赞

JVM基本指令

  • iconst_1 int型常量值1进栈
  • bipush 将一个byte型常量值推送至栈顶
  • iload_1 第二个int型局部变量进栈,从0开始计数
  • istore_1 将栈顶int型数值存入第二个局部变量,从0开始计数
  • iadd 栈顶两int型数值相加,并且结果进栈
  • return 当前方法返回void
  • getstatic 获取指定类的静态域,并将其值压入栈顶
  • putstatic 为指定的类的静态域赋值
  • invokevirtual 调用实例方法
  • invokespecial 调用超类构造方法、实例初始化方法、私有方法
  • invokestatic 调用静态方法
  • invokeinterface 调用接口方法
  • new 创建一个对象,并且其引用进栈
  • newarray 创建一个基本类型数组,并且其引用进栈

操作数栈(operand stack)相关

本地变量表(local variable table)到操作数栈(operand stack)

  • iload 将指定的int型本地变量推送至栈顶
  • iload_x 将第x个int型本地变量推送至栈顶,x范围:[0, 3]
  • lload 将指定的long型本地变量推送至栈顶
  • lload_x 将第x个long型本地变量推送至栈顶,x范围:[0, 3]
  • fload 将指定的float型本地变量推送至栈顶
  • fload_x 将第x个flaot型本地变量推送至栈顶,x范围:[0, 3]
  • dload 将指定的double型本地变量推送至栈顶
  • dload_x 将第x个double型本地变量推送至栈顶,x范围:[0, 3]
  • aload 将指定的引用类型本地变量推送至栈顶
  • aload_x 将第x个引用类型本地变量推送至栈顶,x范围:[0, 3]

操作数栈(operand stack)到本地变量表(local variable table)

  • istore 将栈顶int型数值存入指定本地变量
  • istore_x 将栈顶int型数值存入第x个本地变量,x范围:[0, 3]
  • lstore 将栈顶long型数值存入指定本地变量
  • lstore_x 将栈顶long型数值存入第x个本地变量,x范围:[0, 3]
  • fstore 将栈顶float型数值存入指定本地变量
  • fstore_x 将栈顶float型数值存入第x个本地变量,x范围:[0, 3]
  • dstore 将栈顶double型数值存入指定本地变量
  • dstore_x 将栈顶double型数值存入第x个本地变量,x范围:[0, 3]
  • astore 将栈顶引用类型存入指定本地变量
  • astore_x 将栈顶引用类型存入第x个本地变量,x范围:[0, 3]

常数(constant)到操作数栈(operand stack)

  • bipush 将单字节的常量值(-128~127)推送至栈顶
  • sipush 将一个短整型常量值(-32768~32767)推送至栈顶
  • ldc 将int, float或String型常量值从常量池中推送至栈顶
  • ldc_w 将int, float或String型常量值从常量池中推送至栈顶(宽索引)
  • aconst_null 将null推送至栈顶
  • iconst_m1 将int型-1推送至栈顶
  • iconst_x 将int型x推送至栈顶,x范围:[0, 5]
  • lconst_x 将long型x推送至栈顶,x范围:[0, 1]
  • fconst_x 将float型x推送至栈顶,x范围:[0, 1]
  • dconst_x 将double型x推送至栈顶,x范围:[0, 1]

将数组指定索引的数组推送至操作数栈(operand stack)

  • iaload 将int型数组指定索引的值推送至栈顶
  • laload 将long型数组指定索引的值推送至栈顶
  • faload 将float型数组指定索引的值推送至栈顶
  • daload 将double型数组指定索引的值推送至栈顶
  • aaload 将引用型数组指定索引的值推送至栈顶
  • baload 将boolean或byte型数组指定索引的值推送至栈顶
  • caload 将char型数组指定索引的值推送至栈顶
  • saload 将short型数组指定索引的值推送至栈顶

将操作数栈数存储到数组指定索引

  • iastore 将栈顶int型数值存入指定数组的指定索引位置
  • lastore 将栈顶long型数值存入指定数组的指定索引位置
  • fastore 将栈顶float型数值存入指定数组的指定索引位置
  • dastore 将栈顶double型数值存入指定数组的指定索引位置
  • aastore 将栈顶引用型数值存入指定数组的指定索引位置
  • bastore 将栈顶boolean或byte型数值存入指定数组的指定索引位置
  • castore 将栈顶char型数值存入指定数组的指定索引位置
  • sastore 将栈顶short型数值存入指定数组的指定索引位置

操作数栈其他相关

  • pop 将栈顶数值弹出 (数值不能是long或double类型的)
  • pop2 将栈顶的一个(long或double类型的)或两个数值弹出(其它)
  • dup 复制栈顶数值并将复制值压入栈顶
  • dup_x1 复制栈顶数值并将两个复制值压入栈顶
  • dup_x2 复制栈顶数值并将三个(或两个)复制值压入栈顶
  • dup2 复制栈顶一个(long或double类型的)或两个(其它)数值并将复制值压入栈顶
  • dup2_x1 复制栈顶2个数值,并压入栈顶2次
  • dup2_x2 复制栈顶2个数值,并压入栈顶3次
  • swap 将栈最顶端的两个数值互换(数值不能是long或double类型的)

运算相关

  • 加 iadd,ladd,fadd,dadd
  • 减 is,ls,fs,ds
  • 乘 imul,lmul,fmul,dmul
  • 除 idiv,ldiv,fdiv,ddiv
  • 余数 irem,lrem,frem,drem
  • 取负 ineg,lneg,fneg,dneg
  • 移位 ishl,lshr,iushr,lshl,lshr,lushr
  • 按位或 ior,lor
  • 按位与 iand,land
  • 按位异或 ixor,lxor
  • 类型转换 i2l,i2f,i2d,l2f,l2d,f2d(放宽数值转换);i2b,i2c,i2s,l2i,f2i,f2l,d2i,d2l,d2f(缩窄数值转换)

条件转移

  • 有条件转移 ifeq,iflt,ifle,ifne,ifgt,ifge,ifnull,ifnonnull,if_icmpeq,if_icmpene, if_icmplt,if_icmpgt,if_icmple,if_icmpge,if_acmpeq,if_acmpne,lcmp,fcmpl,fcmpg,dcmpl,dcmpg
  • 复合条件转移 tableswitch,lookupswitch
  • 无条件转移 goto,goto_w,jsr,jsr_w,ret

类和数组

  • 创建类 new
  • 创建新数组 newarray,anewarray,multianwarray
  • 访问类的域和类实例域 getfield,putfield,getstatic,putstatic
  • 获取数组长度 arraylength
  • 检相类实例或数组属性 instanceof,checkcast

其他指令

  • 调度对象的实例方法 invokevirtual
  • 调用由接口实现的方法 invokeinterface
  • 调用需要特殊处理的实例方法 invokespecial
  • 调用命名类中的静态方法 invokestatic
  • 方法返回 ireturn,lreturn,freturn,dreturn,areturn,return
  • 异常 athrow
  • finally关键字的实现使用 jsr,jsr_w,ret
  • synchronized锁 monitorenter,monitorexit

发表评论

表情:
评论列表 (有 0 条评论,172人围观)

还没有评论,来说两句吧...

相关阅读

    相关 JVM指令

    跳转到class文件目录,使用 javap -c StringTest.class -> p.txt 通过命令将编译后的文件输出到p.txt文件 栈和局部变量操作 将

    相关 JVM指令列表

    JVM加载class文件到底做了啥呢? 是如何识别呢? 如果让多操作系统能识别呢? 具体看下面流程: class -> 类加载器->jvm数据运行区\{java

    相关 JVM 指令概述

    一 点睛 Java 字节码对于虚拟机,就好像汇编语言对于计算机,属于基本执行指令。 Java 虚拟机的指令由一个字节长度的、代表着某种特定操作含义的数字(称为操作码,O

    相关 JVM指令

    指令码 助记符    说明 0x00 nop      什么都不做 0x01 aconst\_null 将null推送至栈顶 0x02 iconst\_m1   将