一点JVM字节码指令介绍

220 阅读1分钟

Java虚拟机的指令由一个字节长度的、代表着某种特定操作含义的数字(操作码)以及跟随其后的零至多个代表此操作所需参数(操作数)构成。字节码指令集是一种具有鲜明特点、优劣势都很突出的指令集架构,由于限制了Java虚拟机操作码的长度为一个字节,所以指令集的操作码总数不可能超过256条。

加载和存储指令

  • 将一个局部变量加载到操作栈

    iload、iload_<n>、lload、lload_<n>、fload、fload_<n>、dload、dload_<n>、aload、aload_<n>
    
  • 将一个数值从操作数栈存储到局部变量表

    fstore、fstore_<n>、dstore、dstore_<n>、astore、astore_<n>、istore、istore_<n>、lstore、lstore_<n>
    
  • 将一个常量加载到操作数栈

    bipush、sipush、ldc、ldc_w、ldc2_w、aconst_null、iconst_ml、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、lshe、lushr
    
  • 按位或指令

    ior、lor
    
  • 按位与指令

    iand、land
    
  • 按位异或指令

    ixor、lxor
    
  • 局部变量自增指令

    iinc
    
  • 比较指令

    dcmpg、dcmpl、fcmpg、fcmpl、lcmp