返回

JVM 指令码表解析:开启虚拟机运行的指令指南

后端

常量入栈指令

  • 指令码 0x01:aconst_null

    • 操作数:无

    • 将 null 值入栈。

  • 指令码 0x02:iconst_m1

    • 操作数:无

    • :将 -1(int)值入栈。

  • 指令码 0x03:iconst_0

    • 操作数:无

    • :将 0(int)值入栈。

  • 指令码 0x04:iconst_1

    • 操作数:无

    • 描述:将 1(int)值入栈。

  • 指令码 0x05:iconst_2

    • 操作数:无

    • 描述:将 2(int)值入栈。

  • 指令码 0x06:iconst_3

    • 操作数:无

    • 描述:将 3(int)值入栈。

  • 指令码 0x07:iconst_4

    • 操作数:无

    • 描述:将 4(int)值入栈。

  • 指令码 0x08:iconst_5

    • 操作数:无

    • 描述:将 5(int)值入栈。

加载指令

  • 指令码 0x15:iload

    • 操作数:局部变量索引

    • 描述:将指定索引的局部变量的值加载到栈顶。

  • 指令码 0x16:lload

    • 操作数:局部变量索引

    • 描述:将指定索引的局部变量的值加载到栈顶。

  • 指令码 0x17:fload

    • 操作数:局部变量索引

    • 描述:将指定索引的局部变量的值加载到栈顶。

  • 指令码 0x18:dload

    • 操作数:局部变量索引

    • 描述:将指定索引的局部变量的值加载到栈顶。

  • 指令码 0x19:aload

    • 操作数:局部变量索引

    • 描述:将指定索引的局部变量的值加载到栈顶。

存储指令

  • 指令码 0x36:istore

    • 操作数:局部变量索引

    • 描述:将栈顶的值存储到指定索引的局部变量中。

  • 指令码 0x37:lstore

    • 操作数:局部变量索引

    • 描述:将栈顶的值存储到指定索引的局部变量中。

  • 指令码 0x38:fstore

    • 操作数:局部变量索引

    • 描述:将栈顶的值存储到指定索引的局部变量中。

  • 指令码 0x39:dstore

    • 操作数:局部变量索引

    • 描述:将栈顶的值存储到指定索引的局部变量中。

  • 指令码 0x3a:astore

    • 操作数:局部变量索引

    • 描述:将栈顶的值存储到指定索引的局部变量中。

算术指令

  • 指令码 0x60:iadd

    • 操作数:无

    • 描述:将栈顶的两个 int 值相加,结果入栈。

  • 指令码 0x61:ladd

    • 操作数:无

    • 描述:将栈顶的两个 long 值相加,结果入栈。

  • 指令码 0x62:fadd

    • 操作数:无

    • 描述:将栈顶的两个 float 值相加,结果入栈。

  • 指令码 0x63:dadd

    • 操作数:无

    • 描述:将栈顶的两个 double 值相加,结果入栈。

  • 指令码 0x64:isub

    • 操作数:无

    • 描述:将栈顶的两个 int 值相减,结果入栈。

  • 指令码 0x65:lsub

    • 操作数:无

    • 描述:将栈顶的两个 long 值相减,结果入栈。

  • 指令码 0x66:fsub

    • 操作数:无

    • 描述:将栈顶的两个 float 值相减,结果入栈。

  • 指令码 0x67:dsub

    • 操作数:无

    • 描述:将栈顶的两个 double 值相减,结果入栈。

比较指令

  • 指令码 0x94:if_icmpeq

    • 操作数:偏移量

    • 描述:比较栈顶的两个 int 值是否相等,相等则跳转到偏移量处执行。

  • 指令码 0x95:if_icmpne

    • 操作数:偏移量

    • 描述:比较栈顶的两个 int 值是否不等,不等则跳转到偏移量处执行。

  • 指令码 0x96:if_icmplt

    • 操作数:偏移量

    • 描述:比较栈顶的两个 int 值是否小于,小于则跳转到偏移量处执行。

  • 指令码 0x97:if_icmpgt

    • 操作数:偏移量

    • 描述:比较栈顶的两个 int 值是否大于,大于则跳转到偏移量处执行。

  • 指令码 0x98:if_icmple

    • 操作数:偏移量

    • 描述:比较栈顶的两个 int 值是否小于或等于,小于或等于则跳转到偏移量处执行。

  • 指令码 0x99:if_icmpge

    • 操作数:偏移量

    • 描述:比较栈顶的两个 int 值是否大于或等于,大于或等于则跳转到偏移量处执行。

跳转指令

  • 指令码 0xa7:goto

    • 操作数:偏移量

    • 描述:无条件跳转到偏移量处执行。

  • 指令码 0xa8:jsr

    • 操作数:偏移量

    • 描述:无条件跳转到偏移量处执行,并将当前指令的下一条指令的地址压入栈顶。

  • 指令码 0xa9:ret

    • 操作数:偏移量

    • 描述:从当前方法返回,并跳转到调用该方法的指令的下一条指令处执行。

调用指令

  • 指令码 0xb8:invokevirtual

    • 操作数:方法签名

    • 描述:调用指定方法的虚方法版本。

  • 指令码 0xb9:invokespecial

    • 操作数:方法签名

    • 描述:调用指定方法的特殊方法版本。

  • 指令码 0xba:invokestatic

    • 操作数:方法签名

    • 描述:调用指定方法的静态方法版本。

返回指令

  • 指令码 0xb1:ireturn

    • 操作数:无

    • 描述:将栈顶的 int 值作为返回值,并从当前方法返回。

  • 指令码 0xb2:lreturn

    • 操作数:无

    • 描述:将栈顶的 long 值作为返回值,并从当前方法返回。

  • 指令码 0xb3:freturn

    • 操作数:无

    • 描述:将栈顶的 float 值作为返回值,并从当前方法返回。

  • 指令码 0xb4:dreturn

    • 操作数:无

    • 描述:将栈顶的 double 值作为返回值,并从当前方法返回。

  • 指令码 0xb5:areturn

    • 操作数:无

    • 描述:将栈顶的对象引用作为返回值,并从当前方法返回。

异常处理指令

  • 指令码 0xa7:athrow

    • 操作数:无

    • 描述:抛出栈顶的对象作为异常。

  • 指令码 0xa8: monitorenter

    • 操作数:无

    • 描述:进入对象监视器。

  • 指令码 0xa9: monitorexit

    • 操作数:无

    • 描述:退出对象监视器。