JVM指令集(指令码助记符功能描述)
Posted 狼王不乖s
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JVM指令集(指令码助记符功能描述)相关的知识,希望对你有一定的参考价值。
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 以上是关于JVM指令集(指令码助记符功能描述)的主要内容,如果未能解决你的问题,请参考以下文章 |