logo资料库

中文版JVM指令手册.pdf

第1页 / 共33页
第2页 / 共33页
第3页 / 共33页
第4页 / 共33页
第5页 / 共33页
第6页 / 共33页
第7页 / 共33页
第8页 / 共33页
资料共33页,剩余部分请下载后查看
一、未归类系列A 此系列暂未归类。 指令码    助记符                            说明 0x00         nop                                什么都不做 0x01        aconst_null                   将null推送至栈顶 二、const系列 该系列命令主要负责把简单的数值类型送到栈顶。该系列命令不带参数。注意只把简单的数值类型送到栈 顶时,才使用如下的命令。 比如对应int型才该方式只能把-1,0,1,2,3,4,5(分别采用iconst_m1,iconst_0, iconst_1, iconst_2, iconst_3,  iconst_4, iconst_5) 送到栈顶。对于int型,其他的数值请使用push系列命令(比如bipush)。 指令码    助记符                            说明 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)推送至栈顶 0x0bfconst_0                      将float型(0)推送至栈顶 0x0c         fconst_1                      将float型(1)推送至栈顶 0x0d         fconst_2                      将float型(2)推送至栈顶 0x0edconst_0                     将double型(0)推送至栈顶 0x0f          dconst_1                     将double型(1)推送至栈顶 三、push系列 该系列命令负责把一个整形数字(长度比较小)送到到栈顶。该系列命令有一个 参数,用于指定要送到栈顶的数字。 注意该系列命令只能操作一定范围内的整形数值,超出该范围的使用将使用ldc 命令系列。 指令码    助记符                            说明 0x10          bipush    将单字节的常量值(-128~127)推送至栈顶 0x11           sipush    将一个短整型常量值(-32768~32767)推送至栈顶 四、ldc系列
该系列命令负责把数值常量或String常量值从常量池中推送至栈顶。该命令后面 需要给一个表示常量在常量池中位置(编号)的参数, 哪些常量是放在常量池呢?比如:final static int id=32768;final static float  double=6.5。 对于const系列命令和push系列命令操作范围之外的数值类型常量,都放在常量 池中. 另外,所有不是通过new创建的String都是放在常量池中的。 指令码    助记符                               说明 0x12            ldc                 将int, float或String型常量值从常量池中推送至栈 顶 0x13          ldc_w               将int, float或String型常量值从常量池中推送至栈 顶(宽索引) 0x14          ldc2_w             将long或double型常量值从常量池中推送至栈顶 (宽索引) 五、load系列 5.1、load系列A 该系列命令负责把本地变量的送到栈顶。这里的本地变量不仅可以是数值类型, 还可以是引用类型。 对于前四个本地变量可以采用iload_0,iload_1,iload_2,iload_3(它们分别表示第 0,1,2,3个整形变量)这种不到参数的简化命令形式。
对于第4以上的本地变量将使用iload命令这种形式,在它后面给一参数,以表示 是对第几个(从0开始)本类型的本地变量进行操作。 对本地变量所进行的编号,是对所有类型的本地变量进行的(并不按照类型分 类)。 对于非静态函数,第一变量是this,即其对于的操作是aload_0. 还有函数传入参数也算本地变量,在进行编号时,它是先于函数体的本地变量 的。 指令码    助记符                                        说明 0x15          iload                          将指定的int型本地变量推送至栈顶 0x16          lload                          将指定的long型本地变量推送至栈顶 0x17          fload                          将指定的float型本地变量推送至栈顶 0x18          dload                         将指定的double型本地变量推送至栈顶 0x19          aload                         将指定的引用类型本地变量推送至栈顶 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                     将第一个引用类型本地变量推送至栈顶 0x2b         aload_1                     将第二个引用类型本地变量推送至栈顶 0x2c         aload_2                     将第三个引用类型本地变量推送至栈顶 0x2d         aload_3                     将第四个引用类型本地变量推送至栈顶 5.2、load系列B
该系列命令负责把数组的某项送到栈顶。该命令根据栈里内容来确定对哪个数组 的哪项进行操作。 比如,如果有成员变量:final String names[]={"robin","hb"}; 那么这句话:String str=names[0];对应的指令为    17:aload_0                                                            //将this引用推送至栈 顶,即压入栈。    18:getfield#5; //Field names:[Ljava/lang/String;//将栈顶的指定的对象的 第5个实例域(Field)的值(这个值可能是引用,这里就是引用)压入栈顶    21:iconst_0                                                            //数组的索引值(下标) 推至栈顶,即压入栈    22:aaload                                                              //根据栈里内容来把 name数组的第一项的值推至栈顶    23:astore5                                                       //把栈顶的值存到str变量 里。因为str在我的程序中是其所在非静态函数的第5个变量(从0开始计数), 指令码    助记符                               说明 0x2e         iaload                     将int型数组指定索引的值推送至栈顶 0x2f          laload                     将long型数组指定索引的值推送至栈顶 0x30         faload                     将float型数组指定索引的值推送至栈顶 0x31        daload                     将double型数组指定索引的值推送至栈顶
0x32        aaload                     将引用型数组指定索引的值推送至栈顶 0x33        baload                     将boolean或byte型数组指定索引的值推送至 栈顶 0x34        caload                     将char型数组指定索引的值推送至栈顶 0x35        saload                     将short型数组指定索引的值推送至栈顶 六、store系列 6.1、store系列A 该系列命令负责把栈顶的值存入本地变量。这里的本地变量不仅可以是数值类 型,还可以是引用类型。 如果是把栈顶的值存入到前四个本地变量的话,采用的是istore_0,istore_1, istore_2,istore_3(它们分别表示第0,1,2,3个本地整形变量)这种不到参数的简 化命令形式。如果是把栈顶的值存入到第四个以上本地变量的话,将使用istore 命令这种形式,在它后面给一参数,以表示是把栈顶的值存入到第几个(从0开 始)本地变量中。 对本地变量所进行的编号,是对所有类型的本地变量进行的(并不按照类型分 类)。 对于非静态函数,第一变量是this,它是只读的. 还有函数传入参数也算本地变量,在进行编号时,它是先于函数体的本地变量 的。 指令码    助记符                               说明
0x36         istore                    将栈顶int型数值存入指定本地变量 0x37         lstore                    将栈顶long型数值存入指定本地变量 0x38         fstore                    将栈顶float型数值存入指定本地变量 0x39         dstore                   将栈顶double型数值存入指定本地变量 0x3a         astore                   将栈顶引用型数值存入指定本地变量 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型数值存入第三个本地变量
分享到:
收藏