-
Notifications
You must be signed in to change notification settings - Fork 0
Appendix A
Kumonda221 edited this page Jan 28, 2017
·
24 revisions
- (0x00 ~ 0x00) 占位区
- (0x01 ~ 0x14) 常量操作区
- (0x15 ~ 0x2D) 本地变量取操作区
- (0x2E ~ 0x35) 数组取操作区
- (0x36 ~ 0x4E) 本地变量存操作区
- (0x4F ~ 0x56) 数组存操作区
- (0x57 ~ 0x5F) 无操作数栈操作区
- (0x60 ~ 0x83) 数字运算操作区
- (0x84 ~ 0x84) 自增运算操作区
- (0x85 ~ 0x93) 数值类型转换操作区
- (0x94 ~ 0x98) 条件运算操作区
- (0x99 ~ 0x9E) 单操作数条件跳转操作区
- (0x9F ~ 0xA6) 双操作数条件跳转操作区
- (0xA7 ~ 0xA9) 无条件跳转操作区
- (0xAA ~ 0xAB) Switch跳转操作区
- (0xAC ~ 0xB1) 方法返回操作区
- (0xB2 ~ 0xB5) 域操作区
- (0xB6 ~ 0xBA) 方法调用操作区
- (0xBB ~ 0xC3) 对象操作区
- (0xC4 ~ 0xC9) 扩展指令区
- 保留占位区
| 指令 | 助记符 | 描述 |
|---|---|---|
| 0x00 | nop | 无操作 |
| 指令 | 助记符 | 描述 |
|---|---|---|
| 0x01 | aconst_null | 将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 | 将单字节的常量值(-128~127)推送至栈顶 |
| 0x11 | sipush | 将双字节的常量值(-32768~32767)推送至栈顶 |
| 0x12 | ldc | 将int,float或String型常量值从常量池中推送至栈顶 |
| 0x13 | ldc_w | 将int,float或String型常量值从常量池中推送至栈顶(使用宽池地址进行索引) |
| 0x14 | ldc2_w | 将long或double型常量值从常量池中推送至栈顶(使用宽池地址进行索引) |
| 指令 | 助记符 | 描述 |
|---|---|---|
| 0x15 | iload | 将指定索引的int型本地变量推送至栈顶 |
| 0x16 | lload | 将指定索引的long型本地变量推送至栈顶 |
| 0x17 | fload | 将指定索引的fload型本地变量推送至栈顶 |
| 0x18 | dload | 将指定索引的dload型本地变量推送至栈顶 |
| 0x19 | aload | 将指定索引的引用型本地变量推送至栈顶 |
| 0x1A | iload_0 | 将索引为0的int型本地变量推送至栈顶 |
| 0x1B | iload_1 | 将索引为1的int型本地变量推送至栈顶 |
| 0x1C | iload_2 | 将索引为2的int型本地变量推送至栈顶 |
| 0x1D | iload_3 | 将索引为3的int型本地变量推送至栈顶 |
| 0x1E | lload_0 | 将索引为0的long型本地变量推送至栈顶 |
| 0x1F | lload_1 | 将索引为1的long型本地变量推送至栈顶 |
| 0x20 | lload_2 | 将索引为2的long型本地变量推送至栈顶 |
| 0x21 | lload_3 | 将索引为3的long型本地变量推送至栈顶 |
| 0x22 | fload_0 | 将索引为0的float型本地变量推送至栈顶 |
| 0x23 | fload_1 | 将索引为1的float型本地变量推送至栈顶 |
| 0x24 | fload_2 | 将索引为2的float型本地变量推送至栈顶 |
| 0x25 | fload_3 | 将索引为3的float型本地变量推送至栈顶 |
| 0x26 | dload_0 | 将索引为0的double型本地变量推送至栈顶 |
| 0x27 | dload_1 | 将索引为1的double型本地变量推送至栈顶 |
| 0x28 | dload_2 | 将索引为2的double型本地变量推送至栈顶 |
| 0x29 | dload_3 | 将索引为3的double型本地变量推送至栈顶 |
| 0x2A | aload_0 | 将索引为0的引用型本地变量推送至栈顶 |
| 0x2B | aload_1 | 将索引为1的引用型本地变量推送至栈顶 |
| 0x2C | aload_2 | 将索引为2的引用型本地变量推送至栈顶 |
| 0x2D | aload_3 | 将索引为3的引用型本地变量推送至栈顶 |
注:此区指令依赖其索引可能抛出java.lang.ArrayIndexOutOfBoundsException
| 指令 | 助记符 | 描述 |
|---|---|---|
| 0x2E | iaload | 将int型数组中指定索引处的数值推送至栈顶 |
| 0x2F | laload | 将long型数组中指定索引处的数值推送至栈顶 |
| 0x30 | faload | 将float型数组中指定索引处的数值推送至栈顶 |
| 0x31 | daload | 将double型数组中指定索引处的数值推送至栈顶 |
| 0x32 | aaload | 将引用型数组中指定索引处的引用推送至栈顶 |
| 0x33 | baload | 将boolean或byte型数组中指定索引处的数值推送至栈顶 |
| 0x34 | caload | 将char型数组中指定索引处的数值推送至栈顶 |
| 0x35 | saload | 将short型数组中指定索引处的数值推送至栈顶 |
| 指令 | 助记符 | 描述 |
|---|---|---|
| 0x36 | istore | 将栈顶int型数值存入指定索引的本地变量 |
| 0x37 | lstore | 将栈顶long型数值存入指定索引的本地变量 |
| 0x38 | fstore | 将栈顶float型数值存入指定索引的本地变量 |
| 0x39 | dstore | 将栈顶double型数值存入指定索引的本地变量 |
| 0x3A | astore | 将栈顶引用存入指定索引的本地变量 |
| 0x3B | istore_0 | 将栈顶int型数值存入索引为0的本地变量 |
| 0x3C | istore_1 | 将栈顶int型数值存入索引为1的本地变量 |
| 0x3D | istore_2 | 将栈顶int型数值存入索引为2的本地变量 |
| 0x3E | istore_3 | 将栈顶int型数值存入索引为3的本地变量 |
| 0x3F | lstore_0 | 将栈顶long型数值存入索引为0的本地变量 |
| 0x40 | lstore_1 | 将栈顶long型数值存入索引为1的本地变量 |
| 0x41 | lstore_2 | 将栈顶long型数值存入索引为2的本地变量 |
| 0x42 | lstore_3 | 将栈顶long型数值存入索引为3的本地变量 |
| 0x43 | fstore_0 | 将栈顶float型数值存入索引为0的本地变量 |
| 0x44 | fstore_1 | 将栈顶float型数值存入索引为1的本地变量 |
| 0x45 | fstore_2 | 将栈顶float型数值存入索引为2的本地变量 |
| 0x46 | fstore_3 | 将栈顶float型数值存入索引为3的本地变量 |
| 0x47 | dstore_0 | 将栈顶double型数值存入索引为0的本地变量 |
| 0x48 | dstore_1 | 将栈顶double型数值存入索引为1的本地变量 |
| 0x49 | dstore_2 | 将栈顶double型数值存入索引为2的本地变量 |
| 0x4A | dstore_3 | 将栈顶double型数值存入索引为3的本地变量 |
| 0x4B | astore_0 | 将栈顶引用存入索引为0的本地变量 |
| 0x4C | astore_1 | 将栈顶引用存入索引为1的本地变量 |
| 0x4D | astore_2 | 将栈顶引用存入索引为2的本地变量 |
| 0x4E | astore_3 | 将栈顶引用存入索引为3的本地变量 |
注:此区指令依赖其索引可能抛出java.lang.ArrayIndexOutOfBoundsException
| 指令 | 助记符 | 描述 |
|---|---|---|
| 0x4F | iastore | 将栈顶int型数值存入int型数组的指定索引处 |
| 0x50 | lastore | 将栈顶long型数值存入long型数组的指定索引处 |
| 0x51 | fastore | 将栈顶float型数值存入float型数组的指定索引处 |
| 0x52 | dastore | 将栈顶double型数值存入double型数组的指定索引处 |
| 0x53 | aastore | 将栈顶引用型数值存入引用型数组的指定索引处 |
| 0x54 | bastore | 将栈顶boolean或byte型数值存入boolean或byte型数组的指定索引处 |
| 0x55 | castore | 将栈顶char型数值存入char型数组的指定索引处 |
| 0x56 | sastore | 将栈顶short型数值存入short型数组的指定索引处 |
| 指令 | 助记符 | 描述 |
|---|---|---|
| 0x57 | pop | 弹出栈顶数值(数值一定不是long型或double型的) |
| 0x58 | pop2 | 弹出栈顶两个数值(或一个long型或double型数值) |
| 0x59 | dup | 复制栈顶数值(数值一定不是long型或double型的)并压入栈顶 |
| 0x5A | dup_x1 | 复制栈顶数值(数值一定不是long型或double型的)并压入栈顶两次 |
| 0x5B | dup_x2 | 复制栈顶数值并复制后压入栈顶三次或两次 |
| 0x5C | dup2 | 复制栈顶两个数值(或一个long型或double型数值)并压入栈顶 |
| 0x5D | dup2_x1 | 复制跳过栈顶一个数值后的两个数值(或一个long型或double型数值)并压入栈顶 |
| 0x5E | dup2_x2 | 复制跳过栈顶两个数值(或一个long型或double型数值)后的两个数值(或一个long型或double型数值)并压入栈顶 |
| 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时跳转 |
注:双操作数指令中,栈顶元素作源操作数2,栈深为1处的元素作源操作数1
| 指令 | 助记符 | 描述 |
|---|---|---|
| 0x9F | if_icmpeq | 比较栈顶两int型数值大小,两值相等时跳转 |
| 0xA0 | if_icmpne | 比较栈顶两int型数值大小,两值不相等时跳转 |
| 0xA1 | if_icmplt | 比较栈顶两int型数值大小,源操作数1小于源操作数2时跳转 |
| 0xA2 | if_icmpge | 比较栈顶两int型数值大小,源操作数1大于等于源操作数2时跳转 |
| 0xA3 | if_icmpgt | 比较栈顶两int型数值大小,源操作数1大于源操作数2时跳转 |
| 0xA4 | if_icmple | 比较栈顶两int型数值大小,源操作数1小于等于源操作数2时跳转 |
| 0xA5 | if_acmpeq | 比较栈顶两引用型,若引用相同则跳转 |
| 0xA6 | if_acmpne | 比较栈顶两引用型,若引用不相同则跳转 |
jsr、ret指令在Java7后已被弃置
| 指令 | 助记符 | 描述 |
|---|---|---|
| 0xA7 | goto | 无条件跳转 |
| 0xA8 | jsr | 跳转至指定单字索引位置,并将下一条指令相对地址压入栈顶 |
| 0xA9 | ret | 返回至本地变量指定的索引位置 |
| 指令 | 助记符 | 描述 |
|---|---|---|
| 0xAA | tableswitch | 用于线性的case值条件跳转 |
| 0xAB | lookupswitch | 用于非线性的case值条件跳转 |
| 指令 | 助记符 | 描述 |
|---|---|---|
| 0xAC | ireturn | 从当前方法返回int型数值 |
| 0xAD | lreturn | 从当前方法返回long型数值 |
| 0xAE | freturn | 从当前方法返回float型数值 |
| 0xAF | dreturn | 从当前方法返回double型数值 |
| 0xB0 | areturn | 从当前方法返回对象引用 |
| 0xB1 | return | 无返回值跳出方法 |
| 指令 | 助记符 | 描述 |
|---|---|---|
| 0xB2 | getstatic | 获取指定类的静态域并把值压入栈顶 |
| 0xB3 | putstatic | 将栈顶的值存入指定类的静态域 |
| 0xB4 | getfield | 获取指定引用的实例域并把值压入栈顶 |
| 0xB5 | putfield | 将栈顶的值存入指定引用的实例域 |
| 指令 | 助记符 | 描述 |
|---|---|---|
| 0xB6 | invokevirtual | 调用实例方法 |
| 0xB7 | invokespecial | 特殊调用(超类构造方法、实例构造函数、私有方法) |
| 0xB8 | invokestatic | 调用静态方法 |
| 0xB9 | invokeinterface | 调用接口方法 |
| 0xBA | invokedynamic | 调用动态方法 |
注:原始类型(Primitive type)是指所有非对象的类型, 比如 short, int, long, double 等
| 指令 | 助记符 | 描述 |
|---|---|---|
| 0xBB | new | 分配一个未初始化对象,并将其引用推入栈顶 |
| 0xBC | newarray | 分配一个指定原始类型的数组,并将其引用推入栈顶 |
| 0xBD | anewarray | 分配一个指定非原始类型的数组,并将其引用推入栈顶 |
| 0xBE | arraylength | 获得数组长度并压入栈顶 |
| 0xBF | athrow | 抛出栈顶异常引用 |
| 0xC0 | checkcast | 检查类型,若类型不符合要求则抛出java.lang.ClassCastException
|
| 0xC1 | instanceof | 检查类型,若类型符合要求则将1压入栈顶,反则将0压入栈顶 |
| 0xC2 | monitorenter | 获得对象锁 |
| 0xC3 | monitorexit | 释放对象锁 |
| 指令 | 助记符 | 描述 |
|---|---|---|
| 0xC4 | wide | 扩展索引宽度 |
| 0xC5 | multianewarray | 创建指定类型和指定维度的多维数组,并将其引用压入栈顶 |
| 0xC6 | ifnull | 栈顶引用为null时跳转 |
| 0xC7 | ifnonnull | 栈顶引用不为null时跳转 |
| 0xC8 | goto_w | 宽索引的goto
|
| 0xC9 | jsr_w | 宽索引的jsr
|
注:此区指令一般只被调试器或其他特殊情况所用,不应该在正式编译的class文件中出现
理论上 0xCB ~ 0xFD 的空区都可被调试器及其他特殊情况利用,但不能保证以后版本的VM不会添加更多指令
所以官方保留了三条指令
| 指令 | 助记符 | 描述 |
|---|---|---|
| 0xCA | breakpoint | |
| 0xFE | impdep1 | |
| 0xFF | impdep2 |