最近看《Java并发编程的艺术》,涉及到一些硬件、JVM等知识,结合Java虚拟机知识,整理JVM指令集。
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 | 创建一个基本类型数组,并且其引用进栈 |
实战理解指令集
void onlyMe(Foo f) {
synchronized(f) {
doSomething() ;
}}
//生成字节码顺序
Method void onlyMe( Foo)
0 aload_1//将对象f入栈
1 dup//复制栈顶元素( 即f的引用)
2 astore_2//将栈顶元素存储到局部变量表Slot 2中
3 monitorenter//以栈顶元素( 即f) 作为锁, 开始同步
4 aload_0//将局部变量Slot 0( 即this指针) 的元素入栈
5 invokevirtual#5//调用doSomething( ) 方法
8 aload_2//将局部变量Slow 2的元素( 即f) 入栈
9 monitorexit//退出同步
10 goto 18//方法正常结束, 跳转到18返回
13 astore_3//从这步开始是异常路径, 见下面异常表的Taget 13
14 aload_2//将局部变量Slow 2的元素( 即f) 入栈
15 monitorexit//退出同步
16 aload_3//将局部变量Slow 3的元素( 即异常对象) 入栈
17 athrow//把异常对象重新抛出给onlyMe( ) 方法的调用者
18 return//方法正常返回
Exception table:
FromTo Target Type
4 10 13 any
13 16 13 any
操作数栈(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 |
总结:
- i开头的指令操作数类型是integer类型,l开头的指令操作数类型是long类型,f开头的指令操作数类型是float类型,d开头的指令操作数类型是double,a开头的指令操作数类型是引用类型(reference)。
- load类指令将数据从本地变量表加载到操作数栈,store类指令将数据从操作数栈存储到本地变量表中。其他的指令主要用于操作数栈。
JVM指令集(指令码、助记符、功能描述)
指令码 | 助记符 | 功能描述 | ||||||||||||||
0x00 | nop | 无操作 | ||||||||||||||
| ||||||||||||||||
0x01 | aconst_null |
指令格式: aconst_null
功能描述: null进栈。
注意:JVM并没有为null指派一个具体的值。 | ||||||||||||||
| ||||||||||||||||
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进栈 | ||||||||||||||
| ||||||||||||||||
0x10 | bipush | 将一个byte型常量值推送至栈顶 | ||||||||||||||
0x11 | sipush | 将一个short型常量值推送至栈顶 | ||||||||||||||
| ||||||||||||||||
0x12 | ldc | 将int、float或String型常量值从常量池中推送至栈顶 | ||||||||||||||
0x13 | ldc_w | 将int、float或String型常量值从常量池中推送至栈顶(宽索引) | ||||||||||||||
0x14 | ldc2_w | 将long或double型常量值从常量池中推送至栈顶(宽索引) | ||||||||||||||
| ||||||||||||||||
0x15 | iload | 指定的int型局部变量进栈 | ||||||||||||||
0x16 | lload | 指定的long型局部变量进栈 | ||||||||||||||
0x17 | fload | 指定的float型局部变量进栈 | ||||||||||||||
0x18 | dload | 指定的double型局部变量进栈 | ||||||||||||||
0x19 | aload |
指令格式: aload index
功能描述: 当前frame的局部变量数组中下标为index的引用型局部变量进栈
index : 无符号一byte整型。和wide指令联用,可以使index为两byte。
| ||||||||||||||
| ||||||||||||||||
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 | 指令格式:aload_0 该指令的行为类似于aload指令index为0的情况。 | ||||||||||||||
0x2B | aload_1 | 同上 | ||||||||||||||
0x2C | aload_2 | 同上 | ||||||||||||||
0x2D | aload_3 | 同上 | ||||||||||||||
| ||||||||||||||||
0x2E | iaload | 指定的int型数组的指定下标处的值进栈 | ||||||||||||||
0x2F | laload | 指定的long型数组的指定下标处的值进栈 | ||||||||||||||
0x30 | faload | 指定的float型数组的指定下标处的值进栈 | ||||||||||||||
0x31 | daload | 指定的double型数组的指定下标处的值进栈 | ||||||||||||||
0x32 | aaload |
指令格式: aaload
功能描述: 栈顶的数组下标(index)、数组引用(arrayref)出栈,并根据这两个数值取出对应的数组元素值(value)进栈。
抛出异常: 如果arrayref的值为null,会抛出NullPointerException。 如果index造成数组越界,会抛出ArrayIndexOutOfBoundsException。
index : int类型 arrayref : 数组的引用 | ||||||||||||||
0x33 | baload | 指定的boolean或byte型数组的指定下标处的值进栈 | ||||||||||||||
0x34 | caload | 指定的char型数组的指定下标处的值进栈 | ||||||||||||||
0x35 | saload | 指定的short型数组的指定下标处的值进栈 | ||||||||||||||
| ||||||||||||||||
0x36 | istore | 将栈顶int型数值存入指定的局部变量 | ||||||||||||||
0x37 | lstore | 将栈顶long型数值存入指定的局部变量 | ||||||||||||||
0x38 | fstore | 将栈顶float型数值存入指定的局部变量 | ||||||||||||||
0x39 | dstore | 将栈顶double型数值存入指定的局部变量 | ||||||||||||||
0x3A | astore |
指令格式: astore index
功能描述: 将栈顶数值(objectref)存入当前frame的局部变量数组中指定下标(index)处的变量中,栈顶数值出栈。
index : 无符号一byte整数。该指令和wide联用,index可以为无符号两byte整数。 | ||||||||||||||
| ||||||||||||||||
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 |
指令格式: astore_0
功能描述: 该指令的行为类似于astore指令index为0的情况。
| ||||||||||||||
0x4C | astore_1 | 同上 | ||||||||||||||
0x4D | astore_2 | 同上 | ||||||||||||||
0x4E | astore_3 | 同上 | ||||||||||||||
| ||||||||||||||||
0x4F | iastore | 将栈顶int型数值存入指定数组的指定下标处 | ||||||||||||||
0x50 | lastore | 将栈顶long型数值存入指定数组的指定下标处 | ||||||||||||||
0x51 | fastore | 将栈顶float型数值存入指定数组的指定下标处 | ||||||||||||||
0x52 | dastore | 将栈顶double型数值存入指定数组的指定下标处 | ||||||||||||||
0x53 | aastore |
指令格式: aastore
功能描述: 根据栈顶的引用型数值(value)、数组下标(index)、数组引用(arrayref)出栈,将数值存入对应的数组元素中。
抛出异常: 如果value的类型和arrayref所引用的数组的元素类型不兼容,会抛出抛出 ArrayStoreException。 如果index造成数组越界,会抛出ArrayIndexOutOfBoundsException。 如果arrayref值为null,会抛出NullPointerException。
arrayref : 必须是对数组的引用 index : int类型 value : 引用类型 | ||||||||||||||
0x54 | bastore | 将栈顶boolean或byte型数值存入指定数组的指定下标处 | ||||||||||||||
0x55 | castore | 将栈顶char型数值存入指定数组的指定下标处 | ||||||||||||||
0x56 | sastore | 将栈顶short型数值存入指定数组的指定下标处 | ||||||||||||||
| ||||||||||||||||
0x57 | pop | 栈顶数值出栈 (该栈顶数值不能是long或double型) | ||||||||||||||
0x58 | pop2 | 栈顶的一个(如果是long、double型的)或两个(其它类型的)数值出栈 | ||||||||||||||
| ||||||||||||||||
0x59 | dup | 复制栈顶数值,并且复制值进栈 | ||||||||||||||
0x5A | dup_x1 | 复制栈顶数值,并且复制值进栈2次 | ||||||||||||||
0x5B | dup_x2 | 复制栈顶数值,并且复制值进栈2次或3次 | ||||||||||||||
0x5C | dup2 | 复制栈顶一个(long、double型的)或两个(其它类型的)数值,并且复制值进栈 | ||||||||||||||
0x5D | dup2_x1 |
| ||||||||||||||
0x5E | dup2_x2 |
| ||||||||||||||
| ||||||||||||||||
0x5F | swap | 栈顶的两个数值互换(要求栈顶的两个数值不能是long或double型的) | ||||||||||||||
| ||||||||||||||||
0x60 | iadd | 栈顶两int型数值相加,并且结果进栈 | ||||||||||||||
0x61 | ladd | 栈顶两long型数值相加,并且结果进栈 | ||||||||||||||
0x62 | fadd | 栈顶两float型数值相加,并且结果进栈 | ||||||||||||||
0x63 | dadd | 栈顶两double型数值相加,并且结果进栈 | ||||||||||||||
| ||||||||||||||||
0x64 | isub | 栈顶两int型数值相减,并且结果进栈 | ||||||||||||||
0x65 | lsub | 栈顶两long型数值相减,并且结果进栈 | ||||||||||||||
0x66 | fsub | 栈顶两float型数值相减,并且结果进栈 | ||||||||||||||
0x67 | dsub | 栈顶两double型数值相减,并且结果进栈 | ||||||||||||||
| ||||||||||||||||
0x68 | imul | 栈顶两int型数值相乘,并且结果进栈 | ||||||||||||||
0x69 | lmul | 栈顶两long型数值相乘,并且结果进栈 | ||||||||||||||
0x6A | fmul | 栈顶两float型数值相乘,并且结果进栈 | ||||||||||||||
0x6B | dmul | 栈顶两double型数值相乘,并且结果进栈 | ||||||||||||||
| ||||||||||||||||
0x6C | idiv | 栈顶两int型数值相除,并且结果进栈 | ||||||||||||||
0x6D | ldiv | 栈顶两long型数值相除,并且结果进栈 | ||||||||||||||
0x6E | fdiv | 栈顶两float型数值相除,并且结果进栈 | ||||||||||||||
0x6F | ddiv | 栈顶两double型数值相除,并且结果进栈 | ||||||||||||||
| ||||||||||||||||
0x70 | irem | 栈顶两int型数值作取模运算,并且结果进栈 | ||||||||||||||
0x71 | lrem | 栈顶两long型数值作取模运算,并且结果进栈 | ||||||||||||||
0x72 | frem | 栈顶两float型数值作取模运算,并且结果进栈 | ||||||||||||||
0x73 | drem | 栈顶两double型数值作取模运算,并且结果进栈 | ||||||||||||||
| ||||||||||||||||
0x74 | ineg | 栈顶int型数值取负,并且结果进栈 | ||||||||||||||
0x75 | lneg | 栈顶long型数值取负,并且结果进栈 | ||||||||||||||
0x76 | fneg | 栈顶float型数值取负,并且结果进栈 | ||||||||||||||
0x77 | dneg | 栈顶double型数值取负,并且结果进栈 | ||||||||||||||
| ||||||||||||||||
0x78 | ishl | int型数值左移指定位数,并且结果进栈 | ||||||||||||||
0x79 | lshl | long型数值左移指定位数,并且结果进栈 | ||||||||||||||
| ||||||||||||||||
0x7A | ishr | int型数值带符号右移指定位数,并且结果进栈 | ||||||||||||||
0x7B | lshr | long型数值带符号右移指定位数,并且结果进栈 | ||||||||||||||
0x7C | iushr | int型数值无符号右移指定位数,并且结果进栈 | ||||||||||||||
0x7D | lushr | long型数值无符号右移指定位数,并且结果进栈 | ||||||||||||||
| ||||||||||||||||
0x7E | iand | 栈顶两int型数值按位与,并且结果进栈 | ||||||||||||||
0x7F | land | 栈顶两long型数值按位与,并且结果进栈 | ||||||||||||||
| ||||||||||||||||
0x80 | ior | 栈顶两int型数值按位或,并且结果进栈 | ||||||||||||||
0x81 | lor | 栈顶两long型数值按位或,并且结果进栈 | ||||||||||||||
| ||||||||||||||||
0x82 | ixor | 栈顶两int型数值按位异或,并且结果进栈 | ||||||||||||||
0x83 | lxor | 栈顶两long型数值按位异或,并且结果进栈 | ||||||||||||||
| ||||||||||||||||
0x84 | iinc | 指定int型变量增加指定值 | ||||||||||||||
| ||||||||||||||||
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 | 比较栈顶两引用型数值,当结果不相等时跳转 | ||||||||||||||
| ||||||||||||||||
0xA7 | goto | 无条件跳转 | ||||||||||||||
| ||||||||||||||||
0xA8 | jsr | 跳转至指定16位offset位置,并将jsr下一条指令地址压入栈顶 | ||||||||||||||
0xA9 | ret | 返回至局部变量指定的index的指令位置(通常与jsr、jsr_w联合使用) | ||||||||||||||
0xAA | tableswitch | 用于switch条件跳转,case值连续(可变长度指令) | ||||||||||||||
0xAB | lookupswitch | 用于switch条件跳转,case值不连续(可变长度指令) | ||||||||||||||
| ||||||||||||||||
0xAC | ireturn | 当前方法返回int | ||||||||||||||
0xAD | lreturn | 当前方法返回long | ||||||||||||||
0xAE | freturn | 当前方法返回float | ||||||||||||||
0xAF | dreturn | 当前方法返回double | ||||||||||||||
0xB0 | areturn |
指令格式: areturn
功能描述: 从方法中返回一个对象的引用。
抛出异常: 如果当前方法是 会抛出IllegalMonitorStateException。
objectref : 被返回的对象引用。 | ||||||||||||||
0xB1 | return | 当前方法返回void | ||||||||||||||
| ||||||||||||||||
0xB2 | getstatic | 获取指定类的静态域,并将其值压入栈顶 | ||||||||||||||
0xB3 | putstatic | 为指定的类的静态域赋值 | ||||||||||||||
0xB4 | getfield | 获取指定类的实例域,并将其值压入栈顶 | ||||||||||||||
0xB5 | putfield | 为指定的类的实例域赋值 | ||||||||||||||
| ||||||||||||||||
0xB6 | invokevirtual | 调用实例方法 | ||||||||||||||
0xB7 | invokespecial | 调用超类构造方法、实例初始化方法、私有方法 | ||||||||||||||
0xB8 | invokestatic | 调用静态方法 | ||||||||||||||
0xb9 | invokeinterface | 调用接口方法 | ||||||||||||||
| ||||||||||||||||
0xBA | --- | 因为历史原因,该码点为未使用的保留码点 | ||||||||||||||
| ||||||||||||||||
0xBB | new | 创建一个对象,并且其引用进栈 | ||||||||||||||
0xBC | newarray | 创建一个基本类型数组,并且其引用进栈 | ||||||||||||||
0xBD | anewarray |
指令格式: anewarray index1 index2
功能描述: 栈顶数值(count)作为数组长度,创建一个引用 型数组。栈顶数值出栈,数组引用进栈。
抛出异常: 如果count小于0,会抛出NegativeArraySizeException
count : int类型。 arrayref : 对所创建的数组的引用。 | ||||||||||||||
0xBE | arraylength |
指令格式: arraylength
功能描述: 栈顶的数组引用(arrayref)出栈,该数组的长度进栈。
抛出异常: 如果arrayref的值为null,会抛出NullPointerException。
arrayref : 数组引用 length : 数组长度 | ||||||||||||||
| ||||||||||||||||
0xBF | athrow |
指令格式: athrow
功能描述: 将栈顶的数值作为异常或错误抛出
抛出异常: 如果栈顶数值为null,则使用NullPointerException代替栈顶数 值抛出。 如果方法是的,则有可能抛出IllegalMonitorStateException。
objectref : Throwable或其子类的实例的引用。 | ||||||||||||||
0xC0 | checkcast | 类型转换检查,如果该检查未通过将会抛出ClassCastException异常 | ||||||||||||||
0xc1 | instanceof | 检查对象是否是指定的类的实例。如果是,1进栈;否则,0进栈 | ||||||||||||||
| ||||||||||||||||
0xC2 | monitorenter | 获得对象锁 | ||||||||||||||
0xC3 | monitorexit | 释放对象锁 | ||||||||||||||
| ||||||||||||||||
0xC4 | wide | 用于修改其他指令的行为 | ||||||||||||||
| ||||||||||||||||
0xC5 | multianewarray | 创建指定类型和维度的多维数组(执行该指令时,栈中必须包含各维度的长度值),并且其引用值进栈 | ||||||||||||||
| ||||||||||||||||
0xC6 | ifnull | 为null时跳转 | ||||||||||||||
0xC7 | ifnonnull | 不为null时跳转 | ||||||||||||||
0xC8 | goto_w | 无条件跳转(宽索引) | ||||||||||||||
0xC9 | jsr_w | 跳转至指定32位offset位置,并且jsr_w下一条指令地址进栈 | ||||||||||||||
| ||||||||||||||||
0xCA | breakpoint |
| ||||||||||||||
0xcb-0xfd | 未命名 | these values are currently unassigned for opcodes and are reserved for future use | ||||||||||||||
| ||||||||||||||||
0xFE | impdep1 |
| ||||||||||||||
0xFF | impdep2 |
|